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

标签 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)

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

我没有找到使用 spider_close 信号执行新请求的方法。

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

最佳答案

您可以使用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)

关于python - 如何在所有请求完成后在scrapy中执行最后一个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46429331/

相关文章:

selenium - 如何为selenium和Scrapy编写自定义下载器中间件?

python - 为什么我的 scrapy 蜘蛛不抓取任何东西?

python - 将 3D 场景渲染到图像文件的最简单方法

python - 如何替换列表中除最后一项之外的所有项目

python - 使用按钮在 Plotly 中绘制工厂热图

python - 在 Tensorflow 中连接两个 RNN 状态

python - pip 未安装 Scrapy 命令行工具

python - 如何从 ubuntu 服务器以编程方式登录 Yahoo

python - Scrapy 将 csv 文件中的额外数据传递给解析

python - numpy 数组上的可分离过滤器