1

Scrapy は sha1 を使用してランダムな画像ファイル名を生成します。重複が発生すると、ファイルが上書きされ、既存のイメージ ファイルが失われます。重複を処理するために追加のコード (例: オーバーライド クラス) を書くことは可能ですか? たとえば、重複が見つからなくなるまで、新しいランダムなファイル名を生成し続けますか? はいの場合、コード例を提供してください。

--- 古い質問: images_store フォルダーの下にあるすべての画像ファイルのファイル名が一意であることを確認しますか? Scrapy は、画像のダウンロード中に sha1 を使用してランダムなファイル名を生成します。Sha1 は優れたレベルの一意性を提供しますが、確率によって重複の可能性があります。

4

2 に答える 2

1

これが最善の解決策かどうかはわかりませんが、カスタム パイプラインをパイプラインに基づいて作成し、image_keyImagesPipelineメソッドを次のようにオーバーライドするとどうなるでしょうか(ただし、テストしていません)。

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 を使用します。また、SHA1 衝突を 50% の確率で検出するには、約 2^80 個のアイテムが必要です。したがって、2^80 の画像をクロールしない限り、画像ファイル名が重複する可能性は 50% 未満です。実際、1 兆をはるかに超える画像をクロールでき、可能性はわずかであるため、ファイル名の重複を単純に無視できます。

于 2016-11-15T03:44:57.173 に答える