Juddlyfire01/x-timeline-scraper
GitHub: Juddlyfire01/x-timeline-scraper
基于 Twikit 的 X(Twitter)公开时间线抓取工具,无需开发者 API 密钥,支持线程重建和纯文本提取,专为 LLM 语料与离线分析场景设计。
Stars: 0 | Forks: 0
# x-timeline-scraper
抓取任何公开 X (Twitter) 账号的最近时间线,并保存为 JSONL 文件以便进行离线分析。使用 [Twikit](https://github.com/d60/twikit) —— 无需开发者 API 密钥;您只需作为普通登录用户进行一次身份验证,随后会话将通过 `cookies.json` 被重复使用。
本仓库包含五个小型脚本,构成一个完整的处理流程:
### 抓取器
| 脚本 | 抓取内容 |
|---|---|
| `scrape_timeline.py` | 仅包含顶层推文(时间线视图) |
| `scrape_timeline_with_replies.py` | 推文 + 通过 `Replies` 端点获取的回复(捕获话题延续) |
| `scrape_timeline_complete.py` | 两个端点,去重并按最新排序 —— 推荐用于获取完整语料库 |
### 后处理器
| 脚本 | 用途 |
|---|---|
| `organize_threads.py` | 将账号的自回复拼接回重建的话题中,并带有 `[1/N]` 编号。 |
| `extract_tweet_text.py` | 将 JSONL 精简为纯净的纯文本(每个段落一条推文),供 LLM / 语料库 / embedding 使用。 |
## 设置
```
python -m venv .venv
# Windows PowerShell:
. .venv/Scripts/Activate.ps1
# macOS/Linux:
source .venv/bin/activate
pip install -r requirements.txt
```
## 凭证
将 `.env.example` 复制到 `.env` 并填入您的 X 登录信息(或者将变量导出到您的 shell 中)。这些是**您的**登录凭证 —— 它们被 Twikit 用于在首次运行时执行真实登录。随后,会话 cookie 将被写入 `cookies.json` 并在后续运行中重复使用。
```
X_USERNAME=your_handle
X_EMAIL=login_email@example.com
X_PASSWORD=your_password
```
PowerShell:
```
$env:X_USERNAME = "your_handle"
$env:X_EMAIL = "login_email@example.com"
$env:X_PASSWORD = "your_password"
```
`.env`、`cookies.json` 以及 `data/` 目录均已被 gitignore 忽略。
**切勿将它们提交到代码仓库。**
## 用法
### 1. 抓取
```
# 过去 365 天的顶级推文:
python scrape_timeline.py SomeAccount
# 自定义时间窗口 + 自定义输出路径:
python scrape_timeline.py SomeAccount --days 90 --out data/sample.jsonl
# 推文 + 回复(保留 threads):
python scrape_timeline_with_replies.py SomeAccount --days 365
# 完整语料库(推荐):
python scrape_timeline_complete.py SomeAccount --days 365
```
默认输出路径:
- `data/_tweets_d.jsonl`
- `data/_tweets_replies_d.jsonl`
- `data/_complete_d.jsonl`
### 2. 重建话题(可选)
如果您抓取了回复,可以将自回复组合成正确的话题:
```
python organize_threads.py data/someaccount_complete_365d.jsonl
```
生成内容:
- `data/someaccount_complete_365d_organized.jsonl` —— 结构化记录
- `data/someaccount_complete_365d_threads_text.txt` —— 带有 `[1/N]` 编号的可读文本
您可以使用 `--out-jsonl` 和 `--out-text` 覆盖默认路径。
### 3. 提取纯净文本(可选)
供语料库 / LLM / embedding 使用:
```
python extract_tweet_text.py data/someaccount_tweets_365d.jsonl
```
生成 `data/someaccount_tweets_365d_clean.txt` —— 每个段落一条推文,过滤掉转推和回复,剥离 URL 和 `RT @` 前缀,丢弃过短的片段(默认 `--min-len 10`)。
## 输出格式
### 抓取器 JSONL —— 每行一个 JSON 对象
```
{
"id": "1234567890",
"created_at": "Wed Mar 12 14:22:00 +0000 2026",
"text": "...",
"lang": "en",
"is_retweet": false,
"in_reply_to_status_id": null,
"type": "tweet"
}
```
`type`(`"tweet"` 或 `"reply"`)仅存在于 `scrape_timeline_complete.py` 的输出中。
`is_reply` 仅存在于 `scrape_timeline_with_replies.py` 的输出中。
### `organize_threads.py` JSONL
```
{"type": "standalone", "tweet": {...}}
{"type": "thread", "thread_id": "...", "tweet_count": 14, "tweets": [...]}
```
话题内部按最旧优先排序(发布顺序);整个文件则按话题根节点按最新优先排序。
## 注意事项与警告
- **尊重平台服务条款和速率限制。** 抓取器在每次请求页面之间默认休眠 1.5 秒。如果触发限制,请增加休眠时间或减少 `--days` 窗口期。
- **登录挑战。** 如果 X 向您提供了验证码或双重认证(2FA)提示,请先在浏览器中登录一次账号,然后重新运行脚本。Twikit 将复用该会话。
- **依赖安全性。** `twikit` 是一个自动化 X Web 客户端的第三方库。如果可能,请使用专用/一次性账号 —— 过去曾有因大量抓取而导致账号被封禁的情况。
- **仅限公开数据。** 这些脚本仅访问对登录用户公开可见的推文。
- **话题重建仅限作者本人。** `organize_threads.py` 仅检测作者回复自己的话题。与其他用户的对话不会被拼接。
## 许可证
MIT —— 详见 [LICENSE](LICENSE)。
标签:API绕过, ESC4, JSONL格式, LLM数据集, OSINT, Python, Twikit, Twitter, URL抓取, Web爬虫, X平台, 会话Cookie, 帖子抓取, 推特爬虫, 数据抓取, 数据清洗, 数据管道, 文本提取, 无API密钥, 无后门, 时序数据库, 模拟器, 社交媒体采集, 离线分析, 自回复拼接, 舆情分析, 语料库构建, 软件工程, 逆向工具