如何在scrapy管道中获取请求对象

时间:2016-09-20 02:29:44

标签: python scrapy

我知道当调用管道时,意味着请求已经停止,通常我们应该做一些验证,根据提取的项目保持作业,似乎没有意义在管道中获取请求。

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

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

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

所以可能会发生以下情况:

当检索项目时,使用了代理http://proxy1,但由于重试中间件,它无法使用,scrapy将再次尝试,并且从db获取另一个代理http://proxy2,如果可以使用它,生成一个项目,然后FilesPipeline将尝试通过发送一个图像请求来下载项目的图像,该图像请求将填充代理,表示它是http://proxy3,一旦proxy3可以不用,scrapy也会重试。但是在所有重试过程中都有机会获得不良代理。然后该项目将被删除,因为没有绑定的图像必须是空的。

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

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

这是可能还是其他建议?

1 个答案:

答案 0 :(得分:2)

以下是两种方法:

  1. 在项目中添加一个虚拟字段,以便在蜘蛛代码中存储您想要的任何内容。然后在项目管道中检索值(并弹出字段)。

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