Scrapy 使用 sha1 生成随机图像文件名。发生重复时,它将覆盖文件,导致现有图像文件丢失。是否可以编写额外的代码(例如:覆盖类)来处理重复。例如:不断生成新的随机文件名,直到找不到重复?如果是,请提供代码示例?
--- 老问题:是否检查以确保 images_store 文件夹下所有图像文件的文件名唯一性?Scrapy 在下载图像时使用 sha1 生成随机文件名。Sha1 提供了良好的唯一性,但从概率上讲,存在重复的机会。
Scrapy 使用 sha1 生成随机图像文件名。发生重复时,它将覆盖文件,导致现有图像文件丢失。是否可以编写额外的代码(例如:覆盖类)来处理重复。例如:不断生成新的随机文件名,直到找不到重复?如果是,请提供代码示例?
--- 老问题:是否检查以确保 images_store 文件夹下所有图像文件的文件名唯一性?Scrapy 在下载图像时使用 sha1 生成随机文件名。Sha1 提供了良好的唯一性,但从概率上讲,存在重复的机会。
不确定这是最好的解决方案,但是如果您基于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方法执行相同的操作。
希望有帮助。
你不应该关心它!
Scrapy 使用图像 url sha1。为了有 50% 的概率找到 SHA1 冲突,您需要大约 2^80 个项目。所以,除非你要爬取 2^80 张图片,否则图片文件名重复的几率小于 50%。事实上,您可以抓取超过 1 万亿张图像并简单地忽略文件名重复,因为机会微不足道。