如何在scrapy图像下载中处理图像文件名复制
Scrapy使用sha1生成随机图像文件名。当发生复制时,它将覆盖文件,导致现有图像文件丢失。 是否可以编写额外的代码(例如:重写类)来处理重复。例如:不断生成新的随机文件名,直到找不到重复? 如果是,请提供代码示例 ---老问题: 它是否检查以确保images\u store文件夹下所有图像文件的文件名唯一性?如何在scrapy图像下载中处理图像文件名复制,scrapy,sha1,hash-code-uniqueness,Scrapy,Sha1,Hash Code Uniqueness,Scrapy使用sha1生成随机图像文件名。当发生复制时,它将覆盖文件,导致现有图像文件丢失。 是否可以编写额外的代码(例如:重写类)来处理重复。例如:不断生成新的随机文件名,直到找不到重复? 如果是,请提供代码示例 ---老问题: 它是否检查以确保images\u store文件夹下所有图像文件的文件名唯一性? Scrapy在下载图像时使用sha1生成随机文件名。Sha1提供了良好的唯一性级别,但很可能存在复制的机会 不确定这是最佳解决方案,但如果您基于ImagesPipelinepipeli
Scrapy在下载图像时使用sha1生成随机文件名。Sha1提供了良好的唯一性级别,但很可能存在复制的机会 不确定这是最佳解决方案,但如果您基于
ImagesPipeline
pipeline创建自定义管道,并像这样覆盖方法(尽管尚未测试),该怎么办
这只是一个示例-您可能希望改进文件名更改逻辑。此外,您应该对方法执行相同的操作
希望这会有所帮助。不确定这是最佳解决方案,但如果您基于
ImagesPipeline
pipeline创建自定义管道,并像这样覆盖方法(尽管尚未测试),该怎么办
这只是一个示例-您可能希望改进文件名更改逻辑。此外,您应该对方法执行相同的操作
希望这会有帮助。你不应该在意它
Scrapy使用图像url sha1。要有50%的概率找到SHA1碰撞,你需要大约2^80件物品。因此,除非您要抓取2^80个图像,否则图像文件名复制的几率小于50%。事实上,你可以抓取超过1万亿张图片,简单地忽略文件名复制,因为这样做的可能性很小。你不应该在意它
Scrapy使用图像url sha1。要有50%的概率找到SHA1碰撞,你需要大约2^80件物品。因此,除非您要抓取2^80个图像,否则图像文件名复制的几率小于50%。事实上,你可以抓取超过1万亿张图像,并简单地忽略文件名复制,因为这样做的可能性很小。SHA1根据定义并不保证唯一性,而且存在复制的可能性。根据,如果存在同名图像,scrapy只会重写该图像。另请参见:和。@alecxe:谢谢您的输入。我已将问题更新为“如何在scrapy image download中处理图像文件名复制”根据定义,SHA1不能保证唯一性,并且存在复制的机会。根据,如果存在同名图像,scrapy只会重写该图像。另请参见:和。@alecxe:谢谢您的输入。我已将问题更新为“如何在scrapy image下载中处理图像文件名复制”
import hashlib
import os
import random
import string
from scrapy.contrib.pipeline.images import ImagesPipeline
class CustomImagesPipeline(ImagesPipeline):
def image_key(self, url):
image_guid = hashlib.sha1(url).hexdigest()
# check if image already exists and add some random char to the file name
path_format = 'full/%s.jpg'
while True:
path = path_format % image_guid
if os.path.exists(path):
image_guid = image_guid + random.choice(string.letters)
else:
break
return path