Files
ai_crawler_tiktok/README.md

194 lines
6.0 KiB
Markdown
Raw Permalink Normal View History

2025-12-08 15:20:22 +08:00
# crawler_tiktok
TikTok 数据抓取脚本,分为两阶段:
- 按关键词搜索视频链接并生成快照(`links`
- 根据视频链接抓取评论与二级回复并生成快照与可选 CSV`comments`
全项目基于 Python 标准库实现(`urllib``threading` 等),不依赖第三方包。
## 目录结构
```
crawler_tiktok/
├─ core/ # cURL 文本解析与请求发送
│ └─ curl.py
├─ tiktok/ # TikTok 业务逻辑
│ ├─ search.py # 关键词搜索视频链接
│ └─ comments.py # 抓取评论与二级回复
├─ data/ # 示例数据与输出目录
│ ├─ 1.text # cURL 文本(包含多个 curl 命令块)
│ ├─ keyword.txt # 关键词文件(每行一个关键词)
│ ├─ urls.json # 链接搜索快照输出(示例已有)
│ ├─ comments.csv # 评论 CSV 输出(可选)
│ └─ store.py # 统一的快照写入工具
├─ utils/ # 通用 IO 工具
│ └─ io.py
├─ main.py # 命令行入口子命令links / comments / all
└─ __init__.py # 包入口
```
## 准备工作
- 安装 Python建议 3.8+
- 准备 `data/1.text`
- 打开浏览器访问 TikTok登录后在开发者工具的 Network 面板选中相关请求,使用 “Copy as cURL” 复制。
- 将“评论接口”的 `curl ...` 放在第一段,“搜索接口”的 `curl ...` 放在第二段;两段之间可直接换行即可。
- 保留请求头(尤其是 `cookie`)以便接口正常返回。
- 准备关键词文件 `data/keyword.txt`(每行一个关键词),或使用命令行传参。
## 快速开始
在仓库根目录(必须为 `D:\work\crawler_tiktok`)直接运行脚本:
```
python main.py -h
```
### 1) 搜索视频链接links
将关键词并发搜索,统一去重并保存到 `urls.json`
```
python main.py links \
--keywords-file data\keyword.txt \
--file-path data\1.text \
--out data\urls.json \
--max-pages 50 \
--count 12 \
--timeout 30 \
--workers 5
```
可选:
- 通过 `--keyword` 重复传入多个关键词(可与 `--keywords-file` 混用)
- `--keywords` 逗号分隔的关键词字符串
输出 `urls.json` 结构示例:
```json
{
"keywords": ["xxx", "yyy"],
"items": [
{"keyword": "xxx", "count": 10, "links": ["https://www.tiktok.com/@user/video/123" ...]},
{"keyword": "yyy", "count": 8, "links": [ ... ]}
],
"total_count": 17855,
"links": ["https://www.tiktok.com/@user/video/123", ...]
}
```
### 2) 抓取评论与回复comments
从链接快照读取链接,抓取主评论与二级回复,并保存 JSON 与可选 CSV。
```
python main.py comments \
--links-json data\urls.json \
--out data\tik_comments.json \
--file-path data\1.text \
--count 100 \
--pages 100 \
--timeout 30 \
--reply-count 100 \
--reply-pages 100 \
--csv data\comments.csv \
--workers 8
```
输出 `tik_comments.json` 结构示例:
```json
{
"items": [
{
"link": "https://www.tiktok.com/@user/video/123",
"count": 42,
"comments": [
{
"cid": "xxx",
"text": "...",
"user": {"unique_id": "..."},
"replies": [{"text": "..."}, ...],
"reply_count": 3
}
]
}
]
}
```
若提供 `--csv`,会将主评论与回复分别以 `username,text` 形式追加到该文件。
### 3) 全流程一体化all
一次性串联链接搜索与评论抓取,适合流水线执行:
```
python main.py all \
--keywords-file data\keyword.txt \
--file-path data\1.text \
--links-out data\urls.json \
--search-max-pages 50 \
--search-count 12 \
--search-timeout 30 \
--search-workers 5 \
--comments-out data\tik_comments.json \
--comments-count 100 \
--comments-pages 100 \
--comments-timeout 30 \
--comments-limit 1000 \
--reply-count 100 \
--reply-pages 100 \
--reply-limit 2000 \
--csv data\comments.csv \
--comments-workers 8
```
### 4) 写入 MySQL从 CSV 导入)
`D:\work\crawler_tiktok` 下执行:
```
pip install pymysql
python main.py mysql \
--csv data\comments.csv \
--host localhost \
--port 3306 \
--user root \
--password <你的密码> \
--database crawler_tiktok \
--table comments
```
若数据库不存在,请先在 MySQL 中创建:
```
CREATE DATABASE IF NOT EXISTS `crawler_tiktok` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
导入会在指定库中自动建表(如不存在),并批量插入 `username,text` 两列数据。
## 重要参数说明
- `--keyword / --keywords / --keywords-file`:三种方式提供关键词,最终会合并并去重。
- `--file-path`cURL 文本文件路径(包含多个 `curl ...` 命令块)。
- 第 1 块作为评论接口基准。
- 第 2 块作为搜索接口基准。
- 搜索阶段:`--max-pages` 分页轮次上限;`--count` 每页条数(默认从 URL 中推断,通常为 12`--workers` 并发线程数。
- 评论阶段:`--pages` 评论分页上限;`--count` 每页评论数;`--reply-count` / `--reply-pages` 回复分页与每页数;`--workers` 并发抓取线程数。
- `--timeout`:请求超时秒数。
- `--csv`:若提供则会将主评论与回复按 `username,text` 追加到该 CSV。
## 输出文件约定
- `data/urls.json`:链接搜索快照,包含 `keywords/items/total_count/links`
- `data/tik_comments.json`:评论抓取快照,包含 `items`(每项含 `link/count/comments`)。
- `data/comments.csv`CSV 格式的评论与回复(用户名、文本)。
## 常见问题
- 返回为空或报错:优先检查 `data/1.text` 的 cURL 是否有效,`cookie` 是否过期。
- 速率限制:适当降低 `--workers`、提高 `--timeout`,或分批执行。
- Windows 路径:示例中使用反斜杠;若在类 Unix 环境,改为 `/`
- 进度打印:抓取过程会打印 START/DONE/ERROR 以及评论统计,便于观察执行状态。