从 Regex 到 LLM:我提取非结构化网页数据的历程
我曾尝试构建一个价格比较工具。它需要从数十个电商网站获取产品数据。
每个网站使用的 HTML 结构都不同。有些使用随机的 CSS 类,有些则使用 JavaScript 来加载内容。
我的第一个方案是使用 Regex 和 BeautifulSoup。它在两个网站上运行良好,但随后一切都乱套了。一个网站更改了布局,另一个网站开始使用动态内容。我花在修复爬虫上的时间比使用数据的时间还要多。
接着我尝试使用 LLM。我将原始 HTML 发送给 AI 并要求提取数据。这同样失败了。输出结果不一致,AI 还会产生幻觉。由于 HTML 消耗了过多的 token,我的 API 成本也随之飙升。
我找到了一个折中方案。现在我采用的是一种混合方法。
以下是我的流程:
- 预处理 HTML。我会剥离 scripts、styles 和导航栏。我只保留可见文本。这样可以保持较低的 token 计数。
- 使用 JSON 模式。我利用 function calling 来强制 LLM 返回结构化数据。
- 添加重试逻辑。如果 JSON 解析失败,我会尝试重试最多三次。
- 缓存结果。我会按 URL 保存成功的提取结果,以避免重复产生费用。
对于静态且结构良好的页面,Regex 和 BeautifulSoup 仍然是最佳选择。它们既快速又免费。
对于混乱或经常变动的网站,LLM 效果最好。但它们并非万能。你必须先清洗输入数据,以节省成本。
我目前的工作流:
• 对简单的网站使用轻量级解析器。 • 对不可预测的网站使用 LLM。 • 监控每次提取的成本。 • 验证输出结果,确保价格看起来是真实的。
这一转变帮助我将添加新店铺的时间从一天缩短到了一个小时。
对于混乱的网页数据,你的策略是什么?你是使用 LLM,还是坚持使用传统的爬虫?