6

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

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

因此,我尝试使用给定站点的各种srequest.meta传递单个部分填充的内容。为了完成这项工作,我必须让我的 parse 回调每次调用都返回一个新的,直到它没有更多的页面可以访问,然后最终返回完成的. 如果我找到多个我想关注的链接,这会很痛苦,如果调度程序由于链接周期而丢弃其中一个请求,则会完全中断。ItemRequestRequestItem

我能看到的唯一其他方法是将蜘蛛输出转储到 json-lines 并使用外部工具对其进行后处理。但我更喜欢将它折叠到蜘蛛中,最好是在中间件或项目管道中。我怎样才能做到这一点?

4

3 回答 3

4

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

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

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

于 2013-04-07T06:10:22.897 回答
0

如果你想要总结,统计收集将是另一种方法 http://doc.scrapy.org/en/0.16/topics/stats.html

例如:

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

stats.inc_value('pages_crawled:%s'%socket.gethostname())
于 2013-04-06T23:51:14.680 回答
0

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

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

参考我在这里写的详细教程。

于 2016-02-16T08:18:15.450 回答