Python scrapy redis程序不会自动关闭

Python scrapy redis程序不会自动关闭,python,redis,scrapy,web-crawler,Python,Redis,Scrapy,Web Crawler,Scrapy redis框架,redis存储xxx:请求已爬网完成,但程序仍在运行,如何自动停止程序,而不是一直在运行 运行代码: 2017-08-07 09:17:06[scrapy.extensions.logstats]信息:爬网0页(0页/分钟),爬网0项(0项/分钟) 2017-08-07 09:18:06[scrapy.extensions.logstats]信息:爬网0页(0页/分钟),爬网0项(0项/分钟) 我用ScrapyRedis来抓取一个站点,ScrapyRedis

Scrapy redis框架,redis存储xxx:请求已爬网完成,但程序仍在运行,如何自动停止程序,而不是一直在运行

  • 运行代码:

  • 
    2017-08-07 09:17:06[scrapy.extensions.logstats]信息:爬网0页(0页/分钟),爬网0项(0项/分钟)
    2017-08-07 09:18:06[scrapy.extensions.logstats]信息:爬网0页(0页/分钟),爬网0项(0项/分钟)
    


    • 我用ScrapyRedis来抓取一个站点,ScrapyRedis不会自动关闭,仍然要问url,但没有url。因此它总是
      刮取0个项目(以0个项目/分钟的速度)

    好的
    scrapy redis
    被设置为始终打开,等待在redis队列中推送更多URL,但是如果您想关闭它,您可以使用管道来完成,如下所示:

    class TestPipeline(object):
    
    def __init__(self, crawler):
        self.crawler = crawler
        self.redis_db = None
        self.redis_len = 0
    
    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)
    
    def open_spider(self, spider):        
        self.redis_len = len(spider.server.keys('your_redis_key'))
    
    def process_item(self, item, spider):
        self.redis_len -= 1
        if self.redis_len <= 0:
            self.crawler.engine.close_spider(spider, 'No more items in redis queue')
    
        return item
    
    类测试管道(对象):
    定义初始化(自爬虫):
    self.crawler=爬虫程序
    self.redis_db=None
    self.redis_len=0
    @类方法
    来自_爬虫程序(cls,爬虫程序)的def:
    返回cls(爬虫程序)
    def open_卡盘(自身、卡盘):
    self.redis\u len=len(spider.server.keys('your\u redis\u key'))
    def过程_项目(自身、项目、蜘蛛):
    self.redis_len-=1
    
    如果self.redis_len
    scrapy redis
    将始终等待在redis队列中推送新URL。当队列为空时,爬行器进入空闲状态并等待新的URL。这是我用来关闭我的蜘蛛一旦队列是空的

    当爬行器处于空闲状态时(当它什么也不做时),我检查redis队列中是否还有剩余的东西。如果没有,我将使用
    close\u spider
    关闭spider。以下代码位于
    spider
    类中:

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        from_crawler = super(SerpSpider, cls).from_crawler
        spider = from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.idle, signal=scrapy.signals.spider_idle)
        return spider
    
    
    def idle(self):
        if self.q.llen(self.redis_key) <= 0:
            self.crawler.engine.close_spider(self, reason='finished')
    
    @classmethod
    来自_爬虫程序的def(cls、爬虫程序、*args、**kwargs):
    from_crawler=super(SerpSpider,cls)。from_crawler
    蜘蛛=来自爬虫(爬虫,*args,**kwargs)
    crawler.signals.connect(spider.idle,signal=scrapy.signals.spider\u idle)
    回程卡盘
    def怠速(自):
    
    如果self.q.llen(self.redis_key)你的问题是什么意思。如果你提出这样的问题,我们无法帮助你。我使用scrapy redis对网站进行爬网,scrapy redis不会自动关闭,仍然需要询问url,但没有url。所以它总是
    刮取0个项目(0个项目/分钟)
    有用。我会试试。Thk!