Должен ли я создать конвейер для сохранения файлов с помощью scrapy? - PullRequest
13 голосов
/ 19 августа 2011

Мне нужно сохранить файл (.pdf), но я не уверен, как это сделать. Мне нужно сохранить файлы .pdf и хранить их таким образом, чтобы они были организованы в каталоги, как они хранятся на сайте, который я их удаляю.

Из того, что я могу собрать, мне нужно создать конвейер, но из того, что я понимаю, конвейеры спасают "Элементы" и "элементы" - это просто базовые данные, такие как строки / числа. Является ли сохранение файлов правильным использованием конвейеров, или я должен вместо этого сохранять файл в spider?

Ответы [ 3 ]

14 голосов
/ 24 августа 2011

Да и нет [1]. Если вы извлечете PDF-файл, он будет сохранен в памяти, но если PDF-файлы недостаточно велики, чтобы заполнить вашу доступную память, все в порядке.

Вы можете сохранить PDF в обратном вызове паука:

def parse_listing(self, response):
    # ... extract pdf urls
    for url in pdf_urls:
        yield Request(url, callback=self.save_pdf)

def save_pdf(self, response):
    path = self.get_path(response.url)
    with open(path, "wb") as f:
        f.write(response.body)

Если вы решите сделать это в конвейере:

# in the spider
def parse_pdf(self, response):
    i = MyItem()
    i['body'] = response.body
    i['url'] = response.url
    # you can add more metadata to the item
    return i

# in your pipeline
def process_item(self, item, spider):
    path = self.get_path(item['url'])
    with open(path, "wb") as f:
        f.write(item['body'])
    # remove body and add path as reference
    del item['body']
    item['path'] = path
    # let item be processed by other pipelines. ie. db store
    return item

[1] другим подходом может быть только сохранение URL-адресов PDF-файлов и использование другого процесса для извлечения документов без буферизации в памяти. (например, wget)

7 голосов
/ 05 ноября 2013

Существует FilePipeline, который вы можете использовать напрямую, если у вас уже есть URL файла, ссылка показывает, как использовать FilesPipeline :

https://groups.google.com/forum/print/msg/scrapy-users/kzGHFjXywuY/O6PIhoT3thsJ

3 голосов
/ 21 августа 2011

Это идеальный инструмент для работы. Scrapy работает так, что у вас есть пауки, которые превращают веб-страницы в структурированные данные (элементы). Конвейеры - это постпроцессоры, но они используют ту же асинхронную инфраструктуру, что и пауки, поэтому они идеально подходят для извлечения медиа-файлов.

В вашем случае вы сначала извлечете местоположение PDF-файлов в пауке, извлечете их в конвейере и получите другой конвейер для сохранения элементов.

...