抓取論壇、貼吧這種多分頁的信息時,沒接觸scrapy以前,是前肯定有多少頁,使用for循環抓取。這方法略顯笨重,使用scrapy則能夠直接組合下一頁的連接,而後傳給request持續進行抓取,一直到沒有下一頁連接爲止。css
仍是以官方教程的網站爲例子,先分析下元素:mongodb
能夠看到下一頁的標籤:數據庫
<a href="/page/2/">Next <span aria-hidden="true">→</span></a>
其中的href屬性值/page/2與www.quotes.toscrape.com組合起來就是下一頁的網址,同理第二頁next的href屬性值組合起來就是第三頁,所以只要咱們判斷出是否有下一頁的關鍵字,就能夠進行持續抓取。數組
上代碼:scrapy
import scrapy class myspider(scrapy.Spider): # 設置爬蟲名稱 name = "get_quotes" # 設置起始網址 start_urls = ['http://quotes.toscrape.com'] def parse(self, response): #使用 css 選擇要素進行抓取,若是喜歡用BeautifulSoup之類的也能夠 #先定位一整塊的quote,在這個網頁塊下進行做者、名言,標籤的抓取 for quote in response.css('.quote'): yield { 'author' : quote.css('small.author::text').extract_first(), 'tags' : quote.css('div.tags a.tag::text').extract(), 'content' : quote.css('span.text::text').extract_first() } # 使用xpath獲取next按鈕的href屬性值 next_href = response.xpath('//li[@class="next"]/a/@href').extract_first() # 判斷next_page的值是否存在 if next_href is not None: # 若是下一頁屬性值存在,則經過urljoin函數組合下一頁的url: # www.quotes.toscrape.com/page/2 next_page = response.urljoin(next_href) #回調parse處理下一頁的url yield scrapy.Request(next_page,callback=self.parse)
下面是處理結果:
編輯器
能夠看到一直抓取了10頁,此網站也只有10頁
ide
整個網站的名人名言就所有抓取到了,是否是很方便函數
如今只是把抓取獲得的只是打印到屏幕上,並無存儲起來,接下來咱們使用Mongodb進行存儲,mongodb的優勢可自行google,這裏就不說了。從官網下載,參考官方安裝教程進行配置安裝。網站
要使用Mongodb須要pymongo,直接pip install pymongo
先演示下直接存儲,當作Mongodb存儲例子,實際不推薦這麼使用:google
import scrapy # 導入pymongo import pymongo class myspider(scrapy.Spider): # 設置爬蟲名稱 name = "get_quotes" # 設置起始網址 start_urls = ['http://quotes.toscrape.com'] # 配置client,默認地址localhost,端口27017 client = pymongo.MongoClient('localhost',27017) # 建立一個數據庫,名稱store_quote db_name = client['store_quotes'] # 建立一個表 quotes_list = db_name['quotes'] def parse(self, response): #使用 css 選擇要素進行抓取,若是喜歡用BeautifulSoup之類的也能夠 #先定位一整塊的quote,在這個網頁塊下進行做者、名言,標籤的抓取 for quote in response.css('.quote'): # 將頁面抓取的數據存入mongodb,使用insert yield self.quotes_list.insert({ 'author' : quote.css('small.author::text').extract_first(), 'tags' : quote.css('div.tags a.tag::text').extract(), 'content' : quote.css('span.text::text').extract_first() }) # 使用xpath獲取next按鈕的href屬性值 next_href = response.xpath('//li[@class="next"]/a/@href').extract_first() # 判斷next_page的值是否存在 if next_href is not None: # 若是下一頁屬性值存在,則經過urljoin函數組合下一頁的url: # www.quotes.toscrape.com/page/2 next_page = response.urljoin(next_href) #回調parse處理下一頁的url yield scrapy.Request(next_page,callback=self.parse)
若是使用的是pycharm編輯器,有一個mongodb插件,能夠方便的查看數據庫,Mongo plugin,在plugin裏面添加
添加以後,重啓pycharm,能夠在setting -> other setting裏面看到Mongo Servers,點擊Mongo servers配置mongodb:
Label隨意填寫,server url已經有默認,test一下,鏈接成功確認便可,完成以後,可在pycharm左側看到插件mongo explorer,點擊展開可看到數據庫。
OK運行一下咱們的代碼,
scrapy crawl get_quotes
而後刷新下數據庫,可看到數據已經保存到mongodb中了
查看數據庫內容:
很清晰,每一項都有保存