?導模塊
pip install scrapy-redis
?原來scrapy的Scheduler維護的是本機的任務隊列(待爬取的地址)+本機的去重隊列(放在集合中)---》在本機內(nèi)存中
如果把scrapy項目,部署到多臺機器上,多臺機器爬取的內(nèi)容是重復的?
?流程圖
所以實現(xiàn)分布式爬取的關(guān)鍵就是,找一臺專門的主機上運行一個共享的隊列比如Redis,
然后重寫Scrapy的Scheduler,讓新的Scheduler到共享隊列存取Request,并且去除重復的Request請求,所以總結(jié)下來,實現(xiàn)分布式的關(guān)鍵就是三點:
? ? #1、多臺機器共享隊列
? ? #2、重寫Scheduler,讓其無論是去重還是任務都去訪問共享隊列
? ? #3、為Scheduler定制去重規(guī)則(利用redis的集合類型)
? ??
? ??
# scrapy-redis實現(xiàn)分布式爬蟲
?? ?-公共的去重
? ? -公共的待爬取地址隊列
??使用步驟
? ? ???????????from scrapy_redis.spiders import RedisSpider
?? ?1 把之前爬蟲類,繼承class CnblogsSpider(RedisSpider):
? ? ?2 去掉起始爬取的地址,加入一個類屬性
? ? ? ? 去掉它:start_urls = ["https://www.cnblogs.com"] #爬取的初始地址? ??
? ? ?? ?redis_key = 'myspider:start_urls' ?# redis列表的key,后期我們需要手動插入起始地址??
? ? ?3 配置文件中配置
??????????scrapy redis去重類,使用redis的集合去重????????
? ? ? ? DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
? ? ? ? 不使用原生的調(diào)度器了,使用scrapy_redis提供的調(diào)度器,它就是使用了redis的列表
? ? ? ????????? SCHEDULER = "scrapy_redis.scheduler.Scheduler"
? ? ? ? ????????REDIS_HOST = 'localhost' ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 主機名
? ? ? ????????? REDIS_PORT = 6379 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 端口
? ? ? ????????? ITEM_PIPELINES = {
? ? ? ?# 'mysfirstscrapy.pipelines.MyCnblogsPipeline': 300,
? ? ? ?'mysfirstscrapy.pipelines.MyCnblogsMySqlPipeline': 301,
? ? ? ? 'scrapy_redis.pipelines.RedisPipeline': 400,
? ? }
? ? ? ??
? ? # 再不同多臺機器上運行scrapy的爬蟲,就實現(xiàn)了分布式爬蟲
? ? ? 4.將初始爬取的地址傳到redis隊列中---cmd啟動redis
lpush key value [value ...]
key------就是第二步 ?redis_key對應的值
value--------就是爬取的地址初始地址文章來源:http://www.zghlxwxcb.cn/news/detail-562062.html
????????分布式爬蟲 - 劉清政 - 博客園 (cnblogs.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-562062.html
到了這里,關(guān)于scrapy ---分布式爬蟲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!