Scrapy_Redis分布式爬蟲

pip3 install scrapy-redis

Scrapy-redis提供了四種組件(components):

(四種組件意味著這四個模塊都要做相應(yīng)的修改)

  • Scheduler

Scrapy中跟“待爬隊列”直接相關(guān)的就是調(diào)度器Scheduler,它負(fù)責(zé)對新的request進(jìn)行入列操作(加入Scrapy queue)疗我,取出下一個要爬取的request(從Scrapy queue中取出)等操作高每。它把待爬隊列按照優(yōu)先級建立了一個字典結(jié)構(gòu)。

  • Duplication Filter

Scrapy中用集合實現(xiàn)這個request去重功能坞琴,Scrapy中把已經(jīng)發(fā)送的request指紋放入到一個集合中,把下一個request的指紋拿到集合中比對逗抑,如果該指紋存在于集合中剧辐,說明這個request發(fā)送過了,如果沒有則繼續(xù)操作邮府。

在scrapy-redis中去重是由Duplication Filter組件來實現(xiàn)的荧关,它通過redis的set 不重復(fù)的特性,巧妙的實現(xiàn)了Duplication Filter去重褂傀。scrapy-redis調(diào)度器從引擎接受request忍啤,將request的指紋存?redis的set檢查是否重復(fù),并將不重復(fù)的request push寫?redis的 request queue仙辟。

引擎請求request(Spider發(fā)出的)時同波,調(diào)度器從redis的request queue隊列?里根據(jù)優(yōu)先級pop 出?個request 返回給引擎,引擎將此request發(fā)給spider處理欺嗤。

  • Item Pipeline

引擎將(Spider返回的)爬取到的Item給Item Pipeline参萄,scrapy-redis 的Item Pipeline將爬取到的 Item 存?redis的 items queue。

修改過Item Pipeline可以很方便的根據(jù) key 從 items queue 提取item煎饼,從?實現(xiàn) items processes集群讹挎。

  • Base Spider

不在使用scrapy原有的Spider類校赤,重寫的RedisSpider繼承了Spider和RedisMixin這兩個類,RedisMixin是用來從redis讀取url的類筒溃。

當(dāng)我們生成一個Spider繼承RedisSpider時马篮,調(diào)用setup_redis函數(shù),這個函數(shù)會去連接redis數(shù)據(jù)庫怜奖,然后會設(shè)置signals(信號):

一個是當(dāng)spider空閑時候的signal浑测,會調(diào)用spider_idle函數(shù),這個函數(shù)調(diào)用schedule_next_request函數(shù)歪玲,保證spider是一直活著的狀態(tài)迁央,并且拋出DontCloseSpider異常。

一個是當(dāng)抓到一個item時的signal滥崩,會調(diào)用item_scraped函數(shù)岖圈,這個函數(shù)會調(diào)用schedule_next_request函數(shù),獲取下一個request钙皮。

Scrapy_redis式工作流程

Scrapy_Redis式工作流程.png

修改設(shè)置文件

(1)設(shè)置去重組件,使用的是scrapy_redis的去重組件,而不再使用scrapy框架自己的去重組件了

  DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

(2)設(shè)置調(diào)度器,使用的是scrapy_redis重寫的調(diào)度器,而不再使用scrapy框架自帶的調(diào)度器了

  SCHEDULER = "scrapy_redis.scheduler.Scheduler"

(3)可以實現(xiàn)斷點爬确淇啤(請求的記錄不會丟失,會存儲在redis數(shù)據(jù)庫中,不會清除redis的任務(wù)隊列)

  SCHEDULER_PERSIST = True

(4)設(shè)置任務(wù)隊列的模式(三選一)

SpiderPriorityQueue是scrapy_redis默認(rèn)使用的隊列模式
 (有自己的優(yōu)先級)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

使用了隊列的形式,任務(wù)先進(jìn)先出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"

采用了棧的形式,任務(wù)先進(jìn)后出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

(5)實現(xiàn)這個管道,可以將爬蟲端獲取的item數(shù)據(jù),統(tǒng)一保存在redis數(shù)據(jù)庫中

'scrapy_redis.pipelines.RedisPipeline': 400,

(6)指定要存儲的redis數(shù)據(jù)庫的主機ip

