跳转至

13.5 Web分析与爬虫——数据接口爬取示例

内容梗概

本节课讲解第三种抓取思路:绕过页面渲染,直接抓取网站的数据接口(HTTP API)。Ajax 网站的后端必然通过特定 URL 以 JSON(或 XML)格式向前端吐数据,用浏览器开发者工具的 Network 面板分析通信过程即可找到这个接口,然后直接用 Python 请求接口、用内置 json 库解析数据,无需渲染 JS、无需分析 HTML。课上仍以自建演示网站为例,发现接口 data?page=N 后循环抓取 4 页 JSON 并提取学生名单。最后对比总结了三种抓取方式的优劣:数据接口最快最干净但分析成本高、常有 token 保护;Selenium 动态渲染方案最通用,近乎"通杀"。

知识点详解

数据接口的原理(约 00:00–01:40)

  • 用 Ajax 获取数据的网站,后端开发人员一定会通过某个特定 URL(HTTP API 接口 / 数据接口)返回 XML 或 JSON 格式的数据串给前端,前端才能显示。
  • 抓数据的第三种思路:通过浏览器开发者工具的 Network 面板**分析出这个接口,然后**根本不访问页面,直接请求接口(如 data?page=1),拿到 JSON 格式串,从中提取内容——不需要渲染 JavaScript,也不需要分析 HTML。

用 Network 面板找接口(约 02:00–03:20)

  • F12 呼出开发者工具 → Network 面板 → 刷新页面,逐一分析各条请求:
  • 第 1 条:页面网址本身,不管;第 2 条:样式表,不管;第 3~5 条:JS 文件,不管;
  • 第 6 条:请求了一个"奇怪的地址" data,并带参数 page=1 —— 这就是数据接口。
  • 由此可知:后端会给前端页面传一个符合 JSON 格式的字符串,用 Python 解析这个 JSON 即可。

JSON 格式(约 03:50–05:15)

  • JSON 是当前前后端之间传输数据**特别通用**的格式,源自 JavaScript 对象表示法。
  • 格式与 Python 字典几乎一模一样:key-value 结构,value 还可以是列表,列表里又可以套字典(JavaScript 里叫法不同,格式相同)。
  • Python 用内置模块 json 处理:json.loads(字符串) 把 JSON 字符串直接转成字典(load = 加载,s = 传入的是字符串)。

接口抓取代码逻辑(约 05:20–08:15)

  • 观察演示网站:鼠标往下拉依次弹出 page2、page3、page4 的请求,共 4 页 → 直接循环访问 data?page=1,2,3,4。
  • 代码要点:
    import json  # Python 内置模块
    
    students = []                      # 空列表存结果
    for page in range(1, 5):           # page 从 1 到 4(range 取不到 5,正好)
        url = f'...data?page={page}'   # 链接前面固定,page 参数从 1 变到 4
        r = requests.get(url)
        r.encoding = 'utf-8'
        d = json.loads(r.text)         # JSON 字符串 → 字典
        for item in d['data']:         # 字典里 key 为 'data',value 是列表
            students.append(item.strip())  # strip 去掉前后空白(不去也行)
    
  • 单独在浏览器访问 data?page=1 验证:页面没有 HTML 结构,直接返回一个 JSON 字符串,确认这就是纯数据接口。

三种方式的对比与总结(约 08:15–10:35)

  • 数据接口方式**最快捷、数据最干净**,但不上来就用它,原因有二:
  • 分析成本高:要深入分析才能找到接口。自建网站当然知道接口逻辑,陌生网站需投入大量时间分析。
  • 保护机制:绝大多数网站通过认证方式保护接口,须持有特定 token 或 key 才能访问,爬虫一般拿不到。
  • 动态渲染(Selenium)方案最通用:它本质上和用户看到的内容一样,可以完全模拟用户操作——打开浏览器、点击页面、甚至输入用户名密码登录。从通用性角度讲基本什么网站都能解决,对 Ajax 渲染这类自我保护手段"通杀"。
  • 遗留问题预告:验证码、封 IP、登录保护如何解决,以及真实网站的分析案例,下一节课讲。

示例与演示

  • 找接口演示:对自建动态网站按 F12 → Network → 刷新,逐条排查请求,定位到第 6 条 data?page=1;在浏览器直接访问该地址,确认返回纯 JSON 字符串(无 HTML 结构)。
  • 滚动分页观察:页面向下滚动时 Network 中依次出现 page2、page3、page4 请求,确认共 4 页。
  • 抓取演示:循环 4 次请求接口 → json.loads 转字典 → 取 ['data'] 列表 → 逐项 strip 后 append 到结果列表,得到全部学生名单。全程不渲染 JS、不解析 HTML,代码最短。

重点与难点

  • 重点:数据接口抓取两步——Network 面板找到返回 JSON 的接口请求(带参数规律,如 page=N)→ requests 直接请求接口 + json.loads 解析。
  • 重点:JSON 与 Python 字典结构同构,json.loads(注意带 s,传字符串)一键转字典;解析后按 key 取值(本例为 ['data'])。
  • 易错点:
  • range(1, 5) 取不到 5,循环 1~4 页正好。
  • 别忘了 r.encoding = 'utf-8'(沿用 13.3 的乱码教训)。
  • 接口地址规律需要自己观察总结(翻页参数名、取值范围),陌生网站未必这么直白。
  • 难点/取舍:接口方式虽最干净,但找接口费时、接口常有 token/key 认证;通用性上 Selenium 动态渲染方案最强——三种方式要按目标网站情况选择。

关联内容

  • 本课收束整个第 13 章主线:13.1 提出"页面分析(静态/动态)+ 数据接口"的框架,13.3、13.4、13.5 分别给出三种实现示例,结尾做了横向对比。
  • Ajax、JSON 接口(data?page=1)概念与演示网站均来自上一周 Web 开发课程(13.4 用的正是同一网站的动态版本)。
  • requests、r.encoding 用法承自 13.3;json 为 Python 内置模块,与字典知识(第 4 章前后)直接对应。
  • 预告后续课程:真实网站爬取案例、IP 封禁与登录保护等对抗手段的应对。