抓取混合内容页面的最佳方法

Best way to scrape a set of pages with mixed content

本文关键字:最佳 方法 混合 抓取      更新时间:2023-09-26

我正在试着展示办公室周围的午餐场所和他们今天的菜单。但问题是,提供午餐菜单的网站,并不总是提供相同的内容。

例如,一些网站提供了很好的JSON输出。看看这个,它分别提供了英语和芬兰语的课程名称,我需要的一切都可以得到。还有几个这样的例子

但是其他人,并不总是有一个好的输出。比如这个。内容以纯HTML格式显示,英文和芬兰语的食品名称并没有精确排序。此外,食物属性(L, VL, VS, G等)只是像食物名称一样的普通文本。

在你看来,什么是最好的方法,以不同的格式刮取所有这些可用的数据,并把它们变成可用的数据?我试着用Node.js (&Phantomjs等),但它只适用于一个网站,在食物名称的情况下,它不是那么准确。

你可以使用像kimonolabs.com这样的东西,他们更容易使用,他们给你api来更新你的端。请记住,它们最适合表格数据内容。

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

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

我认为最好的解决办法是这样的:

  1. 创建一个所有可用的网站应该被废弃的列表。
  2. 为每个网站数据编写驱动类
  3. 每个驱动程序都有责任从其标准文档中创建通用域实体。
如果你可以使用PHP,简单的HTML Dom解析器和Guzzle将是一个很好的选择。这两个将提供一个类似jQuery的寻径器和一个很好的HTTP包装。

你碰到了一个真正的难题。不幸的是,没有简单的解决办法。

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

  1. 从不同来源抓取数据
  2. 数据集成

让我们从第一个问题开始——从不同来源抓取数据。在我的项目中,我通常分几个步骤处理数据。对于我想要的所有特定网站,我都有专门的抓取器,并按以下顺序处理它们:

  1. 获取原始页面(非结构化数据)
  2. 从页面中提取数据(非结构化数据)
  3. 提取、转换和映射数据到特定页面的模型(完全结构化的数据)
  4. 将数据从完全结构化模型映射到公共/规范化模型

步骤1-2是面向抓取的,步骤3-4是严格面向数据提取/数据集成的。

虽然你可以很容易地实现步骤1-2相对容易使用自己的webscraper或利用现有的web服务-数据集成是最困难的部分,在你的情况下。你可能需要一些机器学习技术(浅层的、特定领域的自然语言处理)以及自定义启发式。

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

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

总而言之:这真是一个既困难又复杂的问题。我宁愿假设更少的输入数据覆盖,而不是目标是100%准确(除非它真的值得)。