【发布时间】:2013-04-06 22:42:57
【问题描述】:
我正在尝试收集有关一堆不同网站的一些信息。我想为每个站点生成一个 Item 来总结我在该站点上找到的信息,无论我在哪个页面上找到它。
我觉得这应该是一个项目管道,就像 duplicates filter 示例一样,除了我需要 Item 的最终内容,而不是爬虫检查的第一页的结果。
所以我尝试使用request.meta 将单个部分填充的Item 传递给给定站点的各种Requests。为了完成这项工作,我必须让我的解析回调每次调用都返回一个新的Request,直到它没有更多的页面可以访问,然后最终返回完成的Item。如果我找到多个我想关注的链接,这会很痛苦,如果调度程序由于链接周期而丢弃其中一个请求,则会完全中断。
我能看到的唯一其他方法是将蜘蛛输出转储到 json-lines 并使用外部工具对其进行后处理。但我更喜欢将它折叠到蜘蛛中,最好是在中间件或项目管道中。我该怎么做?
【问题讨论】:
-
这个丑陋的解决方案怎么样?在用于存储每个站点数据的管道上定义字典 (defaultdict(list))。在 process_item 中,您只需将 dict(item) 附加到每个站点项目的列表并引发 DropItem 异常。然后,在
close_spider方法中,您可以将数据转储到您想要的任何位置。对不起,如果它不适合你。 -
嘿@AlexanderAfanasiev,有趣的方法!我没有考虑使用项目管道的
close_spider方法。我认为这可行。我希望有人会提出一种更清洁的方法,但如果您将您的建议作为答案添加,我可能会在几天内接受它。谢谢! -
嘿,我已添加评论作为答案。如果它不起作用,请考虑提供蜘蛛的代码。谢谢。
-
嘿 Jamey Sharp,我也遇到了同样的情况,你是怎么解决你的问题的?,谢谢
-
@JoeCabezas,我认为我从未找到满意的解决方案......但我认为 Scrapy 在某些时候改变为提供成功和错误回调,我认为这意味着你即使您的某些请求被丢弃,也可以确保您的蜘蛛程序继续运行,从而使
request.meta方法更加实用。