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