在关闭Scrapy Spider之前发出最终请求

时间:2019-06-09 21:22:09

标签: python scrapy

问题很简单,有一个蜘蛛可以登录到网站,抓取一些数据然后退出。所需的行为是登录,爬网数据然后注销。

不可能对此进行硬编码,因为大约有60个蜘蛛,它们都继承自BaseSpider。

我尝试使用信号并将退出功能添加到spider_idle信号中,该功能仅向每个蜘蛛需要提供的退出URL发送请求,但是我无法使其正常工作,从未调用过注销功能,而我却无法弄清楚为什么不这样做?

这是代码:

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super(BaseSpider, cls).from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.spider_idle, signal=signals.spider_idle)

    def spider_idle(self, spider):
        if not self.logged_out:
            self.crawler.engine.crawl(Request(self.logout_url, callback=self.logout), spider)

    def logout(self, response):
        self.logged_out = True

我不明白为什么这行不通。据我了解,spider_idle信号在队列中没有更多请求/蜘蛛完成时被调用。

1 个答案:

答案 0 :(得分:1)

我已经使用Scrapy多年了,最终遇到了像您这样的情况

实现目标的唯一解决方案是在spider_closed方法内使用python的请求库

spider_idle等无济于事