scrapy - Scrapy - 动态文件命名表单解析项
问题描述
我正在为一家艺术博物馆开发抓取程序。
我是 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"
推荐阅读
- optimization - 是否有一种算法可以识别一组数字中相差一个数字的数字?
- google-apps-script - Google Apps 脚本返回错误“超出限制:URLFetch URL 长度”
- angularjs - Angularjs引导表选择所有复选框
- css - 当 id 包含使用 Nokogiri 的特殊字符时,如何抓取 URL/文本
- alfresco - 如何让 Alfresco 使用 alfresco-simple-content-stores 插件?
- swiftui - SwiftUI 偏好、transformPreference、onPreferenceChanged
- c# - 如何为 DTO 构建服务器 url
- r - 有没有办法提取 coeftest() 函数的 $R^2$ ?
- react-native - LottieView 垂直中心在 IOS 上不起作用
- javascript - 使用 React 如何在有和没有地址栏和标签的情况下调整 Mobile Safari 高度