學習了scrapy 爬蟲框架 以爲這個框架作數據抓取很好用,可是不支持分佈式。網上查了有大牛在它基礎上進行改進出了一個scrapy-redis 的框架
在網上找了不少教程,可是都沒有說到基於scrapy-redis從 0 搭建分佈式 爬蟲框架的。
所以我決定本身從 0 開始搭建 並把整個過程記錄下來 但願後來的人少走一些彎路(環境是基於Red Hat Enterprise Linux Server release 7.2 (Maipo), redis 版本是 redis-4.0.1 python 版本是2.7)
Master 端的配置以及redis的安裝
1. 首先這個scrapy-redis 是基於 redis 數據庫來實現的分佈式 所以 必需要先安裝好 redis
如下 操做 是以root 用戶來進行
1.1 建立redis 安裝目錄
mkdir /usr/local/redis
1.2 切換到redis 目錄 並下載 redis
cd redis
1.4 解壓 並安裝 redis
make && make install
1.5 修改redis 的配置(修改redis.conf)默認的redis 監聽端口是127.0.0.1 改爲你本機的ip
1.6 啓動redis (啓動的信息會輸出到 nohup.out 中)
cd src
nohup ./redis-server ../redis.conf &
2. 安裝scrapy
pip install scrapy_redis
3. 新建一個項目 scrapy startproject MySpider
出現了錯誤 AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1'
緣由是 pip 安裝時 Twisted默認是安裝了最新的 Twisted-17.9.0 把 Twisted 卸載掉 安裝一個版本比較低的
3.1 卸載 Twisted
pip uninstall Twisted
3.2 更換其餘版本的 Twisted
pip install twisted==15.0.0
3.3 而後再嘗試新建項目
scrapy startproject MySpider
3.4 建立好項目以後我須要在spider 目錄下面建立一個master.py 這個就是master(負責獲取url 並保持到redis的隊列中,以供其餘的slave 使用)
4. 配置scrapy 當咱們創建好項目以後,就須要修改settings.py 文件 在裏面添加配置
# redis ip
REDIS_HOST = "192.168.1.52"
# redis 端口
REDIS_PORT = 6379
# 使用redis 存儲任務調度
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 使用redis 配置去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# ROBOTSTXT_OBEY = False
5. 編寫 master demo (這裏須要注意,之前是繼承自Spider 可是若是是作分佈式的話須要繼承自RedisSpider)
# coding:utf-8
from scrapy_redis.spiders import RedisSpider
class Master(RedisSpider):
"""
"""
name = 'master'
redis_key = 'master:start_urls'
allowed_domains = ['baidu.com']
def parse(self, response):
print response.body
能夠看到我這裏並無寫start_urls (start_urls 被保存在redis)這也是和scrapy 不一樣的地方 裏面還寫了 redis_key 這個很重要,由於scrapy 就是根據這個key 去 redis 裏面查找數據的
6. 去redis 裏面往隊列裏面插入數據
[root@localhost src]# ./redis-cli -h 192.168.1.52 -p 6379
192.168.1.52:6379> lpush master:start_urls https://www.baidu.com/
(integer) 1
192.168.1.52:6379>
7. 而後就能夠將master的demo 運行起來了
7.1 切換到項目路徑下面,將master 的腳本運行起來,運行起來後它就會去redis 裏面找到start_urls 而後請求該url 返回response
cd mySpider/mySpider
scrapy crawl master
7.2 當咱們每次將項目停掉時redis 裏面的start_urls 就會被清空(如今還不清楚是爲何...估計是以pop的方式從redis 裏面拿出來的url)
# 到此 Master 節點的demo 已經能夠運行起來了,如今咱們須要處理的就是 從master的請求的response 裏面 處理數據,並將url 保存至 redis 隊列中。而後配置其餘節點的scrapy 讓其餘節點的進程從redis 裏面拿出url 進行抓取
配置其餘節點
1 其餘的節點也須要安裝scrapy-redis 不須要安裝redis 只須要將setting的配置文件加上一條配置
REDIS_URL = 'redis://192.168.1.52:6379'
如下是 slave 的爬蟲文件demo
# coding:utf-8
from scrapy_redis.spiders import RedisSpider
class Slave1(RedisSpider):
"""
"""
name = 'slave1'
# redis_key 必須和 master 同樣
redis_key = 'master:start_urls'
allowed_domains = ['baidu.com']
def parse(self, response):
print response.body
而後就能夠運行slave 了,當master 拿到url 保存到redis裏面的時候,這裏就會自動拿到url 而後你只須要在這裏處理數據就能夠了