Files
universal-crawler/README.md
T

96 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 通用爬虫系统 (universal-crawler)
基于原 tpu_crawlerPlaywright + stealth + 系统 Chrome)改造的全能网页爬取管理系统。
**可爬取任意网址**,自带 Web 管理界面,支持批量、定时、自动三种模式。
## 快速开始
```bash
./start.sh # 启动 (默认端口 16062)
./start.sh stop # 停止
./start.sh restart # 重启
./start.sh status # 查看状态
```
启动后打开管理界面:`http://<服务器IP>:16062/`
环境要求(本机已具备):
- Python 3.12 (`/home/hz1/miniconda3/envs/openclaw/bin/python`)
- flask / playwright / playwright-stealth
- 系统 Chrome `/usr/bin/google-chrome`
## 功能总览
### 1. 前端管理界面
- **总体统计区**:任务总数 / 运行中 / 累计运行次数 / 成功失败页面 / 图片数 / 磁盘占用
- **日间/夜间双主题**:右上角按钮一键切换,自动记忆选择
- 任务卡片总览:状态、进度、统计、下次调度时间一目了然
- 一键操作:开始 / 暂停 / 恢复 / 终止 / 编辑 / 删除
- 任务详情:历次运行记录、结果明细表(HTML/TXT 在线预览)、图片缩略图、实时日志
- **防误关保护**:新建/编辑弹窗有未保存修改时,点窗口外 / ESC / 关闭会先确认
- 运行中的任务参数支持**热更新**(修改后从下一页起生效)
### 2. 批量爬取模式
一次粘贴多个网址(每行一个,`#` 注释),可配置:
- 项目名称、输出目录(默认 `out/<任务ID>`,可填绝对路径)
- 爬取间隔(随机秒数区间,防封 IP)、单页超时
- 失败重试次数 / 重试间隔
- 是否爬取图片(自动下载页面图片到 `xxx_img/` 目录)
- 完成后邮件通知(复用 send_email.py,默认发到 wlq@tphai.com
### 3. 定时爬取模式
- **间隔调度**:每 N 分钟 / 小时 / 天,可指定**首次执行时间**(留空=尽快,已过时间立即执行)
- **cron 表达式**:5 段式(分 时 日 月 周,周 0/7=周日),如 `0 3 * * *` 每天凌晨 3 点,同样支持首次执行时间作为计算起点
- 可启用/停用调度,自动计算下次执行时间;到点自动开跑,跑完自动计算下一次
### 4. 自动爬取模式
给定一个起始网址,系统自动从页面里发现链接、按规则筛选后 BFS 爬取:
- **包含规则**:只爬包含指定子串(或正则)的链接
- **排除规则**:跳过匹配的链接(如 login、/tag/
- **仅同域名**:限制在起始网站内
- **最大页数 / 最大深度**:控制爬取规模
- 其余参数(间隔、重试、图片、通知)同批量模式
## 输出文件
每个任务输出到独立目录(默认 `out/<任务ID>/`):
- `NNNN_<域名>_<时间戳>.html` — 完整网页
- `NNNN_<域名>_<时间戳>.txt` — 提取的纯文本正文
- `NNNN_<域名>_<时间戳>_img/` — 下载的图片(开启图片爬取时)
## API 速查
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/tasks` | 任务列表(含最新运行) |
| POST | `/api/tasks` | 创建任务 |
| GET/PUT/DELETE | `/api/tasks/<id>` | 详情 / 修改 / 删除 |
| POST | `/api/tasks/<id>/start` | 开始爬取 |
| POST | `/api/tasks/<id>/pause` | 暂停 |
| POST | `/api/tasks/<id>/resume` | 恢复 |
| POST | `/api/tasks/<id>/stop` | 终止 |
| GET | `/api/runs/<rid>` | 运行详情(结果+日志) |
| GET | `/api/runs/<rid>/logs?offset=N` | 增量日志 |
| GET | `/api/file?task_id=&path=` | 读取输出文件(HTML/TXT/图片) |
## 目录结构
```
universal-crawler/
├── app.py # Flask 主服务 (端口 16062)
├── engine.py # 爬虫引擎 (批量/自动/图片/重试/暂停恢复)
├── scheduler.py # 定时调度器 (间隔 + cron)
├── store.py # 任务/运行记录持久化 (JSON)
├── notify.py # 邮件通知
├── static/ # 前端管理界面
├── data/ # 运行时数据 (任务、运行记录、cookie)
├── out/ # 默认爬取输出
├── legacy/ # 原 tpu_crawler 脚本备份
└── start.sh # 启动脚本 (PID 文件管理)
```
## 注意事项
- 爬取前尊重目标站点 robots.txt / 使用条款,仅用于合法用途
- 延迟别设太低(建议 ≥1s),高频访问会被封 IP
- 每个任务独立的 cookie 文件,互不干扰;被反爬拦截时删除 `data/cookies_<任务ID>.json` 重新验证