如何解决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,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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。