更改草率的下载映像名称

时间:2019-06-11 23:34:52

标签: python scrapy

对于我的项目,我一直在使用ImagesPipeline下载图像。图像以与文件名URL的SHA1哈希对应的文件名存储。

我的问题是如何更改名称以包含存储在item['image_name']中的另一个scrapy字段的名称

我之前一直在研究多个问题,包括:  How can I change the scrapy download image name in pipelines?。   Scrapy image download how to use custom filename。但是,我无法使这些方法中的任何一种起作用。尤其是2017年的答案,因为那是我能找到的最接近Scrapy 1.6的答案。  根据我的理解,查看scrapy.pipelines.images.py文件是重命名文件的想法源自重写file_path函数,该函数返回'full/%s.jpg' % (image_guid)
为此,我假定必须请求特定项目容器并将其存储在get_media_request函数的元数据中。 我还是很困惑,因为我不清楚这是如何访问图像项字段的,这似乎是蜘蛛运行时路径发生的位置。
不过,我不确定这个过程,因此非常感谢您提供一些帮助。

我当前的Pipelines.py代码

class ImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        img_url = item['image_url']
        meta = {'filename': item['image_name']}
        yield Request(url=img_url, meta=meta)

    def file_path(self, request, response=None, info=None):
        image_guid = request.meta.get('filename', '')
        return 'full/%s.jpg' % (image_guid)

“ image_name”字段已正确更新,但是在“ images”字段中,“ path”仍然是Url的SHA1哈希
------------------------------ 解决方案 ------------ ----------------------
已经找到解决该问题的方法。主要问题是我不了解要覆盖管道,必须主动将其调用到程序中。以下是解决此问题的代码。
pipelines.py

class CustomImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        return [Request(x, meta={'filename': item['image_name']}) for x in item.get(self.images_urls_field, [])]

    def file_path(self, request, response=None, info=None):
        image_guid = request.meta.get('filename', '')
        return 'full/%s.jpg' % (image_guid)

settings.py

ITEM_PIPELINES = {'basicimage.pipelines.CustomImagesPipeline': 1,}

basicimage是我的个人项目名称。之后,我可以稍微修改一下代码,也可以如下更改目录文件夹名称。

class CustomImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        meta = {'filename': item['image_name'], 'directoryname': item['directory']}
        for x in item.get(self.images_urls_field, []):
            return Request(x, meta=meta)

    def file_path(self, request, response=None, info=None):
        image_guid = request.meta.get('filename', '')
        image_direct = request.meta.get('directoryname', '')
        return '%s/%s.jpg' % (image_direct, image_guid)

0 个答案:

没有答案