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

时间:2013-06-03 05:42:58

标签: scrapy sha1 hash-code-uniqueness

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

---老问题: 它是否检查以确保images_store文件夹下所有图像文件的文件名唯一性? Scrapy使用sha1在下载图像时生成随机文件名。 Sha1提供了很好的独特性,但是按概率,有可能重复。

2 个答案:

答案 0 :(得分:1)

不确定这是最好的解决方案,但是如果您基于ImagesPipeline管道创建自定义管道并覆盖image_key这样的方法会怎样(但是,尚未对其进行测试):

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

这只是一个示例 - 您可能希望改进该文件名更改逻辑。此外,您应该对thumb_key方法执行相同的操作。

希望有所帮助。

答案 1 :(得分:0)

你不应该关心它!

Scrapy使用图片网址sha1。如果发现SHA1碰撞的概率为50%,则需要大约2 ^ 80项。因此,除非您要抓取2 ^ 80个图像,否则图像文件名重复的可能性小于50%。实际上,您可以抓取超过1万亿个图像并简单地忽略文件名重复,因为这些可能性微不足道。