Scrapy-Redis分布式爬蟲元件
Scrapy
是一個架構,他本身是不支援分布式的。如果我們想要做分布式的爬蟲,就需要借助一個元件叫做
Scrapy-Redis
,這個元件正是利用了
Redis
可以分布式的功能,內建到
Scrapy
架構中,使得爬蟲可以進行分布式。可以充分的利用資源(多個ip、更多帶寬、同步爬取)來提高爬蟲的爬行效率。
分布式爬蟲的優點:
- 可以充分利用多台機器的帶寬。
- 可以充分利用多台機器的ip位址。
- 多台機器做,爬取效率更高。
分布式爬蟲必須要解決的問題:
- 分布式爬蟲是好幾台機器在同時運作,如何保證不同的機器爬取頁面的時候不會出現重複爬取的問題。
- 同樣,分布式爬蟲在不同的機器上運作,在把資料爬完後如何保證儲存在同一個地方。
安裝:
通過
pip install scrapy-redis
即可安裝。
Scrapy-Redis架構:
Scrapy架構圖:
Scrapy-Redis架構圖:
分布式爬蟲架構圖:
以上兩個圖檔對比我們可以發現。
Item Pipeline
在接收到資料後發送給了
Redis
、
Scheduler
排程器排程資料也是從
Redis
中來的、并且其實資料去重也是在
Redis
中做的。
如何編寫Scrapy-Redis分布式爬蟲:
要将一個
Scrapy
項目變成一個
Scrapy-redis
項目隻需修改以下三點就可以了:
- 将爬蟲的類從
變成scrapy.Spider
;或者是從scrapy_redis.spiders.RedisSpider
變成scrapy.CrawlSpider
。scrapy_redis.spiders.RedisCrawlSpider
- 将爬蟲中的
删掉。增加一個start_urls
。這個redis_key="xxx"
是為了以後在redis_key
中控制爬蟲啟動的。爬蟲的第一個url,就是在redis中通過這個發送出去的。redis
- 在配置檔案中增加如下配置(配置redis的端口号和ip):
# Scrapy-Redis相關配置
# 確定request存儲到redis中
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 確定所有爬蟲共享相同的去重指紋
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 設定redis為item pipeline
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
# 在redis中保持scrapy-redis用到的隊列,不會清理redis中的隊列,進而可以實作暫停和恢複的功能。
SCHEDULER_PERSIST = True
# 設定連接配接redis資訊
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
- 運作爬蟲:
- 在爬蟲伺服器上。進入爬蟲檔案所在的路徑,然後輸入指令:
。scrapy runspider [爬蟲名字]
進入項目spiders所在的目錄
- 在
伺服器上,推入一個開始的url連結:Redis
開始爬取。redis-cli> lpush [redis_key] start_url
- 在爬蟲伺服器上。進入爬蟲檔案所在的路徑,然後輸入指令: