完成所有请求后如何在scrapy中执行最后一个请求?

aug*_*men 2 python scrapy

在我构建的蜘蛛中,我需要登录网站才能开始执行请求(这很简单),然后我通过一个循环来执行数千个请求。

但是,特别是在这个网站上,如果我不退出,我会收到 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)
Run Code Online (Sandbox Code Playgroud)

但是,不能保证在其他请求完成处理之前注销请求不会准备好,因此过早注销将使其他请求无效。

我发现无法使用spider_closed信号执行新请求。

在所有其他请求完成后,如何执行新请求?

eLR*_*uLL 5

您可以使用spider_idle信号,它可以在蜘蛛停止处理所有内容时发送请求。

所以一旦你将一个方法连接到spider_idle信号:

self.crawler.signals.connect(self.spider_idle, signal=signals.spider_idle)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

  • 不,因为此时引擎无法再处理更多请求,它已经关闭。 (2认同)