Scrapy 是一個框架,他本身是不支持分佈式的。如果我們想要做分佈式的爬蟲,就需要藉助一個組件叫做 Scrapy-Redis,這個組件正是利用了 Redis 可以分佈式的功能,集成到 Scrapy 框架中,使得爬蟲可以進行分佈式。可以充分的利用資源來提高爬蟲的爬行效率。
分佈式爬蟲的優點:
- 可以充分利用多臺機器的帶寬
- 可以充分利用多臺機器的 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 是爲了以後在 redis 中控制爬蟲啓動的。爬蟲的第一個 url,就是在 redis 中通過這個發送出去的
- 在配置文件中增加如下配置
# 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 [爬蟲名字]。
- 在 Redis 服務器上,推入一個開始的 url 鏈接:redis-cli> lpush [redis_key] start_url 開始爬取。