scrapy-redis 分布式学习记录
生活随笔
收集整理的這篇文章主要介紹了
scrapy-redis 分布式学习记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習了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.3 wget http://download.redis.io/releases/redis-4.0.1.tar.gz 1.4 解壓 并安裝 redis tar -xf redis-4.0.1.tar.gz cd redis-4.0.1 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 然后你只需要在這里處理數據就可以了
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 然后你只需要在這里處理數據就可以了
轉載于:https://www.cnblogs.com/SunshineLittleCat/p/8467245.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的scrapy-redis 分布式学习记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell 计算两个数的加减乘除取余(+
- 下一篇: idea新建maven项目没有src目录