用深度学习提升DOM解析——自动提取页面关键区块

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文介绍了一次二手车数据爬虫事故的解决过程,从传统XPath方案失效到结合深度学习语义提取的成功实践。面对懂车帝平台的前端异步渲染和复杂DOM结构,通过Playwright动态渲染、代理IP隐藏身份,以及BERT模型对HTML块级语义识别,实现了稳定高效的字段提取。此方法抗结构变化能力强,适用于复杂网页数据采集,如二手车、新闻等领域。架构演进从静态爬虫到动态爬虫再到语义解析,显著提升效率与稳定性。

爬虫代理

一、时间轴:一次“抓不到重点”的二手车数据爬虫事故

  • 2025/03/18 09:00
    产品经理希望抓取懂车帝平台上“北京地区二手车报价”作为竞品监测数据源。我们初步使用传统XPath方案,试图提取车型、年限、里程、价格等数据。
  • 2025/03/18 10:00
    初版脚本运行失败,返回的数据全是空值,XPath定位的路径在页面中根本不存在。
  • 2025/03/18 11:00
    检查HTML源代码发现,页面由前端异步渲染(JavaScript动态生成)构建,传统静态DOM无法解析真实内容。
  • 2025/03/18 14:00
    改用Playwright模拟浏览器渲染,成功获取完整DOM。但新的问题是:页面结构复杂、不稳定,多个汽车列表卡片并非结构统一,手动XPath依旧容易出错。
  • 2025/03/19 10:00
    启动深度学习方案:利用预训练模型BERT对HTML做块级语义识别,自动提取“车卡片”结构与核心字段。

二、方案分析:XPath失效 vs 语义块提取

1. 初始方案失败原因

  • 页面为前端渲染(SPA架构),传统的requests + XPath方案根本无法加载数据;
  • 即使用Playwright动态渲染后获取HTML,汽车信息DOM结构依旧不稳定,嵌套层级深,XPath脆弱;
  • 页面存在部分反爬机制(navigator.webdriver特征、IP频控、UA检测),需解决隐藏身份问题。

2. 深度学习方案构思

  • 将完整HTML节点转为token序列(含标签结构+文本);
  • 使用BERT或LayoutLM模型对DOM节点进行语义分类,标注“车卡片”、“车型名”、“报价”等字段;
  • 利用位置+标签结构配合抽取规则,提高抗变动能力;
  • 构建领域微调训练样本,通过正则与标注相结合构建少量训练集。

三、架构改进方案:深度语义解析 + 隐身身份访问

以下是优化后的爬虫架构,融合了:

  • Playwright动态渲染页面
  • 代理IP隐藏身份(爬虫代理)
  • 设置cookie与user-agent
  • 调用深度学习模块提取语义块

✅ 示例代码如下:

import asyncio
from playwright.async_api import async_playwright
import base64
import json
import torch
from transformers import BertTokenizer, BertForTokenClassification
from typing import List

# === 亿牛云代理配置 www.16yun.cn ===
PROXY_SERVER = "http://proxy.16yun.cn:3100"
PROXY_USERNAME = "16YUN"
PROXY_PASSWORD = "16IP"

# Base64编码代理身份
def get_proxy_auth():
    credentials = f"{PROXY_USERNAME}:{PROXY_PASSWORD}"
    return "Basic " + base64.b64encode(credentials.encode()).decode()

# === 深度学习模型加载(模拟)===
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
model = BertForTokenClassification.from_pretrained("bert-base-chinese")

def predict_blocks(text_list: List[str]) -> List[str]:
    """
    使用BERT模拟DOM区块分类
    输入:文本列表(如标签+内容组成)
    输出:每个文本的分类结果,如[车型] [年限] [报价]
    """
    inputs = tokenizer(text_list, return_tensors="pt", padding=True, truncation=True)
    with torch.no_grad():
        outputs = model(**inputs).logits
    predictions = torch.argmax(outputs, dim=-1)
    labels = [model.config.id2label[idx.item()] for idx in predictions[0]]
    return labels

