Да и нет [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
)