跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python大前端算法

前端 AJAX 原理与动态页面爬虫实战思路

现代网站普遍采用 AJAX 技术异步加载数据,传统静态爬虫失效。文章解析前端三大核心基础,深入讲解 AJAX 原理及与传统请求的区别。提供通过浏览器开发者工具检测 AJAX 和 WebSocket 的具体方法,并给出三种主流爬虫解决方案:直接调用 API(处理鉴权与加密)、模拟浏览器执行 JS(Selenium/Playwright)以及 WebSocket 协议抓取。涵盖从理论分析到 Python 代码实战的完整流程,帮助解决动态页面数据获取难题。

雾岛听风发布于 2026/4/7更新于 2026/10/2484 浏览

如今绝大多数网站都采用了 AJAX 技术,这意味着传统的静态 HTML 爬虫往往失效。要搞定动态页面,得先理解前端数据是如何加载的。这里梳理一下核心知识,并给出实战方案。

前端基础回顾

前端开发的三大基石是 HTML、CSS 和 JavaScript。简单说,HTML 搭骨架,CSS 做皮肤,JS 管行为。

HTML:构建骨架

本质是标记语言,通过标签描述页面元素。比如标题、段落、链接等。

<!DOCTYPE html>
<html>
<head><title>网页标题</title></head>
<body>
  <h1>Hello World</h1>
  <p>这是一个网页</p>
</body>
</html>

CSS:负责样式

控制颜色、字体、布局、动画及响应式设计。配合类名使用更灵活。

.title {
  color: blue;
  font-size: 30px;
}

JavaScript:驱动交互

负责动态效果、用户交互、请求服务器数据以及操作 DOM。这是 AJAX 的核心载体。

function changeText() {
  document.getElementById("text").innerText = "Hello JS";
}

三者结合的例子:一个按钮,HTML 定义结构,CSS 美化,JS 处理点击逻辑。

<button id=>点击


"btn"
</button>
<style>
button { background: red; color: white; }
</style>
<script>
document.getElementById("btn").onclick = function() { alert("点击成功"); };
</script>

AJAX 深度解析

什么是 AJAX

全称 Asynchronous JavaScript and XML(异步 JavaScript 和 XML)。它不是新语言,而是一种组合技术,让网页在不刷新整个页面的情况下与服务器交换数据。

注意:虽然名字带 XML,但现代开发中几乎都用 JSON 替代,因为更轻量易读。

核心特点

  • 异步:发请求后浏览器不阻塞,用户还能操作页面,响应回来再处理。
  • 局部更新:只替换需要变化的部分,体验流畅。
  • 无刷新:用户感知不到页面重载。

典型场景包括电商无限滚动、微博实时流、搜索建议联想等。

传统请求 vs AJAX

传统流程是:点击 -> 请求 -> 返回完整 HTML -> 页面刷新。 AJAX 流程是:触发 -> JS 后台请求 -> 返回数据 (JSON/HTML) -> JS 局部更新。

代码实现方式

原生 XMLHttpRequest

这是最基础的实现,虽然现在用得少,但理解原理很重要。

// 1. 创建对象
const xhr = new XMLHttpRequest();
// 2. 配置请求:GET 方式,目标地址,是否异步
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1', true);
// 3. 监听状态变化
xhr.onreadystatechange = function() {
  // readyState=4 完成,status=200 成功
  if (xhr.readyState === 4 && xhr.status === 200) {
    const data = JSON.parse(xhr.responseText);
    console.log('请求成功:', data);
    // 4. 更新页面内容
    document.getElementById('result').innerHTML = `
      <p>任务标题:${data.title}</p>
      <p>是否完成:${data.completed ? '是' : '否'}</p>
    `;
  }
};
// 5. 发送请求
xhr.send();
现代方案 Fetch API

ES6+ 引入,基于 Promise,语法更简洁。

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => {
    if (!response.ok) throw new Error('请求失败:' + response.status);
    return response.json();
  })
  .then(data => {
    console.log('Fetch 成功:', data);
    document.getElementById('result').innerHTML = `
      <p>任务 ID:${data.id}</p>
      <p>任务标题:${data.title}</p>
    `;
  })
  .catch(error => {
    console.error('出错:', error);
    document.getElementById('result').innerHTML = '<p>请求失败,请重试</p>';
  });

爬虫实战:如何识别与抓取

AJAX 对爬虫的影响在于数据不再直接存在于初始 HTML 中,而是通过 JS 异步加载。如果直接请求 URL,拿到的往往是空壳。

第一步:判断是否使用了 AJAX

