web-scraping - 抓取网页并查找行的标题
问题描述
我正在寻找一种在网页中查找行标题的方法。
使用Puppeteer,如果我知道 div 和类的名称,我可以找到行标题。但如果我不这样做呢?如果我想获得将出现的任何列表的所有标题怎么办?
不是在寻找一个完整的解决方案(如果是这样,更好),甚至是我可以使用什么技术(可能是某种人工智能)来获得这个输出的想法。
例子:
输出:
- Sekiro:影逝二度
- 真人快打11
- F1 2019
- 外荒野
解决方案
监督学习
如果您指的是监督学习 AI 系统(例如神经网络),我想告诉您您将要面临的问题。主要存在三个问题:
训练数据
要创建自动检测标题的 AI,您首先需要训练 AI。您将需要数百甚至数千个样本来训练您的 AI。这意味着,在你的 AI 能够预测任何事情之前,你必须进行大量手动工作来获取和标记输入数据。
为您的 AI 输入
你会给人工智能提供什么输入?你有两个选择:
- 源代码:这基本上可以训练你的 AI 成为网络浏览器。有趣的挑战,但我怀疑你会从中得到任何结果。
- 网站的屏幕截图?您不应将实际屏幕截图输入 AI,而应尝试“清理”它。例如,您可以用某种占位符替换所有文本,因为您希望 AI 处理“文档的外观”而不是文本本身。这种方法比第一种方法效果更好,但是在将图像提供给您的 AI 之前,您必须对图像进行一些清理工作。这可以工作,但你需要大量的训练数据才能可靠地工作。
可靠性
即使您解决了所有问题并且您的 AI 最终能够检测到列表的标题,您也需要意识到 AI 永远不会完美地工作。当然,没有算法是完美的,但是使用人工智能,你不能简单地“调整”你的算法以获得更好的结果。
想象一下,您看到对于特定网站,您的 AI 不起作用。您无法轻松调试 AI 并调整代码以使其适用于该页面。你将不得不重新训练你的人工智能,希望在你的调整之后它会起作用。也许,那么它将适用于该页面,但现在另一个网站将不再工作......
算法方法
我建议不要使用 AI,而是使用简单的算法来检测包含标题元素的列表。像下面这样的东西可以工作:
h2
对每个标题标签 ( , h3
, ...)重复以下操作
- 获取所有标题元素(例如
h2
) - 是元素的数量<= 1,那么这不是一个列表(跳过)
- 检查每个元素的“周围元素”。如果这是一个列表,所有元素都应该有相同的环境:元素的父级是否具有相同的类名?兄弟节点是否具有相同的类?如果不是,这不是一个列表(跳过)
- 鉴于前面的步骤,元素很可能是列表的一部分,并且您的标题元素应该包含列表的标题。
有一些明显的缺点:这种方法仅适用于包含多个元素的列表,并且仅在正确使用标记的情况下才有效。如果网站只使用div
元素而不是标题标签,这将不起作用。所以,这只能作为一个起点,算法显然可以改进......
推荐阅读
- javascript - 未捕获(承诺中)错误:tabs.discard 的参数类型不正确
- angular - 在高图中查找并填充折线图与绘图线的交点
- c++ - 检查 1/n 小数点后是否有无限位数
- rabbitmq - 消息卡在 RabbitMQ 上的 x-delayed-message Exchange 中
- mysql - 在 MYSQL 查询中求和时如何忽略 NULL?
- c# - 有没有办法使用 gecko c# 更改打印边距
- google-sheets - 使用非默认工作表在 BigQuery Cloud Shell 中从 Google 工作表创建外部表
- r - 绘制具有分类预测变量的支持向量机
- xamarin - Xamarin 表单 UWP 的 MasterDetail 页面中的标题问题
- chronicle-map - 创建一个堆外内存 ChronicleMap