2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
无人提及的问题:600KB 的文档对象模型(DOM)
当我开始构建网络爬虫时,显而易见的做法是将页面发送给大型语言模型(LLM),并要求它提取数据。很简单,对吧?
错。典型的产品列表页面包含 500–700KB 的原始文档对象模型(DOM)数据。将其发送给任何模型都意味着你每页需要支付约 150,000 个令牌(token)的费用,每个请求等待 15–30 秒,并且在处理任何复杂内容时都会触及上下文长度限制。
我在第一页就撞上了这堵墙。
四个月,十五个模型,结果相同
我测试了所有模型:GPT-4、GPT-4o、Gemini 1.5 Pro、Gemini Ultra、Claude 3 Opus、Claude 3.5 Sonnet、Mistral Large、Llama 3 70B、Cohere Command R+,以及一些较小的微调模型。
结果始终如一:
- GPT-4 / Gemini Ultra:准确,但每页耗时 25–35 秒
- Claude 3.5 Sonnet:准确性与延迟之比最佳,但仍需 5–10 秒
- 较小模型:速度更快,但不断产生字段名称的幻觉(即生成错误信息)
没有模型能解决延迟问题,因为我要求它们解决的是一个错误的问题。
预处理器的突破
真正的问题不在于模型,而在于输入大小。
我构建了一个文档对象模型(DOM)预处理器:
- 移除所有
<script>、<style>和跟踪像素 - 移除导航栏、页脚、侧边栏元素
- 合并不携带语义内容的深层嵌套包装器
- 应用 SimHash 算法对结构相同的子树进行去重
结果:580KB → 4.2KB。减少了 99.3%。
当输入大小为 4KB 时,每个模型都变得快速起来。但更有趣的事情发生了:在这种规模下,重复模式变得显而易见。相同的结构重复了 20、50、100 次——产品卡片、目录行、搜索结果。
架构决策
如果仅从结构上看模式已经显而易见,为什么我还要付费让模型去寻找它呢?
我编写了一个启发式检测器:
- 识别具有 3 个或以上结构相同兄弟元素的元素
- 根据深度、子节点数量一致性和文本密度对候选列表进行评分
- 在 0 毫秒 内返回排序后的列表候选项
然后,人工智能在检测之后介入——不是为了识别列表,而是为了标记字段并结构化输出。这是一个只需 200 个令牌的任务,而不是 150,000 个令牌的任务。
| 步骤 | 方法 | 延迟 |
|---|---|---|
| 列表检测 | 启发式算法 | 0.2 毫秒 |
| 字段标记 | 大型语言模型(小输入) |

