Python / Scrapy:自定义管道无效/下载具有自定义文件名的文件

时间:2019-02-21 09:44:47

标签: python scrapy

这是我的initial question的后续问题。 我想下载PDF并使用自定义文件名将其保存在硬盘上。

对于自定义文件名,我根据此recommendationpipelines.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,

什么都不会下载。

我很困惑...

1 个答案:

答案 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