画像をダウンロードするには、名前のカスタムscrapy

最近のデータは、爬虫類の写真をクロールフェッチする必要があり、絵はsettings.pyに設定されているデフォルトのパイプラインを使用し始めました

  ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1}

しかし、絵の名前はカスタマイズすることができないが、ImagesPipelineを見つける絵コードのデフォルト名を見つけます

def file_path(self, request, response=None, info=None):
    ## start of deprecation warning block (can be removed in the future)
    def _warn():
        from scrapy.exceptions import ScrapyDeprecationWarning
        import warnings
        warnings.warn('ImagesPipeline.image_key(url) and file_key(url) methods are deprecated, '
                      'please use file_path(request, response=None, info=None) instead',
                      category=ScrapyDeprecationWarning, stacklevel=1)

    # check if called from image_key or file_key with url as first argument
    if not isinstance(request, Request):
        _warn()
        url = request
    else:
        url = request.url

    # detect if file_key() or image_key() methods have been overridden
    if not hasattr(self.file_key, '_base'):
        _warn()
        return self.file_key(url)
    elif not hasattr(self.image_key, '_base'):
        _warn()
        return self.image_key(url)
    ## end of deprecation warning block

    image_guid = hashlib.sha1(to_bytes(url)).hexdigest()  # change to request.url after deprecation
    return 'full/%s.jpg' % (image_guid)

つまりhashlib.sha1(to_bytes(url)).hexdigest()、urlhash値。絵のように情報の一部に関連付けられている必要があるので、溶液の三種類があります。

  • 図1に示すように、メッセージに直接ハッシュ画像のURLを記録
  • 2、カスタムImagesPipelineは、scrapy画像でカスタムの名前を渡します。
  • 3、カスタムImagesPipeline、名前ImagesPipelineに自分の画像を生成します

スキーム1をともかく、スキーム3を参照することができ、この 2人は、より拡張性を感じるプログラム。これは、画像記憶するアドレスと同様とすることができるIMAGES_URLS_FIELD処理方法、設定で構成しIMAGES_NAME_FIELD、かつそのように制御画像名scrapy、フィールド名に対応する画像として、パイプライン内のアイテムを読み出します。
具体的なコードは次のよう:

  • 1、scrapy name属性ImagenetItemを追加
item = ImagenetItem()
url = imgs[i]
item['src'] = [url]
item['name'] = url[-35: -3]
  • 2、でitems.pyで定義ピクチャアイテム。
class ImagenetItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    src = scrapy.Field()
    name = scrapy.Field()
    pass
  • 3、パイプラインの定義はpipeline.pyでcrapy.pipelines.images.ImagesPipelineを継承します
class PicPipeline(ImagesPipeline):
    IMAGES_NAME_FIELD = ''

    def __init__(self, store_uri, download_func=None, settings=None):
        super(ImagesPipeline, self).__init__(store_uri, settings=settings,
                                             download_func=download_func)

        if isinstance(settings, dict) or settings is None:
            settings = Settings(settings)

        resolve = functools.partial(self._key_for_pipe,
                                    base_class_name="PicPipeline",
                                    settings=settings)
        self.expires = settings.getint(
            resolve("IMAGES_EXPIRES"), self.EXPIRES
        )

        if not hasattr(self, "IMAGES_RESULT_FIELD"):
            self.IMAGES_RESULT_FIELD = self.DEFAULT_IMAGES_RESULT_FIELD
        if not hasattr(self, "IMAGES_URLS_FIELD"):
            self.IMAGES_URLS_FIELD = self.DEFAULT_IMAGES_URLS_FIELD

        self.images_urls_field = settings.get(
            resolve('IMAGES_URLS_FIELD'),
            self.IMAGES_URLS_FIELD
        )
        self.images_result_field = settings.get(
            resolve('IMAGES_RESULT_FIELD'),
            self.IMAGES_RESULT_FIELD
        )
        self.min_width = settings.getint(
            resolve('IMAGES_MIN_WIDTH'), self.MIN_WIDTH
        )
        self.min_height = settings.getint(
            resolve('IMAGES_MIN_HEIGHT'), self.MIN_HEIGHT
        )
        self.thumbs = settings.get(
            resolve('IMAGES_THUMBS'), self.THUMBS
        )
        self.images_name_field = settings.get(
            resolve('IMAGES_NAME_FIELD'),
            self.IMAGES_NAME_FIELD
        )

    def get_media_requests(self, item, info):
        return [Request(x, meta={'file_name': item.get(self.images_name_field, '')}) for x in item.get(self.images_urls_field, [])]

    def file_path(self, request, response=None, info=None):
        ## start of deprecation warning block (can be removed in the future)
        def _warn():
            from scrapy.exceptions import ScrapyDeprecationWarning
            import warnings
            warnings.warn('ImagesPipeline.image_key(url) and file_key(url) methods are deprecated, '
                          'please use file_path(request, response=None, info=None) instead',
                          category=ScrapyDeprecationWarning, stacklevel=1)

        # check if called from image_key or file_key with url as first argument
        if not isinstance(request, Request):
            _warn()
            url = request
        else:
            url = request.url

        image_guid = request.meta['file_name']  # change to request.url after deprecation
        return 'full/%s.jpg' % (image_guid)

実質的に、元のコードの変更で、images_name_field定義されたフィールドを集中、名前get_media_requests方法で初期値initはメタ属性要求を普及し、その後FILE_PATHプロセスの値を取得します。

  • 4、私達はちょうどsettings.pyで定義されているパイプラインを構成します。
ITEM_PIPELINES = {
   'tutorial.pipelines.PicPipeline': 1,
}

IMAGES_STORE = 'imagesDownload'
IMAGES_URLS_FIELD = 'src'#定义url字段
IMAGES_NAME_FIELD = 'name'#定义图片名字字段与item对应

これは、画像の名前としてIMAGES_NAME_FIELDフィールドを拡大していきます。

おすすめ

転載: www.cnblogs.com/xfrzrcj/p/11109645.html