1、scrapy是通過hashlib演算法轉成長度一致的url,然後再通過set集合去重的,有興趣看原始碼
from scrapy.utils.request import request_fingerprint2、在scrapy框架中去重的中介軟體檔案 dupefilters.py檔案 :def request_fingerprint(request, include_headers=none):
fp = hashlib.sha1() # 指紋是hashlib表示來生成乙個固定長度的哈兮值
fp.update(to_bytes(request.method))
fp.update(to_bytes(canonicalize_url(request.url)))
fp.update(request.body or b'')
每次執行之前都會呼叫到 request_seen(request) 這個方法# 封裝去重類
class rfpdupefilter(basedupefilter):
"""request fingerprint duplicates filter"""
def __init__(self, path=none, debug=false):
self.file = none
self.fingerprints = set() # 去重器
self.logdupes = true #log日誌
self.debug = debug #除錯
self.logger = logging.getlogger(__name__)
#有個函式叫 request_seen()
def request_seen(self, request):
fp = self.request_fingerprint(request)
if fp in self.fingerprints:
return true
self.fingerprints.add(fp)
if self.file:
self.file.write(fp + os.linesep)
# 被scrapy/core/scheduler.py呼叫這個是排程器
class scheduler(object):
# enqueue_request()的函式:spider的每來乙個url就是通過這個函式來執行的
def enqueue_request(self, request):
if not request.dont_filter and self.df.request_seen(request):
self.df.log(request, self.spider)
return false
這個方法就會生成乙個指紋,指紋下面的掉用的就比較複雜了,簡單的說就是要去執行 hashlib.sha1() 這個演算法來生成乙個固定長度的哈兮值
再然後就是在那個去重器中的
self.fingerprints = set()
就是通過上句**執行了set集合來去重了 Scrapy框架的去重機制
今天在做了個練習,爬取乙個新聞列表頁的所有新聞內容。看一下控制台scrapy的log,可以發現 no more duplicates will be shown see dupefilter debug to show all duplicate 大概意思是不再顯示重複的內容。原來scrapy有預設...
用redis實現scrapy的url去重與增量爬取
scrapy 自帶了去重方案,通過rfpdupefilter類完成去重,檢視原始碼。def request seen self,request fp self.request fingerprint request if fp in self.fingerprints return true sel...
scrapy高階開發(三) 去重策略
原始碼位置scrapy.core.engine.executionengine class executionengine object def schedule self,request,spider self.signals.send catch log signal signals.reque...