我应该创建管道来保存草率文件吗?
我需要保存一个文件(.pdf),但不确定如何执行。我需要保存.pdfs并以某种方式将它们存储在一个目录中,就像它们存储在我要删除的站点上一样。
从我收集的数据中,我需要建立一个管道,但是据我所知,管道保存的“ Items”和“
items”只是基本数据,例如字符串/数字。保存文件是对管道的正确使用,还是应该将文件保存在Spider中?
-
是和否[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
)