在我正在建造的蜘蛛中,我需要登录网站才能开始执行请求(这非常简单),然后我会通过一个循环来执行数千个请求。
但是,特别是在这个网站上,如果我不注销,我会在再次登录之前受到10分钟的处罚。所以我在循环完成后尝试注销,优先级较低,如下所示:
def parse_after_login(self, response):
for item in [long_list]:
yield scrapy.Request(..., callback=self.parse_result, priority=100)
# After all requests have been made, perform logout:
yield scrapy.Request('/logout/', callback=self.parse_logout, priority=0)
但是,无法保证在其他请求完成处理之前注销请求不会就绪,因此过早注销将使其他请求无效。
我发现无法使用spider_closed
信号执行新请求。
如何在完成所有其他请求后执行新请求?
答案 0 :(得分:2)
您可以使用spider_idle
信号,该信号可在蜘蛛停止处理所有内容时发送请求。
因此,一旦您使用以下方法将方法连接到spider_idle
信号
self.crawler.signals.connect(self.spider_idle, signal=signals.spider_idle)
一旦蜘蛛停止处理所有内容,您现在可以使用self.spider_idle
方法调用最终任务:
class MySpider(Spider):
...
self.logged_out = False
...
def spider_idle(self, spider):
if not self.logged_out:
self.logged_out = True
req = Request('someurl', callback=self.parse_logout)
self.crawler.engine.crawl(req, spider)