前面介紹的scrapy爬蟲只能爬取單個網(wǎng)頁。如果我們想爬取多個網(wǎng)頁。比如網(wǎng)上的小說該如何如何操作呢。比如下面的這樣的結(jié)構(gòu)。是小說的第一篇。可以點擊返回目錄還是下一頁
對應(yīng)的網(wǎng)頁代碼:
我們再看進入后面章節(jié)的網(wǎng)頁,可以看到增加了上一頁
對應(yīng)的網(wǎng)頁代碼:
通過對比上面的網(wǎng)頁代碼可以看到. 上一頁,目錄,下一頁的網(wǎng)頁代碼都在
最終得到生成的網(wǎng)頁鏈接。并調(diào)用Request重新申請這個網(wǎng)頁的數(shù)據(jù)
那么在pipelines.py的文件中。我們同樣需要修改下存儲的代碼。如下。可以看到在這里就不是用json. 而是直接打開txt文件進行存儲
完整的代碼如下:在這里需要注意兩次yield的用法。第一次yield后會自動轉(zhuǎn)到Test1Pipeline中進行數(shù)據(jù)存儲,存儲完以后再進行下一次網(wǎng)頁的獲取。然后通過Request獲取下一次網(wǎng)頁的內(nèi)容
對于自動爬取網(wǎng)頁scrapy有個更方便的方法:CrawlSpider
前面介紹到的Spider中只能解析在start_urls中的網(wǎng)頁。雖然在上一章也實現(xiàn)了自動爬取的規(guī)則。但略顯負責(zé)。在scrapy中可以用CrawlSpider來進行網(wǎng)頁的自動爬取。
爬取的規(guī)則原型如下:
class scrapy.contrib.spiders.Rule (link_extractor,?callback=None,?cb_kwargs=None,?follow=None,process_links=None,?process_request=None)
LinkExtractor.:它的作用是定義了如何從爬取到的的頁面中提取鏈接
Callback指向一個調(diào)用函數(shù),每當(dāng)從LinkExtractor獲取到鏈接時將調(diào)用該函數(shù)進行處理,該回調(diào)函數(shù)接受一個response作為第一個參數(shù)。注意:在用CrawlSpider的時候禁止用parse作為回調(diào)函數(shù)。因為CrawlSpider使用parse方法來實現(xiàn)邏輯,因此如果使用parse函數(shù)將會導(dǎo)致調(diào)用失敗
Follow是一個判斷值,用來指示從response中提取的鏈接是否需要跟進
在scrapy shell中提取www.sina.com.cn為例
LinkExtractor中的allow只針對href屬性:
例如下面的鏈接只針對href屬性做正則表達式提取
結(jié)構(gòu)如下:可以得到各個鏈接。
可以通過restrict_xpaths對各個鏈接加以限制,如下的方法:
實例2:還是以之前的迅讀網(wǎng)為例
提取網(wǎng)頁中的下一節(jié)的地址:
網(wǎng)頁地址:
http://www.xunread.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/1.shtml
?下一頁的的相對URL地址為2.shtml。
通過如下規(guī)則提取出來
>>> item=LinkExtractor(allow=('\d\.shtml')).extract_links(response)
>>> for i in item:
...?? print i.ur
...
http://www.xunread.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/2.shtml
也通過導(dǎo)航頁面直接獲取所有章節(jié)的鏈接:
C:\Users\Administrator>scrapy shell http://www.xunread.com/article/8c39f5a0-ca54
-44d7-86cc-148eee4d6615/index.shtml
?
from scrapy.linkextractors import LinkExtractor
?
>>> item=LinkExtractor(allow=('\d\.shtml')).extract_links(response)
>>> for i in item:
...?? print i.url
得到如下全部的鏈接
那么接下來構(gòu)造在scrapy中的代碼,如下
關(guān)鍵的是rules=(Rule(LinkExtractor(allow=( '\d\.shtml' )),callback= 'parse_item' ,follow=True),) 這個里面規(guī)定了提取網(wǎng)頁的規(guī)則。以上面的例子為例。爬取的過程分為如下幾個步驟:
1 從 http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/1.shtml 開始,第一調(diào)用parse_item ,用xpath 提取網(wǎng)頁內(nèi)容,然后用Rule 提取網(wǎng)頁規(guī)則,在這里提取到2.shtml 。
2? 進入2.shtml.進入2.shtml 后再重復(fù)運行第一步的過程。直到Rules 中提取不到任何規(guī)則
我們也可以做一下優(yōu)化,設(shè)置start_urls 為頁面索引頁面
http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/index.shtml
這樣通過Rule 可以一下提取出所有的鏈接。然后對每個鏈接調(diào)用parse_item 進行網(wǎng)頁信息提取。這樣的效率比從1.shtml 要高效很多。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

