我正在尝试收集有关一堆不同网站的一些信息。我想为每个网站生成一个Item
,总结我在该网站上找到的信息,无论我在哪个网页上找到它。
我觉得这应该是一个项目管道,就像duplicates filter示例一样,除了我需要Item
的最终内容,而不是爬虫检查的第一页的结果。
因此,我尝试使用request.meta
通过针对给定网站的各种Item
传递单个部分填充的Request
。为了完成这项工作,我必须让我的解析回调每次调用返回一个新的Request
,直到它没有更多的页面可访问,然后最终返回完成的Item
。如果我找到了我想要遵循的多个链接,那将是一种痛苦,如果调度程序因链接周期而抛弃其中一个请求,则会完全中断。
我能看到的另一种方法是将蜘蛛输出转储到json-lines并使用外部工具对其进行后处理。但我宁愿把它折叠成蜘蛛,最好是在中间件或物品管道中。我怎么能这样做?
答案 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)