1. 程式人生 > >scrapy crawlspider內建方法原始碼

scrapy 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:

  這個就不細說了,看看原始碼就好,兩行程式碼。

整個資料的流向如下圖所示:

 

 關於CrawlSpider就先講到這裡,接下來會說說Rule類,該類的原始碼已經在文章的最上方貼出來了。

 link_extractor:

  該方法是一個Link Extractor例項,主要定義的就是連結的解析規則。

callback:

   該值可以是一個方法,也可以是一個字串(spider例項中一個方法的名稱)。它就是一個回撥方法,在上面的流程圖中可以看到它所在的位置以及作用。這裡要慎用parse做為回撥方法,因為這邊的parse已經不像spider類中的那樣沒有具體操作。

cb_kwargs:

  這是一個字典,用於給callback方法傳遞引數,在CrawlSpider原始碼中可以看到其作用。

follow:

  是一個布林物件,表示是當前response否繼續採集。如果callback是None,那麼它就預設為True,否則為False。

process_links:

  該方法在crawlspider中的_requests_to_follow方法中被呼叫,它接收一個元素為Link的列表作為引數,返回值也是一個元素為Link的列表。可以用該方法對採集的Link物件進行修改,比如修改Link.url。這裡的如果你的目標url是相對的連結,那麼scrapy會將其擴充套件成絕對的。原始碼就不帶大家看了,瞭解就行。

process_request

  顧名思義,該方法就是處理request的,原始碼中也給出了一個樣例(雖然沒有任何作用),想修改request的小夥伴可以自己構造該方法。

Rule是不是很簡單呢,可是他的屬性link_extractor的花樣就比較多了。預設的link解析器是LinkExtractor,也就是LxmlLinkExtractor。在之前的scrapy版本中還有其他的解析器,不過現在已經棄用了。對於該類的介紹官網文件已經有很詳細的解釋了,我就不再贅述了。

這章介紹的是scrapy中比較重要的一個類,希望本文會對小夥伴們有幫助,如果有疑問,歡迎在下面的評論區中提問。