爬蟲:Scrapy-redis分佈式爬蟲

scrapy - redis 簡介

scrapy-redis 是 scrapy 框架基於 redis 數據庫的組件,用於 scrapy 項目的分佈式開發和部署。

官方文檔:https://scrapy-redis.readthedocs.io/en/stable/

源碼位置:https://github.com/rmax/scrapy-redis

參考博客:https://www.cnblogs.com/kylinlin/p/5198233.html

優勢

  • 分佈式爬取
    可以啓動多個 spider 工程,相互之間共享單個 redis 的 requests 隊列。最適合廣泛的多個域名網站的內容爬取。

  • 分佈式數據處理
    爬取到的 scrapy 的 item 數據可以推入到 redis 隊列中,這意味着你可以根據需求啓動儘可能多的處理程序來共享item的隊列,進行item數據持久化處理

  • Scrapy 即插即用組件
    Scheduler 調度器 + Duplication 複製 過濾器, Item Pipeline ,基本spider

缺點

Scrapy-Redis 調度的任務是 Request 對象,裏面信息量比較大(不僅包含 url ,還有callback 函數、 headers 等信息)

  • 降低爬蟲速度
  • 佔用 Redis 大量的存儲空間
  • 需要一定硬件水平

scrapy - redis 架構

在這裏插入圖片描述

  • 首先 Slaver 端從 Master 端拿任務( Request 、 url )進行數據抓取, Slaver 抓取數據的同時,產生新任務的 Request 便提交給 Master 處理;
  • Master 端只有一個 Redis 數據庫,負責將未處理的 Request 去重和任務分配,將處理後的Request 加入待爬隊列,並且存儲爬取的數據。

Scrapy-Redis 默認使用的就是這種策略,實現簡單,因爲任務調度等工作 Scrapy-Redis 都已經幫我
們做好了,我們只需要繼承 RedisSpider 、指定 redis_key 就行了。

scrapy - redis 常用配置

# 使用了scrapy_redis的去重組件,在redis數據庫裏做去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用了scrapy_redis的調度器,在redis裏分配請求
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 在redis中保持scrapy-redis用到的各個隊列,從而允許暫停和暫停後恢復,也就是不清理redis queues
SCHEDULER_PERSIST = True
# 通過配置RedisPipeline將item寫入key爲 spider.name : items 的redis的list中,供後面的分
# 布式處理item 這個已經由 scrapy-redis 實現,不需要我們寫代碼,直接使用即可
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 100 ,
}
# 指定redis數據庫的連接參數
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379

scrapy - redis 鍵名介紹

scrapy-redis 中都是用key-value形式存儲數據,其中有幾個常見的key-value形式

名稱 類型 含義
項目名:items list 保存爬蟲獲取到的數據item 內容是 json 字符串
項目名: dupefilter set 用於爬蟲訪問的URL去重 內容是 40個字符的 url 的hash字符串
項目名:start_urls List 用於獲取spider啓動時爬取的第一個 url
項目名:requests zset 用於scheduler調度處理 requests 內容是 request 對象的序列化 字符串

scrapy - redis 簡單實例

在原來非分佈式爬蟲的基礎上,使用 scrapy-redis 簡單搭建一個分佈式爬蟲,過程只需要修改下面文
件:

  • settings.py

  • spider 文件
    繼承類:由 scrapy.Spider 修改爲 RedisSpider

    start_url 已經不需要了,修改爲: redis_key = “xxxxx”

    在 redis 數據庫中,設置一個 redis_key 的值,作爲初始的 url , scrapy 就會自動在redis 中取出 redis_key 的值,作爲初始 url ,實現自動爬取。

添加起始URL:

lpush xxxx:start_urls http:xxxxx.com/xxxx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章