scrapy crawlspider內建方法原始碼

2022-09-01 02:42:07 字數 2540 閱讀 7709

有經驗的同學都知道它是乙個列表,儲存的元素時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:

_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版本中還有其他的解析器,不過現在已經棄用了。對於該類的介紹官網文件已經有很詳細的解釋了,我就不再贅述了。

mybatis getMapper()方法原始碼解析

public class type,sqlsession sqlsession trycatch exception e override public object invoke object proxy,method method,object args throws throwable els...

JAVA hashtable常用方法和原始碼分析

public static void main string args public synchronized v put k key,v value entry tab table int hash key.hashcode 計算雜湊值,此處說明value值不能為null,否則會出現空指標異常 i...

ArrayList的remove 方法原始碼解讀

remove index public boolean remove object obj else return false arraylist的remove object obj 方法判斷是否為同乙個物件的時候用的是equals方法,如果我們要移除list中的自定義類的時候需要重寫equals方...