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 封禁与登录保护等对抗手段的应对。