Scrapy 和 scrapy redis的區別

2021-08-19 16:55:48 字數 2152 閱讀 5149

scrapy 是乙個通用的爬蟲框架,但是不支援分布式,scrapy-redis是為了更方便地實現scrapy分布式爬取,而提供了一些以redis為基礎的元件(僅有元件)。

pip install scrapy-redis

scrapy-redis提供了下面四種元件(components):(四種元件意味著這四個模組都要做相應的修改)

scrapy-redis在scrapy的架構上增加了redis,基於redis的特性拓展了如下元件:

scheduler

scrapy改造了python本來的collection.deque(雙向佇列)形成了自己的scrapy queue(但是scrapy多個spider不能共享待爬取佇列scrapy queue, 即scrapy本身不支援爬蟲分布式,scrapy-redis 的解決是把這個scrapy queue換成redis資料庫(也是指redis佇列),從同乙個redis-server存放要爬取的request,便能讓多個spider去同乙個資料庫裡讀取。

scrapy中跟「待爬佇列」直接相關的就是排程器scheduler,它負責對新的request進行入列操作(加入scrapy queue),取出下乙個要爬取的request(從scrapy queue中取出)等操作。它把待爬佇列按照優先順序建立了乙個字典結構,比如:

然後根據request中的優先順序,來決定該入哪個佇列,出列時則按優先順序較小的優先出列。為了管理這個比較高階的佇列字典,scheduler需要提供一系列的方法。但是原來的scheduler已經無法使用,所以使用scrapy-redis的scheduler元件。

duplication filter

scrapy中用集合實現這個request去重功能,scrapy中把已經傳送的request指紋放入到乙個集合中,把下乙個request的指紋拿到集合中比對,如果該指紋存在於集合中,說明這個request傳送過了,如果沒有則繼續操作。這個核心的判重功能是這樣實現的:

def

request_seen

(self, request):

# self.request_figerprints就是乙個指紋集合

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-redis中去重是由duplication filter元件來實現的,它通過redis的set 不重複的特性,巧妙的實現了duplication filter去重。scrapy-redis排程器從引擎接受request,將request的指紋存⼊redis的set檢查是否重複,並將不重複的request push寫⼊redis的 request queue。

引擎請求request(spider發出的)時,排程器從redis的request queue佇列⾥裡根據優先順序pop 出⼀個request 返回給引擎,引擎將此request發給spider處理。

item pipeline

引擎將(spider返回的)爬取到的item給item pipeline,scrapy-redis 的item pipeline將爬取到的 item 存⼊redis的 items queue。

修改過item pipeline可以很方便的根據 key 從 items queue 提取item,從⽽實現items processes集群。

base spider

不在使用scrapy原有的spider類,重寫的redisspider繼承了spider和redismixin這兩個類,redismixin是用來從redis讀取url的類。

當我們生成乙個spider繼承redisspider時,呼叫setup_redis函式,這個函式會去連線redis資料庫,然後會設定signals(訊號):

scrapy安裝和環境準備

版本選擇 由於分布式爬蟲用到了scrapy redis,它對於版本的要求如下 當然 隨著更新會支援更新版本的python requirements python 2.7,3.4 or 3.5 redis 2.8 scrapy 1.1 redis py 2.10 由於自己需要同時用到多個版本pytho...

requests庫和Scrapy比較

相同點 兩者都可以進行頁面請求和爬取,python爬蟲的兩個重要技術路線 兩者可用性都好,文件豐富,入門簡單 兩者都沒有處理js 提交表單 對應驗證碼等功能功能 可擴充套件 requests scrapy 頁面級爬蟲 級爬蟲 功能庫框架 併發性考慮不足,效能較差 併發性好,效能較高 重點在於爬蟲結構...

vscode 除錯和執行scrapy

本文參考博文 1.在settings.py檔案所在的目錄下新建run.py檔案 名字隨意 2.run.py內容如下所示 from scrapy.cmdline import execute import sys import os 獲取當前指令碼路徑 dirpath os.path.dirname ...