【问题标题】:Scrapy request chaining not working with Spider MiddlewareScrapy 请求链接不适用于 Spider 中间件
【发布时间】:2021-01-06 02:47:24
【问题描述】:

与链接中所做的类似: How can i use multiple requests and pass items in between them in scrapy python

我正在尝试像 Dave McLain 的回答那样链接来自蜘蛛的请求。从 parse 函数返回请求对象工作正常,允许蜘蛛继续下一个请求。

    def parse(self, response):
        # Some operations

        self.url_index += 1
        if self.url_index < len(self.urls):
            return scrapy.Request(url=self.urls[self.url_index], callback=self.parse)
        return items

但是,我有默认的 Spider 中间件,我在 spider_process_output 中执行一些缓存和日志记录操作。从解析函数返回请求对象首先进入中间件。因此,中间件也必须返回请求对象。

    def process_spider_output(self, response, result, spider):
        # Called with the results returned from the Spider, after
        # it has processed the response.
        # Must return an iterable of Request, or item objects.

        if hasattr(spider, 'multiple_urls'):
            if spider.url_index + 1 < len(spider.urls):
                return [result]
                # return [scrapy.Request(url=spider.urls[spider.url_index], callback=spider.parse)]
        
        # Some operations ...

根据文档,它必须返回可迭代的 Request 或 item 对象。但是,当我返回结果(这是一个 Request 对象)或构造一个新的请求对象(如注释中所示)时,蜘蛛只是终止(通过发出蜘蛛完成信号)而不发出新的请求。

文档链接:https://docs.scrapy.org/en/latest/topics/spider-middleware.html#writing-your-own-spider-middleware

我不确定文档或我的解释方式是否存在问题。但是,从中间件返回请求对象并不会发出新请求,而是终止流程。

【问题讨论】:

  • 您使用return 而非yield 是否有具体原因?
  • 函数只返回/产生一件事,我想停止函数的执行。我误解了。我在下面提供了答案。谢谢。

标签: python scrapy scrapyd


【解决方案1】:

解决问题非常简单,但令人沮丧。中间件应该返回可迭代的请求对象。但是,将请求对象放入列表(这是一个可迭代的)似乎不起作用。在 process_spider_output 中间件函数中使用 yield result 可以代替。

由于主要问题已解决,我将将此答案作为参考。感谢您更好地解释为什么会这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多