我应该创建管道来保存草率文件吗?

发布于 2021-01-29 17:05:17

我需要保存一个文件(.pdf),但不确定如何执行。我需要保存.pdfs并以某种方式将它们存储在一个目录中,就像它们存储在我要删除的站点上一样。

从我收集的数据中,我需要建立一个管道,但是据我所知,管道保存的“ Items”和“
items”只是基本数据,例如字符串/数字。保存文件是对管道的正确使用,还是应该将文件保存在Spider中?

关注者
0
被浏览
37
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    是和否[1]。如果您获取一个pdf文件,它将被存储在内存中,但是如果pdf文件的大小不足以填满您的可用内存,那就可以了。

    您可以将PDF保存在Spider回调中:

    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]另一种方法可能是仅存储pdf的url,并使用另一种方法来获取文档而不会缓冲到内存中。(例如wget



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看