Scrapy-动态文件命名表单已解析项

Scrapy-动态文件命名表单已解析项,scrapy,scrapy-pipeline,Scrapy,Scrapy Pipeline,我正在为一家艺术博物馆做剪贴程序。 我不熟悉Scrapy框架,充其量只是python的中间版本 我需要从网站下载图像,并根据解析数据的值相应地命名它们。 我一直在浏览零碎的文档和谷歌搜索,但到目前为止运气不好。我被困在管道里了。 我知道在运行Scrapy with wrapper程序后如何修复文件名,但这似乎适得其反,而且草率。 从spider生成的每个项目如下所示: {'Artist': 'SomeArtist', ... 'Image Url': 'https://www.nationa

我正在为一家艺术博物馆做剪贴程序。
我不熟悉Scrapy框架,充其量只是python的中间版本
我需要从网站下载图像,并根据解析数据的值相应地命名它们。
我一直在浏览零碎的文档和谷歌搜索,但到目前为止运气不好。我被困在管道里了。
我知道在运行Scrapy with wrapper程序后如何修复文件名,但这似乎适得其反,而且草率。

从spider生成的每个项目如下所示:

{'Artist': 'SomeArtist',
 ...
 'Image Url': 'https://www.nationalgallery.org.uk/media/33219/n-1171-00-000049-hd.jpg',
 'Inventory number': 'NG1171'}
我需要用
“库存编号”

我成功地制作了一个定制管道,但没能按我想要的方式工作。
我得到的最接近的是这个,但它给许多图像分配了相同的
self.file\u name
值,结果失败得很惨

类下载管道(ImagesPipeline):
def获取媒体请求(自身、项目、信息):
#我发现的唯一一点是,在下载之前访问item dict
self.file_name=物料['Inventory number']
屈服请求(项目[“图像Url”])
def文件路径(self、request、response=None、info=None):
返回f“Images/{self.file_name}.jpg”
像这样的东西会很棒:

类下载管道(ImagesPipeline):
def文件路径(self、request、item、response=None、info=None):
文件名=物料[“库存编号”]
返回f“Images/{file_name}.jpg”

有什么方法可以让它工作吗?

当您在
获取媒体请求中生成请求时,您可以在meta参数中传递任意数据,因此您可以在
文件路径中作为请求属性进行访问

class DownloadPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        yield Request(
            url=item["Image Url"],
            meta={'inventory_number': item.get('Inventory number')}
        )
    
    def file_path(self, request, response=None, info=None):
        file_name = request.meta.get('inventory_number)
        return f"Images/{file_name}.jpg"

好主意!我不会想到的。这解决了我的问题!尽管需要一个小的修正:您的解决方案最初不起作用,并且在调试
response.meta时引发了
***AttributeError:'NoneType'对象没有属性“meta”
但是
request
有所需的元数据,所以只需将
response
更改为
request
就可以了,非常感谢再一次接得好。由于我非常习惯于在回调函数中获取
,所以我只键入了
响应
,但正如您注意到的,管道处理请求,因此您将在那里找到属性。刚刚修好。