稳定爬虫的核心是让其具备识别DOM结构变化并自动适配的能力,通过DOM指纹比对、多选择器并行试探打分、模板差分学习三大机制实现。

页面结构变化是爬虫失效的最常见原因,靠硬编码XPath或CSS选择器很容易“一碰就碎”。真正稳定的批量采集,核心不是写更复杂的规则,而是让爬虫具备“看懂变化”的能力——即识别结构是否实质变动,并自动适配。
用DOM树指纹代替固定选择器
每次抓取前,对目标区域生成轻量级DOM指纹(如:关键节点标签名+子元素数量+文本长度均值的哈希),不依赖具体路径。当新页面指纹与历史基准差异超过阈值,说明结构可能已变,触发校验流程。
- 用lxml或BeautifulSoup提取目标容器下的所有div、article、section等语义块
- 对每个块计算:(tag, len(children), len(text.strip())) → 元组 → SHA256前8位
- 整页指纹 = 所有块指纹拼接后再次哈希,便于快速比对
多候选选择器并行试探 + 置信度打分
不再只维护1套选择器,而是为同一字段预置3–5种逻辑等价但路径不同的表达式(例如:用class名、用父级结构、用相邻兄弟节点锚定),每次请求全部尝试,按结果质量打分:
- 非空且长度合理(如标题20–120字符)→ +2分
- 匹配数=1(避免误抓列表项)→ +3分
- 与上期同字段文本编辑距离<15% → +4分(稳定性加权)
- 得分最高者生效;若最高分<5,标记该页需人工复核
基于模板的差分学习机制
对同一站点持续采集时,把历史成功解析的HTML样本聚类(按body内标签序列LCS相似度),形成若干“结构模板”。新页面进来,先匹配最接近的模板,再复用该模板下验证过的选择器组合。
立即学习“Python免费学习笔记(深入)”;
- 用difflib.SequenceMatcher快速估算两页DOM标签流的相似度
- 模板库定期用新成功样本微调(增量更新,不全量重训)
- 当某模板连续3次匹配失败,自动降权或归档
基本上就这些。不复杂但容易忽略的是:别追求一次写死,要把“识别变化”本身当作一个可测量、可反馈、可进化的环节来设计。










