Scrapy使用sha1生成随机图像文件名。发生重复时,它将覆盖该文件,从而导致丢失现有的图像文件。 是否可以编写额外的代码(例如:重写类)来处理重复。例如:继续生成新的随机文件名,直到找不到重复? 如果是,请提供代码示例?
---老问题: 它是否检查以确保images_store文件夹下所有图像文件的文件名唯一性? Scrapy使用sha1在下载图像时生成随机文件名。 Sha1提供了很好的独特性,但是按概率,有可能重复。
答案 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万亿个图像并简单地忽略文件名重复,因为这些可能性微不足道。