【问题标题】:How can I group data scraped from multiple pages, using Scrapy, into one Item?如何使用 Scrapy 将从多个页面抓取的数据分组到一个项目中?
【发布时间】: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 方法更加实用。

标签: python scrapy


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    例如:

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

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

    【讨论】:

    • 我不是简单地计算事物,所以我认为这种方法不能满足我的需求。不过,这很有趣,我没有考虑过。谢谢!
    【解决方案3】:

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

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

    Refer to detailed tutorial I wrote here.

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多