Python / Scrapy: пользовательский конвейер не имеет эффекта / загружает файлы с пользовательским именем файла - PullRequest
0 голосов
/ 21 февраля 2019

Это дополнительный вопрос к моему начальному вопросу .Я хочу скачать PDF-файлы и сохранить их на жестком диске с пользовательским именем файла.

Для пользовательского имени файла я попробовал этот код в своем 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-хешем, например: a8569143c987cdd43dd1f6d9a6f98b7aa6fbc284.PDF.Так что моя пользовательская функция file_path, похоже, не используется Scrapy.

Когда я закомментирую строку

'scrapy.pipelines.files.FilesPipeline': 2,

, ничего не будет загружено.

Я запутался...

1 Ответ

0 голосов
/ 21 февраля 2019

Ваша проблема в том, что ваш пользовательский конвейер не является реальным файловым конвейером, поэтому он ничего не делает.Вам нужно подкласс оригинал 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 здесь:

Невозможно переименовать загруженные изображения через конвейеры без использования item.py

Не удается переименовать загруженные изображения настраиваемым образом через конвейеры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...