1. 程式人生 > 實用技巧 >scrapy-redis分散式爬蟲

scrapy-redis分散式爬蟲

scrapy-redis分散式爬蟲

開發步驟

一、安裝模組

pip install scrapy-redis -i https://pypi.douban.com/simple

tips:重點講解scrapy-redis與scrapy不同的地方。以下步驟均是在原scrapy專案中進行修改

二、修改settings檔案

1、在settings.py檔案中新增如下程式碼,
# scrapy_redis
# 過濾器 類模板, 過濾重複的請求物件
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 排程器 類模板
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 排程器持久化,實現斷點續爬
SCHEDULER_PERSIST = True
# 使用redis
REDIS_URL = 'redis://127.0.0.1:6379'
2、修改ITEM_PIPELINES, 新增redis管道。可以將資料儲存到redis資料庫中。
ITEM_PIPELINES = {
   # 將資料儲存到redis資料庫
   'scrapy_redis.pipelines.RedisPipeline': 400,
}

三、修改爬蟲檔案

1、匯入模組
from scrapy_redis.spiders import RedisSpider	# 匯入RedisSpider類
2、修改類,讓爬蟲繼承RedisSpider類
class xxxSpider(RedisSpider): # 爬蟲繼承RedisSpider類

3、新增類屬性redis_key,並註釋原來的start_urls

redis_key = 'key'	# key 為redis資料庫中的鍵,列表型別、儲存開始url

四、進入redis資料庫

1、執行爬蟲檔案
scrapy crawl 爬蟲名

可以看見程式最後停在了, 表示正在監聽redis資料庫,等待redis資料庫分配開始url

Telnet console listening on 127.0.0.1:6023
2、進入redis資料庫

redis安裝就不贅述了。

# 進入redis
redis-cli
# 設定開始url
lpush key http://www.xxx.com

設定完開始url後,爬蟲立刻開始爬取網頁。直到所有網頁爬取完畢,但是爬蟲程式並沒有結束,而是繼續等待redis資料庫分配網址。所以此時需要手動結束爬蟲程式:Ctrl+C 結束程序。

5、儲存資料到檔案

import redis
import json

# 設定編碼。按需修改其他引數:host\port\db\...
r = redis.StrictRedis(decode_responses=True)
# spider為爬蟲名,自定義。資料型別為列表
itemslist = r.lrange('spider:items', 0, -1)

# 儲存到檔案
with open('store_redis_data.json', 'w') as f:
    json.dump(itemslist, f,ensure_ascii=False, indent=4)

"""
StrictRedis()的引數
decode_responses=True
設定自動將位元組資料解碼,將直接得到字串資料,json不能儲存位元組資料。
encoding = 'utf-8' 
編碼格式預設為utf-8,看情況修改
host='localhost'
設定ip地址
port=6379
埠號
db=0
選擇資料庫
password=None
填寫密碼

dump()的引數
ensure_ascii=False
預設使用ascii編碼,需要關閉,否則不能顯示中文。
indent=4
設定換行縮排,子節點縮排4格。預設不換行,所有內容顯示在一行中。
"""

scrapy-redis分散式原理

1、原理

用redis資料庫代替scrapy中的排程器和管道。由redis統一分配任務和儲存資料。

2、redis的工作:

1、儲存請求物件。接收各伺服器爬蟲傳送的url請求物件。並過濾掉重複的。

2、儲存item物件。接收各伺服器爬蟲傳送的資料。

3、分配任務。將請求物件均分給各伺服器。

4、實現斷點續爬。過濾掉已完成的任務,儲存未完成的任務。在任務中斷後,再次啟動任務可以從斷點開始任務。

3、實現要求:

多臺伺服器需連線到同一個redis資料庫。