从 Regex 到 LLM:我的网页数据提取之旅
我开发了一个价格比较工具。我需要从数十个电商网站中抓取产品数据。每个网站的结构都不同。有些网站使用随机的 CSS 类,有些则使用 JavaScript 来加载内容。
我首先尝试了传统的方法。我使用了 Regex 和 BeautifulSoup。
这在两个网站上奏效了。但随后,其中一个网站更改了布局,我的代码就失效了。另一个网站则使用了动态内容。我花在修复爬虫上的时间比使用数据的时间还要多。
然后我尝试了 AI。我将原始 HTML 输入到 LLM 中。
结果并不理想。输出不一致:有时得到的是 JSON,有时得到的是段落。模型还会产生幻觉(hallucinate)数据。由于发送了过多的 token,成本也变得非常高。
我找到了一个折中方案。现在我采用的是一种混合方法。
以下是我的流程:
- 预处理 HTML。我会剥离 scripts、styles 和导航栏。我只保留可见文本。这可以减少 token 数量并降低成本。
- 使用 JSON mode 或 function calling。这可以强制 LLM 返回结构化数据。
- 使用重试逻辑。如果 JSON 格式错误,代码会重新尝试。
- 缓存结果。我会按 URL 保存成功的提取结果,以避免为同一个页面支付两次费用。
对于静态且结构良好的网站,Regex 和 BeautifulSoup 仍然是最佳选择。它们既快速又免费。
对于混乱、不可预测的网站,LLM 表现更好。但你必须先清洗数据,以保持较低的成本。
我的经验教训:
- 监控你的成本和成功率。
- 注意延迟。LLM 调用需要几秒钟,而不是毫秒。
- 验证输出。检查价格看起来是否像真实的价格。
- 使用混合系统。对简单的网站使用 parser,对混乱的网站使用 LLM。
这套方案为我节省了大量工作时间。我可以在不到一小时内添加一家新商店。
你是如何处理混乱的网页数据的?你更倾向于使用 parser 还是 LLM?
Optional learning community: https://t.me/GyaanSetuAi