REDIS_HOST = '127.0.0.1'

指定redis數(shù)據(jù)庫主機的端口
REDIS_PORT = 6379

"xcfCrawlSpider:requests":存儲的是請求的request對象
"xcfCrawlSpider:items":存儲的爬蟲端獲取的items數(shù)據(jù)
"xcfCrawlSpider:dupefilter":存儲的指紋(為了實現(xiàn)去重)
127.0.0.1:6379> type xcfCrawlSpider:requests
zset
127.0.0.1:6379> type xcfCrawlSpider:items
list
127.0.0.1:6379> type xcfCrawlSpider:dupefilter
set

  • 第一種情況:只設(shè)置settings.py文件,并沒有實現(xiàn)分布式,知識使用了sctapy_redis的數(shù)據(jù)存儲和去重功能

  • 第二種情況:實現(xiàn)通用爬蟲的分布式爬蟲

    from scrapy_redis.spiders import RedisCrawlSpider
    
    #繼承制:RedisCrawlSpider
    class MyCrawler(RedisCrawlSpider):
      """Spider that reads urls from redis queue (myspider:start_urls)."""
      name = 'mycrawler_redis'
      allowed_domains = ['dmoz.org']
      #缺少了start_url,多了redis_key:根據(jù)redis_key從redis
      #數(shù)據(jù)庫中獲取任務(wù)
      redis_key = 'mycrawler:start_urls'
    
  • 啟動爬蟲:scrapy crawl 爬蟲名稱

  • 現(xiàn)象:爬蟲處于等待狀態(tài)

需要設(shè)置起始任務(wù):
lpush mycrawler:start_urls 目標(biāo)url

  • 第三中情況:實現(xiàn)scrpy.spider爬蟲的分布式爬蟲

    from scrapy_redis.spiders import RedisSpider
    
    #繼承制:RedisSpider
    class MyCrawler(RedisSpider):
      """Spider that reads urls from redis queue (myspider:start_urls)."""
      name = 'mycrawler_redis'
      allowed_domains = ['dmoz.org']
      #缺少了start_url,多了redis_key:根據(jù)redis_key從redis
      #數(shù)據(jù)庫中獲取任務(wù)
      redis_key = 'mycrawler:start_urls'
    
    • 啟動爬蟲:scrapy crawl 爬蟲名稱

    • 現(xiàn)象:爬蟲處于等待狀態(tài)

    需要設(shè)置起始任務(wù):
    lpush mycrawler:start_urls 目標(biāo)url

僅為個人學(xué)習(xí)小結(jié),若有錯處短条,歡迎指正~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末导匣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茸时,更是在濱河造成了極大的恐慌贡定,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可都,死亡現(xiàn)場離奇詭異厕氨,居然都是意外死亡,警方通過查閱死者的電腦和手機汹粤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來田晚,“玉大人嘱兼,你說我怎么就攤上這事∠屯剑” “怎么了芹壕?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長接奈。 經(jīng)常有香客問我踢涌,道長,這世上最難降的妖魔是什么序宦? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任睁壁,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潘明。我一直安慰自己行剂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布钳降。 她就那樣靜靜地躺著厚宰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遂填。 梳的紋絲不亂的頭發(fā)上铲觉,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音吓坚,去河邊找鬼撵幽。 笑死,一個胖子當(dāng)著我的面吹牛凌唬,可吹牛的內(nèi)容都是我干的并齐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼客税,長吁一口氣:“原來是場噩夢啊……” “哼况褪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起更耻,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤测垛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秧均,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體食侮,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年目胡,在試婚紗的時候發(fā)現(xiàn)自己被綠了锯七。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡誉己,死狀恐怖眉尸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巨双,我是刑警寧澤噪猾,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站筑累,受9級特大地震影響袱蜡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慢宗,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一坪蚁、第九天 我趴在偏房一處隱蔽的房頂上張望奔穿。 院中可真熱鬧,春花似錦迅细、人聲如沸巫橄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湘换。三九已至,卻和暖如春统阿,著一層夾襖步出監(jiān)牢的瞬間彩倚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工扶平, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帆离,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓结澄,卻偏偏與公主長得像哥谷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麻献,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345