1

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

--- 老问题:是否检查以确保 images_store 文件夹下所有图像文件的文件名唯一性?Scrapy 在下载图像时使用 sha1 生成随机文件名。Sha1 提供了良好的唯一性,但从概率上讲,存在重复的机会。

4

2 回答 2

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方法执行相同的操作。

希望有帮助。

于 2013-06-03T21:41:20.290 回答
0

你不应该关心它!

Scrapy 使用图像 url sha1。为了有 50% 的概率找到 SHA1 冲突,您需要大约 2^80 个项目。所以,除非你要爬取 2^80 张图片,否则图片文件名重复的几率小于 50%。事实上,您可以抓取超过 1 万亿张图像并简单地忽略文件名重复,因为机会微不足道。

于 2016-11-15T03:44:57.173 回答