scrapy redis原始碼困惑記錄

2021-09-13 10:35:43 字數 2844 閱讀 6652

原始碼可從github上獲取

可以把原始碼轉殖下來,執行如下命令:

git clone

%r - 字串(採用repr()的顯示)

%s - 字串(採用str()的顯示)

區別:str和repr str即以人類理解的方式轉化為字串,repr是以機器理解的方式直接為資料加上單引號,其他不變。

pipe = self.server.pipeline()	#相當於把所執行的redis的所有命令打包一起

傳送給redis伺服器,沒有大小的限制,比一條一條執行語句要快

pipe.multi() #保證pipeline中的命令在redis資料庫中執行的原子性

pipe.zrange(self.key, 0, 0).zremrangebyrank(self.key, 0, 0)

詳細解釋可見:redis的multi與pipeline

pickle.dumps(obj, protocol=-1)
序列化物件,並將結果資料流寫入到檔案物件中。file表示儲存到的類檔案物件。引數protocol是序列化模式或者序列化使用的協議版本,0:ascii協議,表示以文字的形式序列化。1和2表示以二進位制的形式序列化。其中,1是老式的二進位制協議;2是新二進位制協議)。(3,4)則是在python3之後的版本。此外,引數可選pickle.highest_protocol和pickle.default_protocol。當前,python3.5版本中,pickle.highest_protocol的值為4,表示最高可用的協議版本,pickle.default_protocol的值為3,當前預設的協議版本。當protocol引數為負數時,表示選擇的引數是pickle.highest_protocol。

本模組定義了三種佇列用於任務排程,分別是先入先出佇列和先入後出佇列即棧和優先順序佇列,通過將父類的push方法重寫完成將請求序列化為字典後進入佇列,儲存到資料庫中。通過將基類的pop方法重寫完成將請求反序列化為類物件取出佇列。並重寫了__len__方法,來使三種佇列可以通過len()函式得到佇列的長度。

使用server = get_redis_from_settings(settings)

根據scrapy中的setting.py中的redis_params和scrapy-redis中default.py中redis_params建立redis連線

鑑別重複的方式是使用指紋,指紋通過scrapy.utils.request中的request_fingerprint函式生成,主要是依據request物件的請求方法、url、請求頭使用摘要演算法儲存為16進製制的數字字串。再儲存到redis資料庫的集合中,sadd函式返回1則判斷不重複,否則判定為重複。

1)persist :

在爬取結束後是否清空佇列(包括去重過濾佇列和請求爬取佇列),true不清空,false清空,預設為false即清空,可通過在setting.py中設定scheduler_persist進行修改。

2)flush_on_start:

在爬取開始時是否清空佇列(包括去重過濾佇列和請求爬取佇列),true清空,false不清空,預設為false不清空,可通過setting.py中設定scheduler_flush_on_start進行修改。

3)queue_key:

請求爬取佇列的key,預設設定為』%(spider)s:requests』,可通過setting.py中scheduler_queue_key進行修改

4)queue_cls:

請求爬取佇列所使用佇列型別,預設為scrapy_redis.queue.priorityqueue即優先順序爬取佇列,可通過setting.py中設定scheduler_queue_class進行更改,目前包括先入先出佇列、**先出佇列和優先順序佇列,或者可以自己定義。

5)dupefilter_key

去重過濾佇列的key,預設為 %(spider)s:dupefilter,可通過設定setting.py中scheduler_dupefilter_key進行更改

6)dupefilter_cls

去重過濾佇列型別,預設為 scrapy_redis.dupefilter.rfpdupefilter(利用指紋和redis中集合進行去重),可通過設定setting.py中 dupefilter_class 進行更改

7)idle_before_close

從請求爬取佇列中獲取請求的超時等待時間,0為一直等待,預設為0,可通過設定setting.py中scheduler_idle_before_close進行更改

8)serializer

有序列化和反序列化方法的物件,用於請求佇列中請求的序列化和反序列化,預設使用scrapy-redis.picklecompat中loads和dumps反序列化和序列化請求,可自己定義,然後在setting.py中設定scheduler_serializer進行更改

if not request.dont_filter and self.df.request_seen(request)
如果請求的dont_filter引數為false代表要進行去重,同時如果此請求是不重複的將其放入佇列,否則不放入佇列並記錄日誌。

如果請求的dont_filter引數為true,則代表不進行去重,直接將其放入佇列。

status的作用不太理解,原始碼中涉及status主要有以下三部分語句

self.stats = none

instance.stats = crawler.stats

self.stats.inc_value(『scheduler/dequeued/redis』, spider=self.spider)

不懂這句的作用和意思

本模組通過引數、enqueue_request()和next_request()函式來實現對請求佇列的管理。

scrapy redis原始碼解讀之傳送POST請求

這段時間在研究美團爬蟲,用的是scrapy redis分布式爬蟲框架,奈何scrapy redis與scrapy框架不同,預設只傳送get請求,換句話說,不能直接傳送post請求,而美團的資料請求方式是post,網上找了一圈,發現關於scrapy redis傳送post的資料寥寥無幾,只能自己剛原始...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...