2016-09-20 36 views
0

我知道,当管道被调用时,这意味着请求已经停止,一般我们应该做一些验证,基于提取的项目坚持作业,似乎没有任何意义在管道中获取请求。如何在scrapy管道中获取请求对象

但是我发现它在某些情况下可能有用,在我的应用程序中我使用了两条管道:FilesPipelineMysqlStorePipeline

提取项目时,FilesPipeline会尝试发送请求以获取项目的图像,并在完成后将其保存到数据库。

但是我同时使用一个下载中间件RandomProxy,它将从数据库中随机获取一个代理记录,并将其设置为请求元。但代理不授权可以一直使用。

因此,可能出现以下情况:

当检索项目,代理http://proxy1被使用,但它不能被使用,得益于重试中间件,scrapy将再次尝试,和其他代理http://proxy2是牵强db,如果可以使用,产生一个项目,然后FilesPipeline将尝试通过发送一个图像请求来下载该图像的请求,该请求将被代理填充,称为http://proxy3,一旦proxy3不能被使用,scrapy也会重试。但是在所有的重试过程中都有可能出现坏代理。然后该项目将被删除,因为没有绑定图像获取,它必须不能为空。

此外,图像请求不包含可能被服务器阻止的引用程序。

所以我想知道是否可以通过管道访问用于提取项目的原始请求。

这是可能的或其他建议?

回答

2

这里有两种方法:

  1. 虚拟字段添加到任何你在蜘蛛的代码要存储的项目。然后在项目管道中检索该值(并弹出该字段)。

  2. 而不是使用物品管道,请使用spider middleware。在其process_spider_output方法中,您可以访问响应和蜘蛛输出。

相关问题