Scrapy:抓取大型PDF文件,而不将响应主体保留在内存中

uxhixvfz  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(150)

假设我想用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响应主体(只需要传递下来的计算值)。

e0uiprwp

e0uiprwp1#

parse_pdf函数中不加载整个pdf文件,尝试在start_requests内加载pdf文件,然后创建“python生成器”,以便从pdf文件中获取URL/模式,并使用通常的“yield Request”进一步分支(...)“方法的scrappy。这应该可以保存您从加载整个pdf文件到内存中,您仍然可以访问它的内容。
从上述建议的一部分,你有没有试过从pdf一次获取内容,并将其存储在csv文件中,而不是后期使用?这应该保存你从所有的麻烦,你有巨大的pdf文件(s).

相关问题