- Add src/university_scraper module with scraper, analyzer, and CLI - Add backend FastAPI service with API endpoints and database models - Add frontend React app with university management pages - Add configs for Harvard, Manchester, and UCL universities - Add artifacts with various scraper implementations - Add Docker compose configuration for deployment - Update .gitignore to exclude generated files 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.6 KiB
9.6 KiB
大学爬虫Web系统设计方案
一、系统架构
┌─────────────────────────────────────────────────────────────────┐
│ 前端 (React/Vue) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ 输入大学URL │ │ 一键生成脚本 │ │ 查看/验证爬取数据 │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 后端 API (FastAPI) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────<E29480><E29480>───────────────────┐ │
│ │ 脚本生成API │ │ 脚本执行API │ │ 数据查询API │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌───────────────────┐ ┌───────────────┐ ┌───────────────────────┐
│ PostgreSQL │ │ 任务队列 │ │ Agent (Claude) │
│ 数据库 │ │ (Celery) │ │ 分析+生成脚本 │
│ - 爬虫脚本 │ └───────────────┘ └───────────────────────┘
│ - 爬取结果 │
│ - 执行日志 │
└───────────────────┘
二、技术栈选择
后端
- 框架: FastAPI (Python,与现有爬虫代码无缝集成)
- 数据库: PostgreSQL (存储脚本、结果、日志)
- 任务队列: Celery + Redis (异步执行爬虫任务)
- ORM: SQLAlchemy
前端
- 框架: React + TypeScript (或 Vue.js)
- UI库: Ant Design / Material-UI
- 状态管理: React Query (数据获取和缓存)
部署
- 容器化: Docker + Docker Compose
- 云平台: 可部署到 AWS/阿里云/腾讯云
三、数据库设计
-- 大学表
CREATE TABLE universities (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
url VARCHAR(500) NOT NULL,
country VARCHAR(100),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 爬虫脚本表
CREATE TABLE scraper_scripts (
id SERIAL PRIMARY KEY,
university_id INTEGER REFERENCES universities(id),
script_name VARCHAR(255) NOT NULL,
script_content TEXT NOT NULL, -- Python脚本代码
config_content TEXT, -- YAML配置
version INTEGER DEFAULT 1,
status VARCHAR(50) DEFAULT 'draft', -- draft, active, deprecated
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 爬取任务表
CREATE TABLE scrape_jobs (
id SERIAL PRIMARY KEY,
university_id INTEGER REFERENCES universities(id),
script_id INTEGER REFERENCES scraper_scripts(id),
status VARCHAR(50) DEFAULT 'pending', -- pending, running, completed, failed
started_at TIMESTAMP,
completed_at TIMESTAMP,
error_message TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- 爬取结果表 (JSON存储层级数据)
CREATE TABLE scrape_results (
id SERIAL PRIMARY KEY,
job_id INTEGER REFERENCES scrape_jobs(id),
university_id INTEGER REFERENCES universities(id),
result_data JSONB NOT NULL, -- 学院→项目→导师 JSON数据
schools_count INTEGER,
programs_count INTEGER,
faculty_count INTEGER,
created_at TIMESTAMP DEFAULT NOW()
);
-- 执行日志表
CREATE TABLE scrape_logs (
id SERIAL PRIMARY KEY,
job_id INTEGER REFERENCES scrape_jobs(id),
level VARCHAR(20), -- info, warning, error
message TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
四、API接口设计
1. 大学管理
POST /api/universities 创建大学
GET /api/universities 获取大学列表
GET /api/universities/{id} 获取大学详情
DELETE /api/universities/{id} 删除大学
2. 爬虫脚本
POST /api/scripts/generate 生成爬虫脚本 (Agent自动分析)
GET /api/scripts/{university_id} 获取大学的爬虫脚本
PUT /api/scripts/{id} 更新脚本
3. 爬取任务
POST /api/jobs/start/{university_id} 启动爬取任务
GET /api/jobs/{id} 获取任务状态
GET /api/jobs/university/{id} 获取大学的任务列表
POST /api/jobs/{id}/cancel 取消任务
4. 数据结果
GET /api/results/{university_id} 获取爬取结果
GET /api/results/{university_id}/schools 获取学院列表
GET /api/results/{university_id}/programs 获取项目列表
GET /api/results/{university_id}/faculty 获取导师列表
GET /api/results/{university_id}/export?format=json 导出数据
五、前端页面设计
页面1: 首页/大学列表
- 显示已添加的大学列表
- "添加新大学" 按钮
- 每个大学卡片显示:名称、状态、项目数、导师数、操作按钮
页面2: 添加大学 (一键生成脚本)
- 输入框:大学官网URL
- "分析并生成脚本" 按钮
- 显示分析进度和日志
- 生成完成后自动跳转到管理页面
页面3: 大学管理页面
- 大学基本信息
- 爬虫脚本状态
- "一键运行爬虫" 按钮
- 运行进度和日志实时显示
- 历史任务列表
页面4: 数据查看页面
- 树形结构展示:学院 → 项目 → 导师
- 搜索和筛选功能
- 数据导出按钮 (JSON/Excel)
- 数据校验和编辑功能
六、实现步骤
阶段1: 后端基础 (优先)
- 创建 FastAPI 项目结构
- 设计数据库模型 (SQLAlchemy)
- 实现基础 CRUD API
- 集成现有爬虫代码
阶段2: 脚本生成与执行
- 实现 Agent 自动分析逻辑
- 实现脚本存储和版本管理
- 集成 Celery 异步任务队列
- 实现爬虫执行和日志记录
阶段3: 前端开发
- 搭建 React 项目
- 实现大学列表页面
- 实现脚本生成页面
- 实现数据查看页面
阶段4: 部署上线
- Docker 容器化
- 部署到云服务器
- 配置域名和 HTTPS
七、目录结构
university-scraper-web/
├── backend/
│ ├── app/
│ │ ├── __init__.py
│ │ ├── main.py # FastAPI入口
│ │ ├── config.py # 配置
│ │ ├── database.py # 数据库连接
│ │ ├── models/ # SQLAlchemy模型
│ │ │ ├── university.py
│ │ │ ├── script.py
│ │ │ ├── job.py
│ │ │ └── result.py
│ │ ├── schemas/ # Pydantic模型
│ │ ├── api/ # API路由
│ │ │ ├── universities.py
│ │ │ ├── scripts.py
│ │ │ ├── jobs.py
│ │ │ └── results.py
│ │ ├── services/ # 业务逻辑
│ │ │ ├── scraper_service.py
│ │ │ └── agent_service.py
│ │ └── tasks/ # Celery任务
│ │ └── scrape_task.py
│ ├── requirements.txt
│ └── Dockerfile
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ ├── pages/
│ │ ├── services/
│ │ └── App.tsx
│ ├── package.json
│ └── Dockerfile
├── docker-compose.yml
└── README.md
八、关于脚本存储位置的建议
推荐方案:PostgreSQL + 文件系统混合
-
PostgreSQL 存储:
- 脚本元数据 (名称、版本、状态)
- 脚本代码内容 (TEXT字段)
- 配置文件内容 (JSONB字段)
- 爬取结果 (JSONB字段)
-
优点:
- 事务支持,数据一致性
- 版本管理方便
- 查询和搜索方便
- 备份和迁移简单
- 与后端集成紧密
-
云部署选项:
- AWS RDS PostgreSQL
- 阿里云 RDS PostgreSQL
- 腾讯云 TDSQL-C
备选方案:MongoDB
如果数据结构经常变化,可以考虑 MongoDB:
- 灵活的文档结构
- 适合存储层级化的爬取结果
- 但 Python 生态对 PostgreSQL 支持更好