如何在scrapy图像下载中处理图像文件名复制

如何在scrapy图像下载中处理图像文件名复制,scrapy,sha1,hash-code-uniqueness,Scrapy,Sha1,Hash Code Uniqueness,Scrapy使用sha1生成随机图像文件名。当发生复制时,它将覆盖文件,导致现有图像文件丢失。 是否可以编写额外的代码(例如:重写类)来处理重复。例如:不断生成新的随机文件名,直到找不到重复? 如果是,请提供代码示例 ---老问题: 它是否检查以确保images\u store文件夹下所有图像文件的文件名唯一性? Scrapy在下载图像时使用sha1生成随机文件名。Sha1提供了良好的唯一性级别,但很可能存在复制的机会 不确定这是最佳解决方案,但如果您基于ImagesPipelinepipeli

Scrapy使用sha1生成随机图像文件名。当发生复制时,它将覆盖文件,导致现有图像文件丢失。 是否可以编写额外的代码(例如:重写类)来处理重复。例如:不断生成新的随机文件名,直到找不到重复? 如果是,请提供代码示例

---老问题: 它是否检查以确保images\u store文件夹下所有图像文件的文件名唯一性?
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