scrapy-redis程序不会自动关闭

时间:2017-08-07 06:26:20

标签: python redis scrapy web-crawler

  • scrapy-redis框架,redis存储xxx:请求已经爬行完毕,但程序仍在运行,如何自动停止程序,而不是一直在运行?

  • 正在运行的代码:

2017-08-07 09:17:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2017-08-07 09:18:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

  • 我使用scrapy-redis来抓取网站,scrapy-redis不会自动关闭,仍然要问网址,但是没有网址。所以它始终是scraped 0 items (at 0 items/min)

2 个答案:

答案 0 :(得分:2)

scrapy-redis将始终等待将新网址推送到redis队列中。当队列为空时,蜘蛛进入空闲状态并等待新的URL。这就是我在队列空了之后关闭蜘蛛的原因。

当蜘蛛处于空闲(当它什么都不做的时候)时,我会检查redis队列中是否还有剩余的东西。如果没有,我用close_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')

答案 1 :(得分:0)

scrapy-redis总是打开等待在redis队列中推送更多网址,但是如果要关闭它,可以使用管道来执行此操作:

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

我将解释它如何在open_spider管道中获取redis队列中的密钥总数,并在process_item中递减redis_len变量,当它达到零时发送关闭最后一项中的信号。