打开浏览器开发者工具(F12),切换到 Network 标签。

  1. 过滤 XHR 或 Fetch。
  2. 刷新页面(Ctrl+R)。
  3. 观察特征:
    • 如果看到大量 Type 为 xhr 或 fetch 的请求,且路径常含 /api/、/v2/ 等。
    • 预览数据能看到列表或详情,而原始 HTML(Ctrl+U)里找不到这些数据。
    • 时间线上,Document 先加载,随后出现一堆 XHR 请求。

第二步:解决方案

根据接口情况,优先级从高到低选择方案。

方案 1:直接调用 API(最优)

在 Network 面板找到对应的 XHR/Fetch 请求,复制接口地址和请求头。

  • 无鉴权:直接请求即可。
import requests
url = "https://api.xxx.com/gold"
res = requests.get(url).json()
print(res)
  • 需 Headers:复制 User-Agent、Referer、Cookie 等。
headers = {
    "User-Agent": "...",
    "Referer": "...",
    "Cookie": "..."
}
requests.get(url, headers=headers)
  • 有加密参数:若存在 sign、token 等加密字段,通常需要逆向 JS 算法还原逻辑。
方案 2:模拟浏览器执行 JS

当接口加密复杂或逻辑分散时,使用自动化工具。

  • Selenium / Playwright:让爬虫真正运行 JavaScript,渲染页面后再提取数据。

第三步:WebSocket 协议抓取

除了 AJAX,部分实时数据(如股票行情、直播弹幕)使用 WebSocket 传输。这是一种全双工通信,建立连接后双方可随时互发数据。

如何识别

在 F12 Network 面板切换到 WS 标签,刷新页面。若出现 ws:// 或 wss:// 连接且状态为 101 Switching Protocols,即为 WebSocket。

抓取方法
  • 推荐:Playwright / Puppeteer 能自动处理握手和 Cookie,适合新手。
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("目标网址")
    
    # 监听 WebSocket 消息
    def handle_message(msg):
        print("收到 WS 数据:", msg)
    
    page.on("websocket", lambda ws: ws.on("framereceived", handle_message))
    input("按回车结束...")
  • 轻量级:Python websocket-client 已知地址时使用,需手动构造连接参数。
import websocket

def on_message(ws, message):
    print("实时数据:", message)

ws = websocket.WebSocketApp(
    "wss://xxx.com/socket",
    header={"Cookie": "你的 cookie"},
    on_message=on_message
)
ws.run_forever()

注意:部分网站 WS 连接参数也加密,此时建议结合 Playwright 更稳妥。

目录

  1. 前端基础回顾
  2. HTML:构建骨架
  3. CSS:负责样式
  4. JavaScript:驱动交互
  5. AJAX 深度解析
  6. 什么是 AJAX
  7. 核心特点
  8. 传统请求 vs AJAX
  9. 代码实现方式
  10. 原生 XMLHttpRequest
  11. 现代方案 Fetch API
  12. 爬虫实战:如何识别与抓取
  13. 第一步:判断是否使用了 AJAX
  14. 第二步:解决方案
  15. 方案 1:直接调用 API(最优)
  16. 方案 2:模拟浏览器执行 JS
  17. 第三步:WebSocket 协议抓取
  18. 如何识别
  19. 抓取方法

更多推荐文章

查看全部
  • AIGC 影视创作与提效工具实战指南
  • 基于FPGA的时间数字转换器(TDC)抖动测试系统
  • EasyLink 文档解析实战:让非结构化数据为AI所用
  • Python 从入门到精通:核心语法、爬虫与深度学习实战指南
  • C 语言排序算法详解:插入排序与希尔排序
  • 2026 年 3 月全球 AI 前沿动态:从模型突破到智能体跃迁
  • 从零构建 FPGA 上的 Cortex-M0 SoC:解密 AHB 总线与软核协同设计
  • 二叉树算法实战:计算深度与求先序排列
  • Meta Llama 3 中文微调模型评测:llama3-Chinese-chat 与 Llama3-8B-Chinese-Chat
  • 千笔 AI 辅助论文写作工具功能解析
  • Clumsy 网络故障模拟工具使用指南
  • 基于 Python Flask 与 Vue 的家教信息管理系统设计
  • VSCode GitHub Copilot 安装与实战指南
  • Python 为何成为 AI 开发主流语言?对比 Java 与 Ruby
  • 大模型热潮:会是一场泡沫吗?
  • 2026 年各大高校 AIGC 检测政策汇总
  • 为何 glTF 与 GLB 格式成为标准化主资产的主流选择
  • LeetCode 原地复写零:双指针逆向填充 O(n) 最优解
  • 每周学习总结:健康、文档搭建与算法练习
  • Spring Boot 安全认证与授权详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online