我应该创建管道来使用scrapy保存文件吗?

时间:2011-08-19 14:51:46

标签: python scrapy web-crawler pipeline

我需要保存文件(.pdf),但我不确定该怎么做。我需要保存.pdfs并以这样的方式存储它们,使它们组织在一个目录中,就像它们存储在网站上一样,我将它们刮掉。

从我可以收集到的东西,我需要制作一个管道,但从我理解的管道保存"项目"和"项目"只是字符串/数字等基本数据。保存文件是否正确使用管道,或者我应该将文件保存在蜘蛛中呢?

3 个答案:

答案 0 :(得分:14)

是和否[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]另一种方法可能只存储pdfs的url并使用另一个进程来获取文档而不缓冲到内存中。 (例如wget

答案 1 :(得分:7)

您可以直接使用FilesPipeline,假设您已经拥有文件网址,该链接会显示如何使用FilesPipeline

https://groups.google.com/forum/print/msg/scrapy-users/kzGHFjXywuY/O6PIhoT3thsJ

答案 2 :(得分:3)

这是一个完美的工具。 Scrapy的工作方式是您拥有将网页转换为结构化数据(项目)的蜘蛛。管道是后处理器,但它们使用与蜘蛛相同的异步基础设施,因此它非常适合于获取媒体文件。

在您的情况下,您首先要在spider中提取PDF的位置,在管道中获取它们并使用另一个管道来保存项目。