scrapy-redis 能分布式post请求吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy-redis 能分布式post请求吗相关的知识,希望对你有一定的参考价值。
参考技术A scrapy 通用爬虫框架其功能比较完善帮迅速写简单爬虫并且跑起scrapy-redis更便实现scrapy布式爬取提供些redis基础组件(注意scrapy-redis些组件完整框架)认scrapy工厂能够产要spiderscrapy-redis其厂商帮助scrapy工厂更实现某些功能制造些设备用于替换scrapy工厂原设备 所要想跑布式先让scrapy工厂搭建起再用scrapy-redis设备更换scrapy某些设备 些scrapy-redis组件突特点呢使用redis数据库替换scrapy原本使用队列结构(deque)换数据结构相应操作都要换啦所与队列相关些组件都做更scrapy-redis分布式爬虫
分布式问题:
request队列集中管理
去重集中管理
储存管理
可以上github上面找一下scrapy-redis
相关模块 redis
settings相关设置
#使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" #使用scrapy-redis里的调度器组件,不使用默认的 SCHEDULER = "scrapy_redis.scheduler.Scheduler" #允许暂停,redis请求记录不丢失 SCHEDULER_PERSIST = True #默认的scrapy-redis请求队列形式(按优先级) SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue" #队列形式,先进先出 SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue" #栈形式,请求先进后出 SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack" #只是将数据放到redis数据库,不需要写pipeline,存储到mysql还是需要写的 ITEM_PIPELINES = { ‘scrapy_redis.pipelines.RedisPipeline‘:400 } #链接redis数据库 REDIS_URL = ‘redis://:@127.0.0.1:6379‘
运行分布式爬虫
scrapy runspider myspider.py #后面的py文件是你需要运行的分布式爬虫的文件名
命令行启动后,会在自行等待监听redis上的url
也就是在spider上面设置的redis_key = ‘mybaike:start_url‘
然后后在redis上lpush一个健名和url
#比如:
# lpush mybaike:start_url "http://www.baike.com"
redis中默认生成的健有:
myspider:request myspider:dupefilter #如果打开item管道存储在redis的数据的话,就还有这这么一个字段 myspider:item
#在redis中删除所有的键命令为:flushdb
#查看所有键:keys *
spider.py ##基于RedisCrawlSpider,也就是翻页的时候使用Crawl的需要继承与这个类
import scrapy from scrapy.selector import Selector from Scrapy_Redist.items import ScrapyRedistItem from scrapy_redis.spiders import RedisCrawlSpider from scrapy.linkextractor import LinkExtractor from scrapy.spiders import CrawlSpider,Rule class MybaidukeSpider(RedisCrawlSpider): ##基于RedisCrawlSpider name = ‘mybaike‘ alloweb_domains = [‘baike.baidu.com‘] # start_urls = [‘https://baike.baidu.com/item/Python/407313‘] redis_key = ‘mybaike:start_url‘ rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)] def get_parse(self,response): items = ScrapyRedistItem() Seit = Selector(response) title = Seit.xpath(‘//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()‘).extract() contentList = Seit.xpath(‘//div[@class="lemma-summary"]//text()‘) content = ‘‘ for c in contentList: content += c.extract().strip() items[‘title‘] = title items[‘content‘] = content yield items
import scrapy from scrapy.selector import Selector from Scrapy_Redist.items import ScrapyRedistItem from scrapy_redis.spiders import RedisSpider class MybaidukeSpider(RedisSpider): name = ‘mybaike‘ alloweb_domains = [‘baike.baidu.com‘] # start_urls = [‘https://baike.baidu.com/item/Python/407313‘]
redis_key = ‘mybaike:start_url‘
#这句话很重要哦,也就是写在redis中键
#rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)]# 如果自己写一个翻页的花就继承于 RedisSpider
def get_parse(self,response): items = ScrapyRedistItem() Seit = Selector(response) title = Seit.xpath(‘//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()‘).extract() contentList = Seit.xpath(‘//div[@class="lemma-summary"]//text()‘) content = ‘‘ for c in contentList: content += c.extract().strip() items[‘title‘] = title items[‘content‘] = content yield items
其他的也就差不多一样的了
以上是关于scrapy-redis 能分布式post请求吗的主要内容,如果未能解决你的问题,请参考以下文章
Scrapy-redis改造scrapy实现分布式多进程爬取