GitHub - CrescentR/SpiderByKeySys: This is a SpiderSys of Key, you can search special web by Key word. The Sys was build by Django,HTMX,and RabbitMQ. · GitHub
Skip to content

CrescentR/SpiderByKeySys

Repository files navigation

MultiSpider - 智能网络爬虫系统

项目简介

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+ (可选,用于前端构建)

安装步骤

1. 克隆项目

git clone https://github.com/your-username/MultiSpider.git
cd MultiSpider

2. 创建虚拟环境

python -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate

3. 安装依赖

pip install -r requirements.txt

4. 配置环境变量

复制 .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

5. 数据库设置

# 创建数据库
createdb multispider

# 运行迁移
python manage.py makemigrations
python manage.py migrate

# 创建超级用户
python manage.py createsuperuser

6. 启动服务

启动 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

7. 访问系统

使用指南

创建爬取任务

  1. 访问主界面:打开浏览器访问 http://localhost:8000
  2. 创建任务:点击"创建任务"按钮
  3. 配置参数
    • 任务名称:为任务起一个有意义的名称
    • 关键词:输入要爬取的关键词,多个关键词用逗号分隔
    • 描述:任务的详细描述
    • 最大页面数:限制爬取的最大页面数量
    • 最大深度:限制爬取的最大深度
    • 允许域名:限制只爬取指定域名(可选)
    • 禁止域名:排除指定域名(可选)
  4. 高级选项
    • 遵守 robots.txt:是否遵守网站的 robots.txt 规则
    • 跟随重定向:是否跟随 HTTP 重定向
    • 启用 JavaScript:是否启用 JavaScript 渲染

监控任务状态

  1. 任务列表:在主界面查看所有任务的状态
  2. 任务详情:点击任务名称查看详细信息
  3. 实时监控:任务详情页面会实时更新爬取进度
  4. 日志查看:查看详细的爬取日志和错误信息

查看爬取结果

  1. 页面列表:查看所有已爬取的页面
  2. 搜索过滤:根据关键词、域名、语言等条件过滤结果
  3. 导出数据:支持 CSV、JSON 等格式的数据导出
  4. 页面详情:查看单个页面的详细信息和内容

系统监控

  1. 系统状态:查看 CPU、内存、磁盘使用情况
  2. 爬取统计:查看爬取速率、成功率等统计信息
  3. 代理管理:管理代理池,测试代理可用性
  4. API 统计:查看 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 部署

  1. 构建镜像
docker build -t multispider .
  1. 使用 Docker Compose
docker-compose up -d

生产环境部署

  1. 安装 Gunicorn
pip install gunicorn
  1. 启动应用
gunicorn MultiSpider.wsgi:application --bind 0.0.0.0:8000
  1. 配置 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/;
    }
}
  1. 配置 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

性能优化

数据库优化

  1. 索引优化
-- 为常用查询字段添加索引
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);
  1. 连接池配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'OPTIONS': {
            'MAX_CONNS': 20,
            'MIN_CONNS': 5,
        }
    }
}

Redis 优化

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 配置优化
CELERY_WORKER_CONCURRENCY = 4  # 工作进程数
CELERY_WORKER_PREFETCH_MULTIPLIER = 1  # 预取任务数
CELERY_TASK_ACKS_LATE = True  # 延迟确认
CELERY_WORKER_MAX_TASKS_PER_CHILD = 1000  # 每个工作进程最大任务数

故障排除

常见问题

  1. 数据库连接错误

    • 检查数据库服务是否启动
    • 验证数据库连接参数
    • 确认数据库用户权限
  2. Redis 连接失败

    • 检查 Redis 服务状态
    • 验证 Redis 连接配置
    • 检查防火墙设置
  3. Celery 任务不执行

    • 检查 Celery Worker 是否启动
    • 验证 Celery 配置
    • 查看 Celery 日志
  4. 爬取失败

    • 检查网络连接
    • 验证代理设置
    • 查看爬取日志
  5. 内存使用过高

    • 调整 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 monitor

开发指南

项目结构

MultiSpider/
├── 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          # 项目文档

代码规范

  1. Python 代码

    • 遵循 PEP 8 代码风格
    • 使用类型注解
    • 添加文档字符串
    • 使用有意义的变量名
  2. 前端代码

    • 使用语义化的 HTML
    • 遵循 CSS 命名规范
    • 使用现代 JavaScript 特性
    • 保持代码简洁易读
  3. 数据库设计

    • 使用合适的字段类型
    • 添加必要的索引
    • 设置合理的约束
    • 编写清晰的注释

测试

# 运行所有测试
python manage.py test

# 运行特定应用的测试
python manage.py test spider_core

# 运行覆盖率测试
coverage run --source='.' manage.py test
coverage report

贡献指南

  1. Fork 项目
  2. 创建特性分支git checkout -b feature/new-feature
  3. 提交更改git commit -am 'Add new feature'
  4. 推送分支git push origin feature/new-feature
  5. 创建 Pull Request

许可证

本项目采用 MIT 许可证,详情请查看 LICENSE 文件。

联系我们

更新日志

v1.0.0 (2024-01-01)

  • 初始版本发布
  • 基础爬虫功能
  • Web 界面
  • API 接口
  • 监控系统

v1.1.0 (计划中)

  • 分布式爬取支持
  • 更多反爬虫策略
  • 机器学习相关性评分
  • 更丰富的数据导出格式

致谢

感谢以下开源项目的支持:


MultiSpider - 让网络爬取变得简单而强大!

About

This is a SpiderSys of Key, you can search special web by Key word. The Sys was build by Django,HTMX,and RabbitMQ.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors