7

This is a question about scrapy.

When storing items in a database, why is conventional to implement via a pipeline rather than the Feed Export mechanism?

Feed Exports - Output your scraped data using different formats and storages

One of the most frequently required features when implementing scrapers is being able to store the scraped data properly

Item Pipeline - Post-process and store your scraped data

Typical use for item pipelines are... storing the scraped item in a database

What's the difference, pros/cons between the two, and (why) is the pipeline more suitable?

Thx

4

3 回答 3

8

这是一个太晚的答案。但我只是花了一个下午和一个晚上的时间试图了解项目管道饲料出口之间的区别,这是记录不充分的。而且我认为这对仍然感到困惑的人会有所帮助。

TL;DR: FeedExport 旨在将项目导出为文件。它完全不适合数据库存储。

Feed 导出是作为 scrapy in 的扩展实现的scrapy.extensions.feedexport。这样,就像scrapy中的其他扩展一样,它反过来通过注册回调函数来实现一些scrapy信号(open_spiderclose_spideritem_scraped),以便它可以采取必要的步骤来存储项目。

open_spider, FeedExporter(实际的扩展类)初始化提要存储和项目导出器时。具体步骤包括从 a 获取一个通常是临时文件的类文件对象并将其FeedStroage传递给ItemExporter. 时item_scrapedFeedExporter只需调用一个预先初始化的ItemExporter对象export_item。时close_spiderFeedExporter调用store前一个FeedStorage对象的方法将文件写入文件系统,上传到远程 FTP 服务器,上传到 S3 存储等。

有一组内置的项目导出器和存储。但正如您从上面的文字中可能注意到的那样,FeedExporter它在设计上与文件存储紧密耦合。使用数据库时,存储项目的常用方法是在数据被抓取后立即将其插入数据库(或者您可能需要一些缓冲区)。

因此,使用数据库存储的正确方法似乎是编写自己的FeedExporter. 您可以通过注册对scrapy信号的回调来实现它。但这不是必须的,使用 item pipeline 更直接,不需要了解这些实现细节。

于 2018-04-28T16:19:29.030 回答
3

据我所理解:

管道是一个通用的解决方案——你建立数据库连接,你知道数据库结构,你检查重复项——你可以控制存储抓取项目的所有过程。

导出器是存储抓取数据的预定义方式。报价

如果您赶时间,只想使用 Item Exporter 输出抓取的数据,请参阅 Feed 导出。

于 2012-04-18T10:19:59.753 回答
0

如果您可以使用默认格式,Feed Export 将非常有用。如果您需要自定义格式,则必须编写自定义导出器,这比简单地将数据存储在管道中要多。

于 2012-04-18T09:43:17.773 回答