在回调或302请求中出现yield item问题

5 投票
1 回答
1822 浏览
提问于 2025-04-17 12:20

我在使用 scrapy 的时候遇到了一个问题。

yield Request(a_url[0],
                    meta={'item': aitem}, dont_filter=True,
                    callback=self.redeem_url, errback=self.error_page)


    def redeem_url(self, response):
       item = response.request.meta['item']
       item['Click_to_Redeem_URL'] = response.url
       yield item

在发出 a_url[0] 请求之前,aitem 已经被填充好了。有时候我会收到 302、404、301 这样的状态码,所以我想要的是,如果我从 a_url[0] 请求中得不到 200 的响应,应该把这个项目返回。我找不到办法,因为当我收到 302 时,scrapy 会对这个请求进行重试,而不是直接去 error_page 的错误处理。如果是 404 的话,它会去 error_page,但我不知道怎么在那边返回项目,因为我知道在错误处理里我拿到的是失败对象,而不是包含项目的响应对象。

提前谢谢你们!

1 个回答

2

你可以试试:

yield Request(a_url[0],
                meta={'item': aitem, 'dont_retry':1}, dont_filter=True,
                callback=self.redeem_url, 
                errback=lambda x:self.error_page(x,aitem))


def redeem_url(self, response):
   item = response.request.meta['item']
   item['Click_to_Redeem_URL'] = response.url
   yield item

这个 dont_retry 应该可以停止 scrapy 的重试机制:

http://readthedocs.org/docs/scrapy/en/latest/topics/downloader-middleware.html#module-scrapy.contrib.downloadermiddleware.retry

这个 lambda 应该可以让 aitem 传递到你的错误回调函数中。

撰写回答