问题很简单,有一个蜘蛛可以登录到网站,抓取一些数据然后退出。所需的行为是登录,爬网数据然后注销。
不可能对此进行硬编码,因为大约有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
信号在队列中没有更多请求/蜘蛛完成时被调用。
答案 0 :(得分:1)
我已经使用Scrapy多年了,最终遇到了像您这样的情况
实现目标的唯一解决方案是在spider_closed
方法内使用python的请求库
spider_idle
等无济于事