添加学习教程目录(learning/)及对应单元测试
- 新增 DrissionPage 基础教程(01-05) - 新增 Playwright 基础教程(01-05) - 新增网络基础教程(01-05) - 新增 test_learning_examples.py 单元测试 - 更新 .gitignore 忽略 learning/*/output/ 目录
This commit is contained in:
@@ -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 个原因是什么
|
||||
|
||||
如果成功:
|
||||
说明这个接口对浏览器环境的依赖程度如何
|
||||
```
|
||||
@@ -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)
|
||||
|
||||
你会慢慢发现,浏览器自动化只是“拿数据”的一种方式,真正的关键是你能不能识别出正确的接口。
|
||||
Reference in New Issue
Block a user