2013-06-03 93 views
1

Scrapy使用sha1生成隨機圖像文件名。發生複製時,將覆蓋該文件,導致現有圖像文件丟失。 是否可以編寫額外的代碼(例如:重寫類)來處理重複。例如:繼續生成新的隨機文件名,直到找不到重複? 如果是,請提供代碼示例?如何處理scrapy圖像下載中的圖像文件名重複

---老問題: 它檢查以確保filename_store文件夾下的所有圖像文件的文件名唯一性嗎? Scrapy使用sha1在下載圖像時生成隨機文件名。 Sha1提供了很好的獨特性,但是可能性很大,有重複的機會。

+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

+0

@alecxe:感謝您的輸入。我已經將問題更新爲「如何處理scrapy圖像下載中的圖像文件名重複」 – learnJQueryUI

回答

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

希望有所幫助。

0

你不應該在乎它!

Scrapy使用圖片網址sha1。如果找到SHA1碰撞的概率爲50%,則需要大約2^80個項目。因此,除非您要抓取2^80張圖像,否則圖像文件名重複的機率小於50%。事實上,您可以抓取超過1萬億的圖像,並且簡單地忽略文件名重複,因爲機會是微不足道的。