Python 允许使用Scrapy图像管道重复下载吗?
请参见下面我的代码的示例版本,它使用Scrapy Image管道从站点下载/刮取图像: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,
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
。如果文件已经下载(基于请求指纹),它将从缓存中获取该文件。不幸的是,似乎没有办法用任何参数或设置来定制它。谢谢!我将尝试注释/调整一些源代码,看看是否能找到一种方法使其适用于我的应用程序。