【问题标题】:Scrapy - Dynamic file naming form parsed itemScrapy - 动态文件命名表单解析项
【发布时间】:2020-08-25 23:44:40
【问题描述】:

我正在为一家艺术博物馆开发抓取程序。
我是 Scrapy 框架的新手,充其量是 python 中级
我需要从网站下载图像并使用解析数据的值相应地命名它们。
我一直在浏览 Scrapy 文档和 Google 搜索,但到目前为止还没有运气。我被困在管道上。
我知道如何在使用包装程序运行 Scrapy 后修复文件名,但这似乎适得其反且草率。

蜘蛛产生的每个项目如下所示:

{'Artist': 'SomeArtist',
 ...
 'Image Url': 'https://www.nationalgallery.org.uk/media/33219/n-1171-00-000049-hd.jpg',
 'Inventory number': 'NG1171'}

我需要给图片命名'Inventory number'

我设法制作了一个自定义管道,但没有让它按我想要的方式工作。
我得到的最接近的是这个,但它通过为许多图像分配相同的self.file_name 值而惨遭失败

class DownloadPipeline(ImagesPipeline):
         def get_media_requests(self, item, info):
             # The only point, that I've found, for accessing item dict before downloading
             self.file_name = item['Inventory number']
             yield Request(item["Image Url"])
    
         def file_path(self, request, response=None, info=None):
             return f"Images/{self.file_name}.jpg"

这样的东西会很棒:

class DownloadPipeline(ImagesPipeline):
    
         def file_path(self, request, item, response=None, info=None):
             file_name = item['Inventory number']
             return f"Images/{file_name}.jpg"

有什么办法可以做到吗?

【问题讨论】:

    标签: scrapy scrapy-pipeline


    【解决方案1】:

    当您在 get_media_requests 中产生请求时,您可以在元参数中传递任意数据,因此您可以在您的 file_path 方法中作为请求的属性进行访问。

    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"
    

    Read more here

    【讨论】:

    • 好主意!我不会这么想的。这解决了我的问题!虽然需要一个小修复:您的解决方案最初并没有工作,并且在调试时 response.meta raised: *** AttributeError: 'NoneType' object has no attribute 'meta' 但是 request 有所需的元数据,所以只需将 response 更改为 request 就可以了 非常感谢你一次又来了!
    • 不错的收获。因为我非常习惯于在回调函数中获取meta,所以我只输入了response,但是正如您注意到管道处理请求一样,您可以在此处找到该属性。刚刚修好。
    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 2020-06-04
    • 2018-08-04
    • 2021-06-20
    • 2017-10-10
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多