这是我的initial question的后续问题。 我想下载PDF并使用自定义文件名将其保存在硬盘上。
对于自定义文件名,我根据此recommendation在pipelines.py
中尝试了以下代码:
class PrangerPipeline(object):
def process_item(self, item, spider):
return item
def file_path(self, request, response=None, info=None):
original_path = super(PrangerPipeline, self).file_path(request, response=None, info=None)
sha1_and_extension = original_path.split('/')[1] # delete 'full/' from the path
return request.meta.get('filename','') + "_" + sha1_and_extension
def get_media_requests(self, item, info):
file_url = item['file_url']
meta = {'filename': item['name']}
yield Request(url=file_url, meta=meta)
在我的settings.py
中,我有:
ITEM_PIPELINES = {
'pranger.pipelines.PrangerPipeline': 1,
'scrapy.pipelines.files.FilesPipeline': 2,
}
但是文件仅使用SHA1-hash进行保存,例如:a8569143c987cdd43dd1f6d9a6f98b7aa6fbc284.PDF。因此,我的自定义file_path
函数似乎未被Scrapy使用。
当我注释掉该行
'scrapy.pipelines.files.FilesPipeline': 2,
什么都不会下载。
我很困惑...
答案 0 :(得分:1)
您的问题是您的自定义管道不是真正的文件管道,因此它什么也不做。您需要子类原始的FilesPipeline
,然后在设置中仅使用PrangerPipeline
。
例如:
pipelines.py
:
from scrapy.pipelines.files import FilesPipeline
class PrangerPipeline(FilesPipeline):
# Don't override process_item. The parent class handles it.
def file_path(self, request, response=None, info=None):
# ...
def get_media_requests(self, item, info):
# ...
settings.py
:
ITEM_PIPELINES = {
'pranger.pipelines.PrangerPipeline': 1,
}
在此处使用ImagesPipeline
引用我的示例:
Unable to rename downloaded images through pipelines without the usage of item.py
Trouble renaming downloaded images in a customized manner through pipelines