如何将使用Scrapy从多个页面中抓取的数据分组到一个项目中?

时间:2013-04-06 22:42:57

标签: python scrapy

我正在尝试收集有关一堆不同网站的一些信息。我想为每个网站生成一个Item,总结我在该网站上找到的信息,无论我在哪个网页上找到它。

我觉得这应该是一个项目管道,就像duplicates filter示例一样,除了我需要Item的最终内容,而不是爬虫检查的第一页的结果。

因此,我尝试使用request.meta通过针对给定网站的各种Item传递单个部分填充的Request。为了完成这项工作,我必须让我的解析回调每次调用返回一个新的Request,直到它没有更多的页面可访问,然后最终返回完成的Item。如果我找到了我想要遵循的多个链接,那将是一种痛苦,如果调度程序因链接周期而抛弃其中一个请求,则会完全中断。

我能看到的另一种方法是将蜘蛛输出转储到json-lines并使用外部工具对其进行后处理。但我宁愿把它折叠成蜘蛛,最好是在中间件或物品管道中。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

这个丑陋的解决方案怎么样?

在管道上定义字典(defaultdict(list))以存储每站点数据。在process_item中,您只需将dict(item)附加到每个站点项的列表中,然后引发DropItem异常。然后,在close_spider方法中,您可以将数据转储到您想要的任何位置。

理论上应该有效,但我不确定这个解决方案是最好的解决方案。

答案 1 :(得分:0)

如果您想要摘要,Stats Collection将是另一种方法 http://doc.scrapy.org/en/0.16/topics/stats.html

例如:

在每个网站中抓取总页面数。使用以下代码。

stats.inc_value('pages_crawled:%s'%socket.gethostname())

答案 2 :(得分:0)

当我编写爬虫时,我遇到了同样的问题。

我通过将元素列表传递给元标记并将它们链接在一起来解决了这个问题。

Refer to detailed tutorial I wrote here.