Python 允许使用Scrapy图像管道重复下载吗?

Python 允许使用Scrapy图像管道重复下载吗?,python,scrapy,pipeline,Python,Scrapy,Pipeline,请参见下面我的代码的示例版本,它使用Scrapy Image管道从站点下载/刮取图像: import scrapy from scrapy_splash import SplashRequest from imageExtract.items import ImageextractItem class ExtractSpider(scrapy.Spider): name = 'extract' start_urls = ['url'] def parse(self,

请参见下面我的代码的示例版本,它使用Scrapy Image管道从站点下载/刮取图像:

import scrapy
from scrapy_splash import SplashRequest
from imageExtract.items import ImageextractItem

class ExtractSpider(scrapy.Spider):
    name = 'extract'
    start_urls = ['url']

    def parse(self, response):
        image = ImageextractItem()
        titles = ['a', 'b', 'c', 'd', 'e', 'f']
        rel = ['url1', 'url2', 'url3', 'url4', 'url5', 'url6']

        image['title'] = titles
        image['image_urls'] = rel
        return image

这一切工作正常,但根据默认设置,避免下载重复。是否有任何方法可以覆盖此内容,以便我也可以下载副本?谢谢。

我认为一个可能的解决方案是创建您自己的图像管道,该管道继承自
scrapy.pipelines.images.images.ImagesPipeline
,使用覆盖方法
get\u media\u requests
(参见示例)。在生成
scrapy.Request
的同时,将
don_filter=True
传递给构造函数。

我认为一个可能的解决方案是创建您自己的映像管道,该管道继承自
scrapy.pipelines.images.ImagesPipeline
,并使用重写的方法
获取媒体\u requests
(参见示例)。在生成
scrapy.Request
的同时,将
don_filter=True
传递给构造函数。

多亏了Tomáš的指导,最终我找到了下载重复图像的方法

在类的
MediaPipeline
\u进程\u请求中,我对这些行进行了注释

#如果已看到请求,则返回缓存结果
#如果下载了info.com中的fp:
#返回延迟结果(信息下载[fp])。添加回调(cb、eb)

#检查请求是否正在下载,以避免两次下载
#如果fp在info.downloading中:
#回卷


一个未打补丁的密钥错误可能会发生,但它似乎不会影响我的结果,所以我停止了进一步挖掘。

多亏了Tomáš的指导,最终我找到了下载重复图像的方法

在类的
MediaPipeline
\u进程\u请求中,我对这些行进行了注释

#如果已看到请求,则返回缓存结果
#如果下载了info.com中的fp:
#返回延迟结果(信息下载[fp])。添加回调(cb、eb)

#检查请求是否正在下载,以避免两次下载
#如果fp在info.downloading中:
#回卷


可能会发生未锁定的KeyError,但它似乎不会影响我的结果,因此我停止进一步挖掘。

为了克服Rick提到的KeyError,我做了以下工作:

在类
MediaPipeline
中查找函数
\u cache\u result\u和\u execute\u waiters
,您将看到类似的if情况,如下所示

if isinstance(result, Failure):
   # minimize cached information for failure 
   result.cleanFailure()
   result.frames = []
   result.stack = None
我添加了另一个if case来检查
fp
是否在
info.waiting
中,之后的所有内容都在这个case中

if fp in info.waiting:
    info.downloading.remove(fp)  
    info.downloaded[fp] = result  # cache result
    for wad in info.waiting.pop(fp):
        defer_result(result).chainDeferred(wad)

在调试日志中,您的scrapy项目的
“images”
中的路径名仍然不正确。但是我通过为我所有的
“image\u url”

创建一个图像名称列表,将其保存在正确的路径中。为了克服Rick提到的关键错误,我所做的是:

在类
MediaPipeline
中查找函数
\u cache\u result\u和\u execute\u waiters
,您将看到类似的if情况,如下所示

if isinstance(result, Failure):
   # minimize cached information for failure 
   result.cleanFailure()
   result.frames = []
   result.stack = None
我添加了另一个if case来检查
fp
是否在
info.waiting
中,之后的所有内容都在这个case中

if fp in info.waiting:
    info.downloading.remove(fp)  
    info.downloaded[fp] = result  # cache result
    for wad in info.waiting.pop(fp):
        defer_result(result).chainDeferred(wad)

在调试日志中,您的scrapy项目的
“images”
中的路径名仍然不正确。但是我通过为我所有的
“image\u url”
“image\u url”

创建一个图像名称列表,将其保存在正确的路径中。谢谢,我尝试了这个方法,但似乎不起作用。我怀疑图像管道源代码本身中可能存在一些“重复检测代码”——但通过查看代码,我似乎无法在任何地方找到它。如果我能找到它,我可能会更新它,这样我就可以在pass中传入一个自定义参数来跳过这个。我想我已经找到它了,看看类
MediaPipeline
()的方法
\u process\u request
。如果文件已经下载(基于请求指纹),它将从缓存中获取该文件。不幸的是,似乎没有办法用任何参数或设置来定制它。谢谢!我将尝试注释/调整一些源代码,看看是否能找到一种方法使其适用于我的应用程序。谢谢,我尝试了这个,但似乎不起作用。我怀疑图像管道源代码本身中可能存在一些“重复检测代码”——但通过查看代码,我似乎无法在任何地方找到它。如果我能找到它,我可能会更新它,这样我就可以在pass中传入一个自定义参数来跳过这个。我想我已经找到它了,看看类
MediaPipeline
()的方法
\u process\u request
。如果文件已经下载(基于请求指纹),它将从缓存中获取该文件。不幸的是,似乎没有办法用任何参数或设置来定制它。谢谢!我将尝试注释/调整一些源代码,看看是否能找到一种方法使其适用于我的应用程序。