Scrapy - 动态文件命名形式解析项
Scrapy - Dynamic file naming form parsed item
我正在为一家艺术博物馆开发抓取程序。
我是 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"
有什么方法可以实现吗?
当您在 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"
我正在为一家艺术博物馆开发抓取程序。
我是 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"
有什么方法可以实现吗?
当您在 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"