# 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 以及评论统计,便于观察执行状态。