Python網絡爬蟲(二十四)——Scrapy-Redis

Scrapy 是一個框架,他本身是不支持分佈式的。如果我們想要做分佈式的爬蟲,就需要藉助一個組件叫做 Scrapy-Redis,這個組件正是利用了 Redis 可以分佈式的功能,集成到 Scrapy 框架中,使得爬蟲可以進行分佈式。可以充分的利用資源來提高爬蟲的爬行效率。

分佈式爬蟲的優點:

  1. 可以充分利用多臺機器的帶寬
  2. 可以充分利用多臺機器的 ip 地址
  3. 多臺機器做,爬取效率更高

分佈式爬蟲必須要解決的問題:

  1. 分佈式爬蟲是好幾臺機器在同時運行,如何保證不同的機器爬取頁面的時候不會出現重複爬取的問題
  2. 分佈式爬蟲在不同的機器上運行,在把數據爬完後如何保證保存在同一個地方

安裝:

通過 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 開始爬取。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章