对于我的项目,我一直在使用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)