python爬虫之基于scrapy_redis的分布式爬虫
基于redis的分布式爬蟲
問題:
(1)為什么原生的scrapy框架不可以自己實現分布式爬蟲?
原因有兩個:
(1)因為多臺機器上部署的scrapy會各自擁有各自的調度器,這樣就使得多臺機器無法分配start_urls列表中的url(調度器不能被共享)
(2)多臺機器爬取到的數據無法通過同一個管道對數據進行統一的數據持久出存儲。(管道不能被共享)
(2)scrapy-redis組件的作用是什么?
它提供了可以被共享的調度器和管道
(3)如何使用scrapy-redis組件來實現分布式爬蟲?
其一:基于該組件的RedisSpider類
其二:基于該組件的RedisCrawlSpider類
但是這兩種實現分布式爬蟲的實現流程是一致的
分布式的實現流程:
1 下載scrapy-redis組件:
pip install scrapy_redis2 創建工程
3 創建爬蟲文件:RedisSpider RedisCrawlSpider
- scrapy genspider -t crawl xxx www.xxx.com4 對爬蟲文件中的相關屬性進行修改:
- 導入:from scrapy_redis.spiders import RedisCrawlSpider
- 將爬蟲類的父類修改成基于RedisSpider或者RedisCrawlSpider。注意:如果原始爬蟲文件是基于Spider的,則應該將父類修改成RedisSpider,如果原始爬蟲文件是基于CrawlSpider的,則應該將其父類修改成RedisCrawlSpider
- 注釋或者刪除start_urls列表,切加入redis_key屬性。也就是將起始的URL列表替換成redis_key = 'xxx' (調度器隊列的名稱)
5 在配置文件中進行配置
使用組件中封裝好的可以被共享的管道類
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400}配置調度器(使用組件中封裝好的可以被共享的調度器)
增加了一個去重容器類的配置,作用使用Redis的set集合來存儲請求的指紋數據,從而實現請求去重的持久化
使用scrapy_redis組件自己的調度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"配置調度器是否要持久化,也就是當爬蟲結束之后,要不要清空Redis中請求隊列和去重指紋的set。如果是True,就表示要持久化存儲,就不清空數據,否則清空數據
SCHEDULER_PERSIST = True指定存儲數據中的redis
6 在redis數據庫的配置文件中修改一些數據
取消保護模式:
protected-mode no #表示可以讓其他ip操作redisbind綁定:將這一行注釋掉 因為只有注釋掉了 才能進行分布式
#bind 127.0.0.1 表示可以讓其他ip訪問redis啟動redis
開啟redis服務端:在終端中輸入 redis-server
開啟redis客戶端: 在開啟服務端之后 在終端輸入 redis-cli
7 執行分布式程序
進入到項目下的spiders中
cd 該項目 cd spiders在spiders目錄下 查看你的爬蟲文件存不存在
在執行此命令
scrapy runspider xxx.py #xxx.py是你的爬蟲文件名
8 向調度器隊列中扔入一個url
在redis-cli執行之后,執行此命令
lpush chouti https://dig.chouti.com/ #這里要注意的是 chouti是 爬蟲文件中redis_key = 'chouti'#調度器隊列的名稱 后面的地址是你要爬取的網站的地址在查看redis中是否有存儲到數據
key *
轉載于:https://www.cnblogs.com/mlhz/p/10480121.html
總結
以上是生活随笔為你收集整理的python爬虫之基于scrapy_redis的分布式爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [SCOI2013]多项式的运算
- 下一篇: git ssh 绑定 GitLab