使用混合内容刮取一组页面的最佳方法

时间:2015-07-21 10:37:34

标签: javascript json node.js web-scraping web-crawler

我正在尝试用他们今天的菜单显示办公室周围的午餐场所列表。但问题是提供午餐菜单的网站并不总是提供相同类型的内容。

例如,一些网站提供了一个不错的JSON输出。 Look at this one,它单独提供英语/芬兰语课程名称,我需要的一切都可用。还有其他几个这样的人。

但是其他人,并不总是有一个不错的输出。 Like this one。内容以纯HTML格式排列,英文和芬兰食品名称并未完全订购。此外,食物属性如(L,VL,VS,G等)也只是食物名称的正常文本。

在您看来,什么是以不同格式抓取所有这些可用数据并将其转换为可用数据的最佳方式?我尝试使用Node.js(& phantomjs等)制作一个刮刀,但它只适用于一个网站,并且在食品名称的情况下它并不准确。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以使用类似kimonolabs.com的内容,它们更易于使用,并且可以为您提供API来更新您的身边。 请记住,它们最适合表格数据内容。

答案 1 :(得分:1)

我有这个问题的简单算法解决方案,如果有一个所有可用食物名称的列表,这可能真的很有帮助,你会发现文件中出现食物名称(今天)。

如果没有食物清单,您可以使用TF / IDF。 TF / IDF允许计算当前文档中的文档内的单词的分数以及其他文档。但是这个解决方案需要足够的数据才能工作。

我认为最好的解决方案是这样的:

  1. 创建应废弃的所有可用网站的列表。
  2. 为每个网站数据编写驱动程序类。
  3. 每个驱动程序都有责任从其标准文档创建通用域实体。
  4. 如果您可以使用PHP,Simple HTML Dom ParserGuzzle将是一个很好的选择。这两个将提供一个类似jQuery的路径查找器和一个很好的包装器。它可以使用HTTP。

答案 2 :(得分:0)

你正在触及真正困难的问题。不幸的是,没有简单的解决方案。

实际上有两个不同的部分需要解决:

  1. 来自不同来源的数据抓取
  2. 数据集成
  3. 让我们从第一个问题开始 - 来自不同来源的数据抓取。在我的项目中,我通常分几步处理数据。我为我想要的所有特定网站提供专用的抓取工具,并按以下顺序处理它们:

    1. 获取原始页面(非结构化数据)
    2. 从页面提取数据(非结构化数据)
    3. 提取,转换数据并将数据映射到特定于页面的模型(完全结构化数据)
    4. 将数据从完全结构化模型映射到公共/规范化模型
    5. 步骤1-2是面向抓取的,步骤3-4是严格的数据提取/数据集成导向。

      虽然您可以使用自己的网络划分器或利用现有的Web服务轻松地实现步骤1-2,但数据集成是您案例中最困难的部分。您可能需要一些机器学习技术(浅层,特定领域的自然语言处理)以及自定义启发式方法。

      如果有像this one这样凌乱的输入,我会单独处理行并使用一些字典来删除芬兰语/英语单词并分析剩下的内容。但在这种情况下,由于人为输入错误的可能性,它永远不会100%准确。

      我也担心你的堆栈不太适合做这样的任务。对于这样的处理,我使用Java / Groovy和集成框架(Mule ESB / Spring Integration)来协调数据处理。

      总结:这是一个非常困难和复杂的问题。我宁愿假设输入数据覆盖率低于100%准确度(除非它确实值得)。