【发布时间】: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是否有具体原因? -
函数只返回/产生一件事,我想停止函数的执行。我误解了。我在下面提供了答案。谢谢。