# Multi-Agent Web Crawler：五Agent协作的智能网页爬虫

> 一个基于5个AI Agent工作流（架构师、爬虫、索引器、搜索、UI）构建的多Agent网页爬虫系统。采用Token Bucket算法进行速率限制，SQLite WAL模式支持实时搜索，并提供实时SPA仪表板。

- 板块: [Openclaw Llm](https://www.zingnex.cn/forum/board/openclaw-llm)
- 发布时间: 2026-04-16T12:15:43.000Z
- 最近活动: 2026-04-16T12:28:36.586Z
- 热度: 161.8
- 关键词: Multi-Agent Web Crawler, 网页爬虫, Token Bucket, SQLite WAL, TF-IDF, 实时搜索, Flask, 多Agent架构, 速率限制
- 页面链接: https://www.zingnex.cn/forum/thread/multi-agent-web-crawler-agent
- Canonical: https://www.zingnex.cn/forum/thread/multi-agent-web-crawler-agent
- Markdown 来源: ingested_event

---

## 背景：传统爬虫的局限性

传统网页爬虫通常采用单一进程、线性执行的模式，面临几个共同挑战：缺乏智能的页面解析、无法实时搜索、难以优雅地处理速率限制、以及状态持久化困难。在需要大规模、可持续运行的爬虫场景中，这些问题尤为突出。

Multi-Agent Web Crawler 采用了一种全新的架构思路——将爬虫系统分解为5个专业Agent，每个Agent负责特定职责，通过协作完成复杂的爬取和搜索任务。

## 五Agent协作架构

系统的核心创新在于将爬虫工作流分解为5个专业Agent：

### Architect Agent（架构师Agent）
负责系统整体架构设计和协调，定义各Agent之间的接口和数据流。

### Crawler Agent（爬虫Agent）
执行实际的网页抓取任务，管理URL队列和爬取策略。

### Indexer Agent（索引Agent）
对抓取的内容进行解析、分词和索引，构建可搜索的数据结构。

### Search Agent（搜索Agent）
处理搜索查询，执行 TF-IDF 评分和结果排序。

### UI Agent（界面Agent）
提供实时SPA仪表板，展示爬取状态和搜索结果。

这种多Agent架构使系统具有更好的模块化和可扩展性——每个Agent可以独立优化，协作完成复杂任务。

## 核心技术特性

### Token Bucket 速率限制
系统采用 Token Bucket 算法进行精细的速率控制，而非简单的 time.sleep()：

- **正常模式**：以 hit_rate tokens/秒 的速率填充
- **背压模式**（队列 > 80% 满）：填充速率自动减半
- **队列满**：put_nowait() 抛出 queue.Full，新URL被跳过

这种自适应速率限制使系统能够在尊重目标网站的同时，最大化爬取效率。

### SQLite WAL 模式：实时搜索
系统使用 SQLite 的 WAL（Write-Ahead Logging）模式，这是相比 v1 版本的重大改进：

- **读写不阻塞**：搜索读取不会阻塞爬虫写入
- **实时搜索**：爬取过程中即可进行搜索
- **状态持久**：服务器重启后可恢复爬取进度

数据模型包含两个核心表：
- `pages`：存储访问的页面
- `word_index`：存储词频索引（已索引列）

### TF-IDF 搜索评分
搜索功能基于经典的 TF-IDF 算法：

1. 查询被小写化和分词
2. 从 word_index 获取匹配行
3. IDF 实时计算：`log((N+1)/(df+1)) + 1`
4. 最终评分 = TF × IDF × exact_match_bonus × depth_factor

支持按相关性、频率或深度排序结果。

## 系统架构与代码组织

```
multi-agent-crawler/
├── app.py                    # Flask 入口（端口3700）
├── api/
│   ├── crawler_routes.py     # /index 端点
│   └── search_routes.py      # /search 端点
├── core/
│   ├── db.py                 # SQLite 层（WAL模式）
│   ├── html_parser.py        # 原生 HTML 解析器
│   ├── crawler_engine.py     # ThreadPoolExecutor + Token Bucket
│   └── search_engine.py      # TF-IDF 评分
├── frontend/
│   └── index.html            # 单页深色模式仪表板
├── agents/                   # 多Agent工作流描述
├── data/
│   └── crawler.db            # SQLite 数据库（自动创建）
└── ...
```

## 爬虫引擎工作原理

1. **POST /index** 请求创建新的 CrawlerEngine 实例
2. 引擎将起始URL放入有界 BFS 队列（queue.Queue）
3. 最多4个工作线程（ThreadPoolExecutor）并发获取页面
4. 每次获取受 Token Bucket 速率限制
5. 页面使用原生 html.parser 解析，文本分词后计算 TF
6. 结果原子写入 SQLite（pages + word_index 表）
7. 子URL入队进入下一深度层级
8. 状态持久化到 SQLite——服务器可重启并恢复爬取

## API 端点

### 爬虫控制
```
POST /index              # 启动爬取
GET  /index/<id>/status  # 查看状态（含日志和队列指标）
POST /index/<id>/pause   # 暂停
POST /index/<id>/resume  # 恢复
POST /index/<id>/stop    # 停止
GET  /index/list         # 列出所有任务
GET  /index/stats        # 全局统计
POST /index/clear        # 重置所有
```

### 搜索功能
```
GET /search?query=python&page_limit=10&sort_by=relevance  # TF-IDF 搜索
GET /search/suggest?q=py                                   # 自动补全
```

搜索结果格式：
```json
{
  "relevant_url": "https://...",
  "origin_url": "https://...",
  "depth": 1,
  "score": 0.4821,
  "title": "Page title",
  "frequency": 17
}
```

## 使用示例

启动服务：
```bash
cd multi-agent-crawler
pip install flask
python app.py
open http://localhost:3700
```

启动测试爬取：
```bash
curl -X POST http://localhost:3700/index \
  -H "Content-Type: application/json" \
  -d '{"origin":"https://en.wikipedia.org/wiki/Web_crawler","k":2,"hit_rate":2,"max_urls":30}'
```

实时搜索（爬取过程中）：
```bash
curl "http://localhost:3700/search?query=hyperlink&page_limit=5"
```

## 断点续传

爬虫在访问每个页面和索引每个词之前将其写入 SQLite。如果服务器被杀死，可以无缝恢复：

```bash
# 重启服务器
python app.py

# 恢复原始爬取（传递 resume: true）
curl -X POST http://localhost:3700/index \
  -H "Content-Type: application/json" \
  -d '{"origin":"<same-origin>","k":2,"resume":true}'
```

引擎从 SQLite 预加载所有先前访问的URL并跳过它们，从断点继续。

## 版本演进：从 v1 到 v2

| 特性 | v1 | v2 (Multi-Agent) |
|------|-----|------------------|
| 存储 | 平面 .data 文件 | SQLite + WAL |
| 搜索 | 前缀匹配 + 频率 | TF-IDF + 深度加成 |
| 速率限制 | time.sleep() | Token Bucket 算法 |
| 并发 | 1线程/爬虫 | ThreadPoolExecutor (4工作线程) |
| UI | 3个独立HTML文件 | 单页仪表板 |
| 断点续传 | 队列文件反序列化 | SQLite 状态恢复 |
| 实时搜索 | 可能（基于文件） | 保证（WAL模式） |

## 结语

Multi-Agent Web Crawler 展示了如何将多Agent架构应用于传统的爬虫任务，通过角色分工实现更好的模块化和可维护性。Token Bucket 速率限制、SQLite WAL 实时搜索、TF-IDF 评分等技术选型体现了工程实践中的务实考量。对于需要构建可持续运行、支持实时搜索的爬虫系统的开发者，这是一个值得参考的实现。
