假设我想用Scrapy抓取一个1GB的PDF,然后在后续的请求中使用抓取的PDF数据......我如何在内存中不保留1GB响应主体的情况下实现这一点?
(伪代码:)
class MySpider:
def start_requests(self):
return Request('https://my-large-pdf.pdf', self.parse_pdf)
def parse_pdf(self, pdf_response):
some_calculated_value = my_pdf_reader(pdf_response.body)
for i in range(1000):
yield Request(f'another-interesting-file-{i}.html', self.parse_interesting_file, cb_kwargs=dict(some_calculated_value=some_calculated_value))
def parse_interesting_file(self, file_response, some_calculated_value=None):
title = file_response.css('h1')
yield { title: f'{title} {some_calculated_value}' }
这1GB的数据会一直保留在内存中,直到1000个有趣文件中的所有项都被抓取,而我不再需要PDF响应主体(只需要传递下来的计算值)。
1条答案
按热度按时间e0uiprwp1#
在parse_pdf函数中不加载整个pdf文件,尝试在start_requests内加载pdf文件,然后创建“python生成器”,以便从pdf文件中获取URL/模式,并使用通常的“yield Request”进一步分支(...)“方法的scrappy。这应该可以保存您从加载整个pdf文件到内存中,您仍然可以访问它的内容。
从上述建议的一部分,你有没有试过从pdf一次获取内容,并将其存储在csv文件中,而不是后期使用?这应该保存你从所有的麻烦,你有巨大的pdf文件(s).