MultiSpider 是一个基于 Django 的智能网络爬虫系统,能够根据指定的关键词自动发现、抓取并解析高相关性网页,输出结构化数据与页面快照。系统采用现代化的架构设计,支持分布式爬取、实时监控、智能去重和反爬虫策略。
- 关键词驱动:基于关键词自动发现相关页面
- 智能评分:使用 TF-IDF、BM25 等算法进行相关性评分
- 深度控制:支持设置最大爬取深度和页面数量
- 多源种子:支持搜索引擎、站点地图、RSS 等多种种子来源
- 代理池管理:支持 HTTP/HTTPS/SOCKS 代理轮换
- 智能限速:遵守 robots.txt,支持自定义爬取间隔
- 用户代理轮换:随机化请求头和用户代理
- 会话管理:支持 Cookie 和会话保持
- 内容去重:基于 SimHash 和 MinHash 的智能去重
- JavaScript 渲染:支持动态页面抓取
- 多格式解析:支持 HTML、PDF、DOC 等多种格式
- 语言识别:自动识别页面语言
- 任务监控:实时查看爬取进度和状态
- 系统监控:CPU、内存、网络等系统资源监控
- 性能分析:详细的性能指标和统计信息
- 告警通知:支持邮件、短信等多种告警方式
- 响应式设计:基于 Tailwind CSS 的现代化界面
- 实时更新:使用 WebSocket 实现实时数据更新
- 交互体验:基于 HTMX 的流畅交互体验
- 数据可视化:丰富的图表和统计展示
- 框架:Django 5.0.14 + Django-Ninja 1.4.1
- 数据库:PostgreSQL + Redis
- 任务队列:Celery + Redis
- 异步支持:Daphne (ASGI) + Channels
- 爬虫引擎:Requests + BeautifulSoup + Selenium
- 模板引擎:Django Templates + Jinja2
- CSS 框架:Tailwind CSS + Flowbite
- JavaScript:原生 JS + TypeScript
- 实时通信:WebSocket + HTMX
- 图表库:Chart.js
- 图标库:阿里巴巴图标库
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端界面 │ │ API 接口 │ │ 爬虫引擎 │
│ (Django UI) │◄──►│ (Django-Ninja) │◄──►│ (Celery) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ WebSocket │ │ 数据库 │ │ 缓存系统 │
│ (Channels) │ │ (PostgreSQL) │ │ (Redis) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
- Python 3.13+
- PostgreSQL 12+
- Redis 6+
- Node.js 16+ (可选,用于前端构建)
git clone https://github.com/your-username/MultiSpider.git
cd MultiSpiderpython -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activatepip install -r requirements.txt复制 .env.example 到 .env 并修改配置:
cp .env.example .env编辑 .env 文件:
# Django 配置
SECRET_KEY=your-secret-key-here
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
# 数据库配置
DB_NAME=multispider
DB_USER=postgres
DB_PASSWORD=your-password
DB_HOST=localhost
DB_PORT=5432
# Redis 配置
REDIS_URL=redis://localhost:6379/0
# Celery 配置
CELERY_BROKER_URL=redis://localhost:6379/1
CELERY_RESULT_BACKEND=redis://localhost:6379/2
# 爬虫配置
DEFAULT_USER_AGENT=MultiSpider/1.0
DEFAULT_DELAY=1
MAX_CONCURRENT_REQUESTS=10# 创建数据库
createdb multispider
# 运行迁移
python manage.py makemigrations
python manage.py migrate
# 创建超级用户
python manage.py createsuperuser启动 Django 开发服务器:
python manage.py runserver启动 Celery Worker(新终端):
celery -A MultiSpider worker -l info启动 Celery Beat(新终端):
celery -A MultiSpider beat -l info启动 Flower 监控(可选):
celery -A MultiSpider flower- 主界面:http://localhost:8000
- 管理后台:http://localhost:8000/admin
- API 文档:http://localhost:8000/api/docs
- Flower 监控:http://localhost:5555
- 访问主界面:打开浏览器访问 http://localhost:8000
- 创建任务:点击"创建任务"按钮
- 配置参数:
- 任务名称:为任务起一个有意义的名称
- 关键词:输入要爬取的关键词,多个关键词用逗号分隔
- 描述:任务的详细描述
- 最大页面数:限制爬取的最大页面数量
- 最大深度:限制爬取的最大深度
- 允许域名:限制只爬取指定域名(可选)
- 禁止域名:排除指定域名(可选)
- 高级选项:
- 遵守 robots.txt:是否遵守网站的 robots.txt 规则
- 跟随重定向:是否跟随 HTTP 重定向
- 启用 JavaScript:是否启用 JavaScript 渲染
- 任务列表:在主界面查看所有任务的状态
- 任务详情:点击任务名称查看详细信息
- 实时监控:任务详情页面会实时更新爬取进度
- 日志查看:查看详细的爬取日志和错误信息
- 页面列表:查看所有已爬取的页面
- 搜索过滤:根据关键词、域名、语言等条件过滤结果
- 导出数据:支持 CSV、JSON 等格式的数据导出
- 页面详情:查看单个页面的详细信息和内容
- 系统状态:查看 CPU、内存、磁盘使用情况
- 爬取统计:查看爬取速率、成功率等统计信息
- 代理管理:管理代理池,测试代理可用性
- API 统计:查看 API 调用统计和性能指标
系统提供完整的 RESTful API,支持所有核心功能:
GET /api/tasks/- 获取任务列表POST /api/tasks/- 创建新任务GET /api/tasks/{id}/- 获取任务详情PUT /api/tasks/{id}/- 更新任务DELETE /api/tasks/{id}/- 删除任务POST /api/tasks/{id}/start/- 启动任务POST /api/tasks/{id}/stop/- 停止任务
GET /api/pages/- 获取页面列表GET /api/pages/{id}/- 获取页面详情POST /api/pages/{id}/retry/- 重新爬取页面
GET /api/system/status/- 获取系统状态GET /api/system/metrics/- 获取系统指标GET /api/system/stats/- 获取统计信息
GET /api/proxies/- 获取代理列表POST /api/proxies/- 添加代理DELETE /api/proxies/{id}/- 删除代理POST /api/proxies/{id}/test/- 测试代理
详细的 API 文档请访问:http://localhost:8000/api/docs
在 settings.py 中可以配置爬虫的默认参数:
# 爬虫配置
SPIDER_SETTINGS = {
'DEFAULT_USER_AGENT': 'MultiSpider/1.0',
'DEFAULT_DELAY': 1, # 默认延迟(秒)
'MAX_CONCURRENT_REQUESTS': 10, # 最大并发请求数
'MAX_PAGES_PER_TASK': 1000, # 每个任务最大页面数
'MAX_DEPTH': 5, # 最大爬取深度
'REQUEST_TIMEOUT': 30, # 请求超时时间
'RETRY_TIMES': 3, # 重试次数
'RETRY_DELAY': 5, # 重试延迟
}# 代理配置
PROXY_SETTINGS = {
'ENABLE_PROXY': True, # 是否启用代理
'PROXY_ROTATION': True, # 是否轮换代理
'PROXY_TEST_URL': 'http://httpbin.org/ip', # 代理测试URL
'PROXY_TEST_TIMEOUT': 10, # 代理测试超时时间
}# 监控配置
MONITORING_SETTINGS = {
'ENABLE_MONITORING': True, # 是否启用监控
'METRICS_INTERVAL': 60, # 指标收集间隔(秒)
'ALERT_EMAIL': 'admin@example.com', # 告警邮箱
'ALERT_THRESHOLD': {
'CPU_USAGE': 80, # CPU使用率告警阈值
'MEMORY_USAGE': 80, # 内存使用率告警阈值
'ERROR_RATE': 10, # 错误率告警阈值
}
}- 构建镜像:
docker build -t multispider .- 使用 Docker Compose:
docker-compose up -d- 安装 Gunicorn:
pip install gunicorn- 启动应用:
gunicorn MultiSpider.wsgi:application --bind 0.0.0.0:8000- 配置 Nginx:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /path/to/MultiSpider/static/;
}
location /media/ {
alias /path/to/MultiSpider/media/;
}
}- 配置 Supervisor:
[program:multispider]
command=/path/to/venv/bin/gunicorn MultiSpider.wsgi:application --bind 127.0.0.1:8000
directory=/path/to/MultiSpider
user=www-data
autostart=true
autorestart=true
[program:celery-worker]
command=/path/to/venv/bin/celery -A MultiSpider worker -l info
directory=/path/to/MultiSpider
user=www-data
autostart=true
autorestart=true
[program:celery-beat]
command=/path/to/venv/bin/celery -A MultiSpider beat -l info
directory=/path/to/MultiSpider
user=www-data
autostart=true
autorestart=true- 索引优化:
-- 为常用查询字段添加索引
CREATE INDEX idx_crawled_page_task_id ON spider_core_crawledpage(task_id);
CREATE INDEX idx_crawled_page_status ON spider_core_crawledpage(status);
CREATE INDEX idx_crawled_page_crawled_at ON spider_core_crawledpage(crawled_at);- 连接池配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'MAX_CONNS': 20,
'MIN_CONNS': 5,
}
}
}CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS': {
'max_connections': 50,
'retry_on_timeout': True,
}
}
}
}# Celery 配置优化
CELERY_WORKER_CONCURRENCY = 4 # 工作进程数
CELERY_WORKER_PREFETCH_MULTIPLIER = 1 # 预取任务数
CELERY_TASK_ACKS_LATE = True # 延迟确认
CELERY_WORKER_MAX_TASKS_PER_CHILD = 1000 # 每个工作进程最大任务数-
数据库连接错误:
- 检查数据库服务是否启动
- 验证数据库连接参数
- 确认数据库用户权限
-
Redis 连接失败:
- 检查 Redis 服务状态
- 验证 Redis 连接配置
- 检查防火墙设置
-
Celery 任务不执行:
- 检查 Celery Worker 是否启动
- 验证 Celery 配置
- 查看 Celery 日志
-
爬取失败:
- 检查网络连接
- 验证代理设置
- 查看爬取日志
-
内存使用过高:
- 调整 Celery 并发数
- 优化数据库查询
- 增加系统内存
# Django 日志
tail -f logs/django.log
# Celery 日志
tail -f logs/celery.log
# 爬虫日志
tail -f logs/spider.log# 系统资源监控
htop
# 数据库性能监控
pg_stat_activity
# Redis 监控
redis-cli monitorMultiSpider/
├── MultiSpider/ # 项目配置
│ ├── settings.py # Django 设置
│ ├── urls.py # URL 路由
│ └── wsgi.py # WSGI 配置
├── spider_core/ # 爬虫核心模块
│ ├── models.py # 数据模型
│ ├── tasks.py # Celery 任务
│ ├── crawler.py # 爬虫引擎
│ ├── advanced.py # 高级功能
│ └── monitoring.py # 监控系统
├── spider_api/ # API 接口
│ ├── views.py # API 视图
│ ├── serializers.py # 序列化器
│ └── websocket.py # WebSocket 处理
├── spider_ui/ # 前端界面
│ ├── views.py # 视图函数
│ ├── urls.py # URL 路由
│ └── templates/ # 模板文件
├── templates/ # 全局模板
├── static/ # 静态文件
├── media/ # 媒体文件
├── logs/ # 日志文件
├── requirements.txt # 依赖包
└── README.md # 项目文档
-
Python 代码:
- 遵循 PEP 8 代码风格
- 使用类型注解
- 添加文档字符串
- 使用有意义的变量名
-
前端代码:
- 使用语义化的 HTML
- 遵循 CSS 命名规范
- 使用现代 JavaScript 特性
- 保持代码简洁易读
-
数据库设计:
- 使用合适的字段类型
- 添加必要的索引
- 设置合理的约束
- 编写清晰的注释
# 运行所有测试
python manage.py test
# 运行特定应用的测试
python manage.py test spider_core
# 运行覆盖率测试
coverage run --source='.' manage.py test
coverage report- Fork 项目
- 创建特性分支:
git checkout -b feature/new-feature - 提交更改:
git commit -am 'Add new feature' - 推送分支:
git push origin feature/new-feature - 创建 Pull Request
本项目采用 MIT 许可证,详情请查看 LICENSE 文件。
- 项目主页:https://github.com/your-username/MultiSpider
- 问题反馈:https://github.com/your-username/MultiSpider/issues
- 邮箱:admin@example.com
- 初始版本发布
- 基础爬虫功能
- Web 界面
- API 接口
- 监控系统
- 分布式爬取支持
- 更多反爬虫策略
- 机器学习相关性评分
- 更丰富的数据导出格式
感谢以下开源项目的支持:
MultiSpider - 让网络爬取变得简单而强大!
