抓取混合内容页面的最佳方法
Best way to scrape a set of pages with mixed content
我正在试着展示办公室周围的午餐场所和他们今天的菜单。但问题是,提供午餐菜单的网站,并不总是提供相同的内容。
例如,一些网站提供了很好的JSON输出。看看这个,它分别提供了英语和芬兰语的课程名称,我需要的一切都可以得到。还有几个这样的例子
但是其他人,并不总是有一个好的输出。比如这个。内容以纯HTML格式显示,英文和芬兰语的食品名称并没有精确排序。此外,食物属性(L, VL, VS, G等)只是像食物名称一样的普通文本。
在你看来,什么是最好的方法,以不同的格式刮取所有这些可用的数据,并把它们变成可用的数据?我试着用Node.js (&Phantomjs等),但它只适用于一个网站,在食物名称的情况下,它不是那么准确。
你可以使用像kimonolabs.com这样的东西,他们更容易使用,他们给你api来更新你的端。请记住,它们最适合表格数据内容。
对于这个问题,我有简单的算法解决方案,如果有一个所有可用的食物名称的列表,这可能真的很有帮助,你可以在文档中找到一个食物名称的出现(对于今天)。
如果没有食物列表,可以使用TF/IDF。TF/IDF允许在当前文档和其他文档中计算文档中单词的分数。但是这个解决方案需要足够的数据来工作。
我认为最好的解决办法是这样的:
- 创建一个所有可用的网站应该被废弃的列表。
- 为每个网站数据编写驱动类
- 每个驱动程序都有责任从其标准文档中创建通用域实体。
你碰到了一个真正的难题。不幸的是,没有简单的解决办法。
实际上有两个不同的部分需要解决:
- 从不同来源抓取数据
- 数据集成
让我们从第一个问题开始——从不同来源抓取数据。在我的项目中,我通常分几个步骤处理数据。对于我想要的所有特定网站,我都有专门的抓取器,并按以下顺序处理它们:
- 获取原始页面(非结构化数据)
- 从页面中提取数据(非结构化数据)
- 提取、转换和映射数据到特定页面的模型(完全结构化的数据)
- 将数据从完全结构化模型映射到公共/规范化模型
步骤1-2是面向抓取的,步骤3-4是严格面向数据提取/数据集成的。
虽然你可以很容易地实现步骤1-2相对容易使用自己的webscraper或利用现有的web服务-数据集成是最困难的部分,在你的情况下。你可能需要一些机器学习技术(浅层的、特定领域的自然语言处理)以及自定义启发式。
如果像这样一个混乱的输入,我会单独处理行,并使用一些字典来删除芬兰语/英语单词并分析剩下的内容。但在这种情况下,由于可能存在人为输入错误,它永远不会100%准确。
我也担心你的堆栈不太适合做这样的任务。对于这样的处理,我使用Java/Groovy以及集成框架(Mule ESB/Spring integration)来协调数据处理。
总而言之:这真是一个既困难又复杂的问题。我宁愿假设更少的输入数据覆盖,而不是目标是100%准确(除非它真的值得)。- 有条件更新d3.js力图中节点的最佳方法
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- 从数组中删除元素的最佳方法是:javascript/jquery
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 列出没有 mysql 的元素的最佳方法是什么
- 在jquery库中重新定义方法的最佳方法
- Javascript,用vars创建对象的最佳方法
- 使用 jQuery 从 HTML 中获取某些值的最佳方法
- 在变量中保存值的最佳方法是在应用程序关闭后使用,然后使用apachecordova在android中重新启动
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 用jasmine测试JavaScriptUI的最佳方法
- 使用javascript:在没有阻止html标记(<b>、<p>等)的情况下,阻止脚本的最佳方法
- 如果我返回表,检查 Ajax 调用是否为 200 OK的最佳方法是什么
- JavaScript - 创建可链接函数时的最佳方法是什么
- 在上下文菜单项单击上显示侧边栏/弹出窗口的最佳方法是什么
- 在 JavaScript 中获取范围的随机数的最佳方法
- 在对象类上实现 jquery 作用域的最佳方法
- 将同步函数包装到承诺中的最佳方法是什么?
- 使用 MVC 删除 JavaScript 中硬编码字符串 Asp.Net 最佳方法