scrapy CrawlSpider解析

CrawlSpider繼承自Spider, CrawlSpider主要用於有規則的url進行爬取。css

先來講說它們的設計區別:web

 SpiderSpider 類的設計原則是隻爬取 start_urls 中的url,而 CrawlSpider 類定義了一些規則 rules 來提供跟進連接 link 的方便機制,從爬取的網頁中獲取link並繼續跟進的工做。正則表達式

先來看看剛建立一個crawlSpider的爬蟲  -t 指定模板爲crawlSpiderdom

scrapy genspider -t crawl cf circ.gov.cn

 

 

 LinkExtractor 的源碼:scrapy

from scrapy.linkextractors import LinkExtractor

 allow :知足括號中」正則表達式」的值會被提取,若是爲空,則所有匹配。ide

 deny :與這個正則表達式(或正則表達式列表)不匹配的url必定不提取函數

 allow_domain:會被提取的鏈接的domainspost

 deny_domains :必定不會被提取連接的domains。url

 restrict_xpaths :使用xpath表達式,和allow共同做用過濾連接。
 restrict_css :使用css選擇器spa

 

在CrawlSpider源碼中最早定義的是類Rule:Rule對象是一個爬取規則的類

 link_extractor :是一個Link Extractor對象。其定義瞭如何從爬取到的頁面提取連接。

 callback :是一個callable或string(該Spider中同名的函數將會被調用)。從link_extractor中每獲取到連接時將會調用該函數。該回調函數接收一個response做爲其第一個參數,並返回一個包含Item以及Request對象(或者這二者的子類)的列表。

 cb_kwargs :包含傳遞給回調函數的參數(keyword argument)的字典。

 follow :是一個boolean值,指定了根據該規則從response提取的連接是否須要跟進。若是callback爲None,follow默認設置True,不然默認False。

 process_links :是一個callable或string(該Spider中同名的函數將會被調用)。從link_extrator中獲取到連接列表時將會調用該函數。該方法主要是用來過濾。

 process_request :是一個callable或string(該spider中同名的函數都將會被調用)。該規則提取到的每一個request時都會調用該函數。該函數必須返回一個request或者None。用來過濾request

 

CrawlSpider類的源碼:

 rules :

  是一個列表,存儲的元素是Rule類的實例,其中每個實例都定義了一種採集站點的行爲。若是有多個rule都匹配同一個連接,那麼位置下標最小的一個rule將會被使用。

 __init__ :

  它主要就是執行了_compile_rules方法

 parse :

  默認回調方法。源碼進行了重寫,因此咱們自定義的函數,不可使用這個名,這裏直接調用方法 _parse_response ,並把 parse_start_url 方法做爲處理response的方法。

 parse_start_url :

  它的主要做用就是處理parse返回的response,好比提取出須要的數據等,該方法也須要返回item、request或者他們的可迭代對象。它就是一個回調方法,和rule.callback用法同樣。

 _requests_to_follow :

  它的做用就是從response中解析出目標url,並將其包裝成request請求。該請求的回調方法是_response_downloaded,這裏爲request的meta值添加了rule參數,該參數的值是這個url對應rule在rules中的下標。

 _response_downloaded :

  該方法是方法 _requests_to_follow 的回調方法,做用就是調用 _parse_response 方法,處理下載器返回的 response ,設置 response 的處理方法爲 rule.callback 方法。

 _parse_response :

  該方法將 resposne 交給參數callback表明的方法去處理,而後處理callback方法的requests_or_item。再根據rule.follow and spider._follow_links來判斷是否繼續採集,若是繼續那麼就將response交給_requests_to_follow方法,根據規則提取相關的連接。spider._follow_links的值是從settings的CRAWLSPIDER_FOLLOW_LINKS值獲取到的。

  _compile_rules 

  做用就是將rule中的字符串表示的方法改爲實際的方法,方便之後使用。

 from_crawler :

  用於建立,在scrapy源碼中這種建立方式比較多

整個數據的流向以下圖所示:

 

 示例:

1.建立項目

scrapy startproject circ

2. 建立crawl爬蟲

cd circ scrapy genspider -t crawl cf circ.gov.cn

3.編寫cf.py

import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule import re class CfSpider(CrawlSpider): name = 'cf' allowed_domains = ['circ.gov.cn'] start_urls = ['http://www.circ.gov.cn/web/site0/tab5240/module14430/page1.htm'] #定義提取url地址規則
    rules = ( #LinkExtractor 鏈接提取器,提取url地址
        #callback 提取出來的url地址的response會交給callback處理
        #follow 當前url地址的響應是夠從新進過rules來提取url地址,
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'), Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True), ) #parse函數有特殊功能,不能定義
    def parse_item(self, response): item = {} item["title"] = re.findall("<!--TitleStart-->(.*?)<!--TitleEnd-->",response.body.decode())[0] item["publish_date"] = re.findall("發佈時間:(20\d{2}-\d{2}-\d{2})",response.body.decode())[0] print(item)
相關文章
相關標籤/搜索