# === Playwright爬虫主流程 ===
async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)

        # 启动代理 + 设置UA和Cookie
        context = await browser.new_context(
            proxy={
   "server": PROXY_SERVER},
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0.0.0 Safari/537.36",
            extra_http_headers={
   
                "Proxy-Authorization": get_proxy_auth(),
                "Cookie": "your_cookie_here"  # 真实抓包填入cookie
            }
        )

        page = await context.new_page()

        # 搜索“北京二手车”
        await page.goto("https://www.dongchedi.com/usedcar/search?city_name=%E5%8C%97%E4%BA%AC")
        await page.wait_for_timeout(5000)  # 等待JS加载完

        # 提取页面HTML
        html = await page.content()

        # 简化提取所有车卡片文本(真实项目中解析DOM结构)
        elements = await page.query_selector_all("div.CarCard_card__...")  # 选择器根据真实页面调整
        for el in elements:
            text = await el.inner_text()
            label = predict_blocks([text])[0]
            print(f"[{label}] {text}")

        await browser.close()

asyncio.run(main())

四、总结与优化建议

📌 深度学习DOM解析优点:

  • 抗结构变化能力强,不再依赖脆弱的XPath;
  • 适合复杂网页(如懂车帝、汽车之家等)中提取卡片、列表、评论等区域;
  • 可结合小样本微调适应特定领域,如二手车、新闻等。

⚙️ 技术架构演进图

[静态爬虫Requests+XPath] ──> [动态爬虫Playwright+XPath] ──> [Playwright+DOM语义BERT]
             ❌失效                          ⚠️结构脆弱                     ✅语义提取,稳定高效

附加建议

  • 如需更高精度,可构建100~300条有标注数据微调BERT;
  • 可加入图神经网络(如DOM-GCN)提升DOM上下文理解;
  • 建议结合VisualDOM信息(元素位置+截图)形成多模态提取模型。
相关文章
|
9月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
260 57
|
3月前
|
机器学习/深度学习 数据采集 存储
深度学习在DOM解析中的应用:自动识别页面关键内容区块
本文探讨了如何通过深度学习模型优化东方财富吧财经新闻爬虫的性能。针对网络请求、DOM解析与模型推理等瓶颈,采用代理复用、批量推理、多线程并发及模型量化等策略,将单页耗时从5秒优化至2秒,提升60%以上。代码示例涵盖代理配置、TFLite模型加载、批量预测及多线程抓取,确保高效稳定运行,为大规模数据采集提供参考。
|
6月前
|
机器学习/深度学习 传感器 人工智能
穹彻智能-上交大最新Nature子刊速递:解析深度学习驱动的视触觉动态重建方案
上海交大研究团队在Nature子刊发表论文,提出基于深度学习的视触觉动态重建方案,结合高密度可拉伸触觉手套与视觉-触觉联合学习框架,实现手部与物体间力量型交互的实时捕捉和重建。该方案包含1152个触觉感知单元,通过应变干扰抑制方法提高测量准确性,平均重建误差仅1.8厘米。实验结果显示,其在物体重建的准确性和鲁棒性方面优于现有方法,为虚拟现实、远程医疗等领域带来新突破。
153 32
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
389 1
|
8月前
|
机器学习/深度学习 自然语言处理 语音技术
揭秘深度学习中的注意力机制:兼容性函数的深度解析
揭秘深度学习中的注意力机制:兼容性函数的深度解析
|
7月前
|
机器学习/深度学习 人工智能 算法
机器学习与深度学习:差异解析
机器学习与深度学习作为两大核心技术,各自拥有独特的魅力和应用价值。尽管它们紧密相连,但两者之间存在着显著的区别。本文将从定义、技术、数据需求、应用领域、模型复杂度以及计算资源等多个维度,对机器学习与深度学习进行深入对比,帮助您更好地理解它们之间的差异。
|
9月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
9月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
304 2
|
9月前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
127 3
|
9月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器