Massii-08/hidden-api-extraction-template
GitHub: Massii-08/hidden-api-extraction-template
一个 Python 网页数据抓取模板,通过直接调用网站内部 JSON API 替代 HTML 解析,实现更快、更稳定的数据提取。
Stars: 1 | Forks: 0
# Hidden API 提取模板
[](https://github.com/Massii-08/hidden-api-extraction-template/actions/workflows/ci.yml)
[](https://www.python.org/)
[](LICENSE)
## 核心洞察
大多数动态网站不会将数据直接放在 HTML 中。页面首先会加载一个外壳,
然后在后台通过 **内部 JSON API** 获取真实数据
(例如无限滚动、“加载更多”、实时过滤)。如果你直接读取该 JSON endpoint
——也就是页面正在调用的那个——你获取数据的速度会更快,
而且比抓取渲染后的 HTML 稳定得多,因为后者在每次 HTML 结构变动时都会失效。
这个模板为你提供了一个体量小巧、类型完善且经过充分测试的起点:
- `HiddenApiClient` —— 一个带有可注入 rate limiter 和
重试机制的友好 HTTP client。
- `parse_quotes` / `extract_all_quotes` —— 具体的使用示例。
- `extract_paginated` —— 一个通用的分页器,让你能在任何
分页 JSON API 上复用该模式。
## 示例:quotes.toscrape.com
[`quotes.toscrape.com`](https://quotes.toscrape.com) 是一个授权的抓取
沙盒。其 `/scroll` 页面会从内部 JSON endpoint 加载名人名言:
```
GET https://quotes.toscrape.com/api/quotes?page=1
```
```
{
"has_next": true,
"page": 1,
"quotes": [
{
"author": { "name": "Albert Einstein", "slug": "Albert-Einstein" },
"tags": ["change", "deep-thoughts"],
"text": "The world as we have created it is a process of our thinking..."
}
]
}
```
直接调用该 JSON 接口正是你在滚动页面时它所执行的操作——因此我们
采取同样的方式,持续分页直到 `has_next` 变为 `false`。这些数据属于公共领域的
文学名言(属于事实信息,非 PII)。
## 快速开始
```
python -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'
pytest
python scripts/live_demo.py
```
`pytest` 完全在 **离线且确定性的** 环境下运行(网络通过
`httpx.Mock Transport` 进行模拟,并且注入了时间)。唯一涉及
网络请求的文件是 `scripts/live_demo.py`。
## 在你自己的目标上复用
1. 找到隐藏的 endpoint —— 参见
[`docs/how-to-find-a-hidden-api.md`](docs/how-to-find-a-hidden-api.md)。
2. 为你的记录编写一个小巧的 `parse_fn(payload) -> list` 函数。
3. 调用 `extract_paginated(client, "/your/path", parse_fn)`。
## 适用范围
该模板像普通访问者一样读取 **公开的、事实性 / 非 PII 数据**:
- 遵守 `robots.txt` 和速率限制(内置的 `RateLimiter` 会强制执行
友好的延迟)。
- 使用具有描述性的 User-Agent 标识你的 client。
- 无需身份验证,不涉及私人用户的个人数据。
- 检查目标网站的服务条款,仅对你被允许读取和拥有的数据进行操作。**你自行拥有并负责** 你所收集的数据。
## 许可证
MIT —— 详见 [LICENSE](LICENSE)。
标签:Python, 命令控制, 安全规则引擎, 数据采集, 无后门, 模板项目, 运行时操纵, 逆向工具