Scrapy使用sha1生成隨機圖像文件名。發生複製時,將覆蓋該文件,導致現有圖像文件丟失。 是否可以編寫額外的代碼(例如:重寫類)來處理重複。例如:繼續生成新的隨機文件名,直到找不到重複? 如果是,請提供代碼示例?如何處理scrapy圖像下載中的圖像文件名重複
---老問題: 它檢查以確保filename_store文件夾下的所有圖像文件的文件名唯一性嗎? Scrapy使用sha1在下載圖像時生成隨機文件名。 Sha1提供了很好的獨特性,但是可能性很大,有重複的機會。
Scrapy使用sha1生成隨機圖像文件名。發生複製時,將覆蓋該文件,導致現有圖像文件丟失。 是否可以編寫額外的代碼(例如:重寫類)來處理重複。例如:繼續生成新的隨機文件名,直到找不到重複? 如果是,請提供代碼示例?如何處理scrapy圖像下載中的圖像文件名重複
---老問題: 它檢查以確保filename_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使用圖片網址sha1。如果找到SHA1碰撞的概率爲50%,則需要大約2^80個項目。因此,除非您要抓取2^80張圖像,否則圖像文件名重複的機率小於50%。事實上,您可以抓取超過1萬億的圖像,並且簡單地忽略文件名重複,因爲機會是微不足道的。
根據定義,SHA1不能保證唯一性,並且存在重複的機會。根據[源代碼](https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/pipeline/images.py),scrapy只會重寫圖像,如果它存在相同的名稱。另請參閱:http://stackoverflow.com/questions/5388781/how-safely-can-i-assume-unicity-of-a-part-of-sha1-hash和http://stackoverflow.com/questions/3060259 /你的密碼哈希值,提供-真正器唯一結果。 – alecxe
@alecxe:感謝您的輸入。我已經將問題更新爲「如何處理scrapy圖像下載中的圖像文件名重複」 – learnJQueryUI