添加学习教程目录(learning/)及对应单元测试

- 新增 DrissionPage 基础教程(01-05)
- 新增 Playwright 基础教程(01-05)
- 新增网络基础教程(01-05)
- 新增 test_learning_examples.py 单元测试
- 更新 .gitignore 忽略 learning/*/output/ 目录
This commit is contained in:
2026-05-06 16:39:55 +08:00
parent 84bcc4ac71
commit 321bbff1c1
21 changed files with 1587 additions and 0 deletions
@@ -0,0 +1,58 @@
# 练习 01: 打开 DevTools,只看 Fetch/XHR
## 目标
1. 学会打开 Chrome DevTools
2. 学会切到 `Network`
3. 学会只看 `Fetch/XHR`
4. 学会观察“页面动作”和“请求出现”之间的关系
## 你要动手做什么
1. 打开一个抖音博主主页
2.`F12` 或右键打开开发者工具
3. 切到 `Network`
4. 勾选或点击只看 `Fetch/XHR`
5. 清空已有请求记录
6. 手动滚动页面一次
7. 观察滚动之后新增了哪些请求
## 你要重点看什么
- 有没有请求是在你滚动之后立刻出现的
- 哪些请求名字重复出现
- 哪些请求的响应大小明显更大
- 哪些请求看起来像“作品列表”而不是埋点或日志
## 本题不要急着做什么
- 不要一开始就复制所有请求
- 不要先看一堆 `Headers`
- 不要马上写代码
## 本题完成标准
你能手写回答这 3 个问题就算完成:
1. 滚动页面之后,`Fetch/XHR` 里有没有新请求出现?
2. 哪一个请求最像“返回作品列表”的接口?
3. 你为什么怀疑是它?
## 建议记录模板
```text
页面:
抖音博主主页
触发动作:
手动向下滚动一次
看到的现象:
新增了几个 Fetch/XHR 请求
最可疑的请求:
写出它的名字或 URL 片段
怀疑原因:
比如“滚动之后立刻出现,且响应较大”
```
@@ -0,0 +1,53 @@
# 练习 02: 找到真正返回 `aweme_list` 的接口
## 目标
1. 从多个请求里筛出真正有用的那个
2. 学会看 `Preview``Response`
3. 确认返回视频列表的接口里确实有 `aweme_list`
4. 和当前项目的监听目标建立对应关系
## 你要动手做什么
1. 回到上一题找到的可疑请求
2. 点开这个请求
3. 先看 `Preview`
4. 再看 `Response`
5. 搜索 `aweme_list`
6. 如果没有,就换下一个可疑请求继续查
## 你要重点看什么
- 最外层是不是 JSON
- 是否出现 `aweme_list`
- `aweme_list` 是列表还是别的结构
- 列表里的每一项是不是一个视频对象
## 对照项目
对照 [Douyin.py](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/Douyin.py) 里的这些位置:
- `LISTEN_TARGET`
- `extract_aweme_payload`
- `parse_aweme_items`
你要尝试回答:
- 代码里为什么监听的是这个接口片段?
- 它和你现在在 DevTools 里看到的请求是不是同一类?
## 本题完成标准
你能手写写出下面这些内容就算完成:
```text
目标接口 URL:
为什么确认是它:
响应最外层 keys:
aweme_list 的类型:
aweme_list[0] 里我先看到的关键字段:
```
@@ -0,0 +1,62 @@
# 练习 03: 看懂 Headers、Cookies、Referer
## 目标
1. 学会区分请求头和响应头
2. 学会找 `cookie`
3. 学会看 `referer`
4. 理解为什么很多接口离开浏览器后不一定还能直接请求成功
## 你要动手做什么
1. 打开你上一题确认过的目标接口
2. 切到 `Headers`
3. 先看 `General`
4. 再看 `Request Headers`
5. 再看 `Response Headers`
6. 如果有 `Cookies` 面板,也进去看一眼
## 你要重点看什么
### `Request Headers`
- `cookie`
- `referer`
- `user-agent`
- `accept`
### `Response Headers`
- `content-type`
- 和缓存相关的字段
- 有没有看起来和鉴权、跨域有关的字段
## 你现在要建立的概念
- `cookie` 往往代表登录态或会话状态
- `referer` 往往告诉服务端“这个请求是从哪个页面发出来的”
- `user-agent` 往往是最基础的浏览器身份
## 本题不要钻太深的点
- 先别研究所有 cookie 都是什么意思
- 先别碰签名算法
- 先做“看得见、说得清”
## 本题完成标准
你能写出下面这些内容就算完成:
```text
这个请求方法:
这个请求完整 URL:
我看到的关键请求头:
- cookie
- referer
- user-agent
我当前的判断:
如果离开浏览器单独发,最可能缺什么
```
@@ -0,0 +1,58 @@
# 练习 04: 分析分页参数和翻页规律
## 目标
1. 学会找分页参数
2. 学会比较第一页和第二页请求的差异
3. 学会判断“翻页”是靠哪个字段驱动的
4. 理解为什么脚本批量抓取时要关注这些参数
## 你要动手做什么
1.`Network` 里保留第一页和继续滚动后的下一次请求
2. 点开两次同类接口
3. 对比它们的 URL 和 Query 参数
4. 把不同的字段逐个记下来
## 你要重点看什么
- `max_cursor`
- `offset`
- `count`
- `cursor`
- `has_more`
不一定就是这些名字,但你要去找“看起来像翻页状态”的字段。
## 建议比较方式
你可以直接手工写一个对照表:
```text
第一页请求:
url = ...
query = ...
第二页请求:
url = ...
query = ...
发生变化的字段:
- xxx
- xxx
```
## 对照项目
虽然当前这个项目主要靠浏览器监听接口并解析结果,但你现在要开始建立这种意识:
- 如果以后不用浏览器监听,而是直接发 HTTP 请求
- 那分页参数就是你必须手动控制的内容
## 本题完成标准
你能回答下面这些问题就算完成:
1. 连续两次作品列表请求里,哪个参数变了?
2. 哪个参数最像“分页游标”?
3. 响应里有没有提示“还有没有下一页”?
@@ -0,0 +1,60 @@
# 练习 05: Copy as cURL,并尝试重放请求
## 目标
1. 学会把浏览器里的请求复制出来
2. 学会用 `curl` 或 Postman 试着重放
3. 验证这个请求离开浏览器后还能不能发通
4. 知道如果失败,下一步该怀疑什么
## 你要动手做什么
1. 在目标请求上右键
2. 选择 `Copy`
3. 选择 `Copy as cURL`
4. 粘贴到终端里
5. 先不要改内容,直接试一次
6. 看返回结果是不是你在浏览器里看到的同类 JSON
## 你要观察什么
- 返回的是不是 JSON
- 是否还包含 `aweme_list`
- 是否报未登录、权限不足、签名错误、参数缺失
## 如果重放失败,优先怀疑什么
1. `cookie` 失效或缺失
2. `referer` 不对
3. 有动态参数
4. 有签名参数
5. 请求上下文必须来自真实浏览器环境
## 本题最关键的认识
你不是为了“这一次一定重放成功”而学。
你是为了建立判断力:
- 哪些接口可以脱离浏览器单独请求
- 哪些接口必须依赖浏览器环境
- 哪些失败是因为少了基础请求头
- 哪些失败说明还有更深的反爬机制
## 本题完成标准
你能写出下面这些内容就算完成:
```text
我复制出来的请求:
是 / 不是 浏览器里那个目标接口
重放结果:
成功 / 失败
如果失败:
我最先怀疑的 3 个原因是什么
如果成功:
说明这个接口对浏览器环境的依赖程度如何
```
+60
View File
@@ -0,0 +1,60 @@
# Network Basics
这个目录是你的第三阶段练习。
这里不再重点练“怎么控制浏览器”,而是练“怎么用浏览器开发者工具看懂页面背后的接口”。
目标是把这条链路练熟:
1. 打开页面
2. 打开 `DevTools`
3. 只看 `Network`
4. 找到真正返回数据的接口
5. 看懂请求头、响应体、分页参数
6. 尝试把请求复制出来单独重放
## 建议学习顺序
1. `01_open_devtools_check_xhr.md`
2. `02_find_aweme_list_api.md`
3. `03_read_headers_and_cookies.md`
4. `04_analyze_pagination.md`
5. `05_copy_as_curl_and_replay.md`
## 开始前先准备
建议你先准备好这几样东西:
- Chrome 或 Chromium
- 一个已经能正常打开抖音页面的环境
- 项目里的 [Douyin.py](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/Douyin.py)
- 你自己的学习笔记
## 练习原则
- 每次只分析一个页面动作
- 先手工看懂,再考虑写代码
- 不要同时盯很多请求,先锁定一个最可疑的
- 看到字段时先记层级,不要急着背名字
- 每次练完都要写出“我这次确认了什么”
## 这组练习要解决什么问题
练完之后,你应该能回答这些问题:
- 这个页面的数据是 HTML 自带的,还是接口后加载的?
- 哪个请求才是真正返回作品列表的?
- 你要的 `aweme_id`、标题、视频地址分别在哪一层?
- 翻页靠什么参数推动?
- 如果浏览器监听不到数据,你下一步该去 DevTools 看什么?
## 和当前项目怎么对照
练这组时,重点对照这些文件:
- [Douyin.py](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/Douyin.py)
- [learning/drissionpage_basics/03_listen_api.py](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/learning/drissionpage_basics/03_listen_api.py)
- [learning/drissionpage_basics/04_parse_aweme.py](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/learning/drissionpage_basics/04_parse_aweme.py)
- [learning/playwright_basics/04_listen_response.py](/Users/wangshaoqing/Desktop/MiaoSi/Study/douyin-crawler-poc/learning/playwright_basics/04_listen_response.py)
你会慢慢发现,浏览器自动化只是“拿数据”的一种方式,真正的关键是你能不能识别出正确的接口。