# 分布式实验 **Repository Path**: wang-xiaoyao-d/distributed-experiment ## Basic Information - **Project Name**: 分布式实验 - **Description**: 小组成员:庞臣志、郝思润、雷涛涛 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-02 - **Last Updated**: 2026-01-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 分布式网页爬取系统使用文档 ## 1. 项目概述 ### 1.1 功能特点 - **分布式爬取**:支持多节点并行执行爬取任务 - **精确记录**:精确记录每个网页的大小信息 - **智能去重**:基于URL标准化和哈希的高效去重机制 - **友好界面**:提供直观的GUI操作界面 - **实时监控**:分布式统计信息实时更新 - **灵活配置**:支持自定义爬取参数 ### 1.2 系统架构 ``` ┌─────────────────────────────────────────────────────────┐ │ 主控节点 (Master) │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ 任务管理 │ │ 结果处理 │ │ 节点监控 │ │ │ └────────────┘ └────────────┘ └────────────┘ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ URL去重 │ │ 统计管理 │ │ 命令下发 │ │ │ └────────────┘ └────────────┘ └────────────┘ │ └─────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ Redis服务器 │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ 任务队列 │ │ 结果队列 │ │ 已访问URL集合 │ │ │ └────────────┘ └────────────┘ └────────────┘ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ 节点状态频道 │ │ 命令频道 │ │ 心跳信息 │ │ │ └────────────┘ └────────────┘ └────────────┘ │ └─────────────────────────────────────────────────────────┘ │ ┌──────────────┼──────────────┐ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 工作节点1 │ │ 工作节点2 │ │ 工作节点3 │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │ 任务执行 │ │ │ │ 任务执行 │ │ │ │ 任务执行 │ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │ 结果返回 │ │ │ │ 结果返回 │ │ │ │ 结果返回 │ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │ 心跳发送 │ │ │ │ 心跳发送 │ │ │ │ 心跳发送 │ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` ## 2. 环境准备 ### 2.1 依赖要求 - Python 3.8+ - Redis 5.0+ - 必要依赖包: - tkinter (GUI界面) - requests (HTTP请求) - beautifulsoup4 (HTML解析) - redis (分布式通信) ### 2.2 安装依赖 ```bash # 安装基础依赖 pip install requests beautifulsoup4 redis # 或使用requirements.txt(如果存在) pip install -r requirements.txt ``` ## 3. Redis安装指南 ### 3.1 Windows系统 #### 方法1:使用Windows安装包 1. **下载Redis** - 访问GitHub下载页面:[https://github.com/tporadowski/redis/releases](https://github.com/tporadowski/redis/releases) - 下载最新的Windows版本(如:`Redis-x64-5.0.14.1.msi`) 2. **安装Redis** - 双击安装包,按照提示进行安装 - 建议勾选"Add Redis to PATH"选项 - 默认安装路径:`C:\Program Files\Redis` 3. **验证安装** - 打开命令提示符 - 执行命令:`redis-server --version` - 输出Redis版本信息表示安装成功 4. **启动Redis服务** - 作为Windows服务启动: ```bash redis-server --service-install redis-server --service-start ``` - 或临时启动(测试用): ```bash redis-server redis.windows.conf ``` 5. **验证Redis运行** - 打开新的命令提示符 - 执行命令:`redis-cli ping` - 返回 `PONG` 表示Redis服务正常运行 #### 方法2:使用WSL(Windows Subsystem for Linux) 1. **安装WSL** - 打开PowerShell作为管理员 - 执行:`wsl --install` - 重启系统后安装Ubuntu 2. **在WSL中安装Redis** - 打开Ubuntu终端 - 执行:`sudo apt update && sudo apt install redis-server` - 启动Redis:`sudo service redis-server start` - 验证:`redis-cli ping` ### 3.2 Linux系统 #### Ubuntu/Debian ```bash # 更新软件包列表 sudo apt update # 安装Redis sudo apt install redis-server # 启动Redis服务 sudo systemctl start redis-server # 设置开机自启 sudo systemctl enable redis-server # 验证安装 redis-cli ping ``` #### CentOS/RHEL ```bash # 安装EPEL仓库 sudo yum install epel-release # 安装Redis sudo yum install redis # 启动Redis服务 sudo systemctl start redis # 设置开机自启 sudo systemctl enable redis # 验证安装 redis-cli ping ``` ### 3.3 macOS系统 #### 使用Homebrew ```bash # 安装Homebrew(如果未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 安装Redis brew install redis # 启动Redis服务 brew services start redis # 或临时启动 redis-server # 验证安装 redis-cli ping ``` ## 4. 程序结构 ``` fenbushi/ ├── main.py # 主程序(GUI界面) ├── crawler_core.py # 爬虫核心模块 ├── test_crawler_core.py # 核心功能测试脚本 ├── distributed/ # 分布式组件目录 │ ├── config.py # 配置文件 │ ├── models.py # 数据模型 │ ├── master.py # 主控节点 │ └── worker.py # 工作节点 └── README.md # 项目文档 ``` ## 5. 使用方法 ### 5.1 单节点模式(默认) 单节点模式不需要Redis,直接运行即可: ```bash python main.py ``` #### 操作步骤 1. **启动程序**:运行上述命令 2. **配置参数**: - 输入起始URL - 设置最大页面数和深度 - 选择爬取策略(BFS/DFS) 3. **开始爬取**:点击"开始爬取"按钮 4. **查看结果**:在结果表格中查看爬取结果 5. **导出数据**:可导出为JSON或CSV格式 ### 5.2 分布式模式 分布式模式需要Redis支持,分为主控节点和工作节点两部分。 #### 5.2.1 启动主控节点 1. **确保Redis运行**:执行 `redis-cli ping` 验证 2. **启动GUI程序**: ```bash python main.py ``` 3. **配置分布式模式**: - 勾选"启用分布式模式" - 配置Redis连接信息(默认:localhost:6379) - 其他参数设置同上 4. **开始爬取**:点击"开始爬取"按钮 #### 5.2.2 启动工作节点 在一个或多个终端中执行: ```bash python -m distributed.worker ``` - 每个工作节点会自动连接到Redis服务器 - 工作节点数量根据硬件资源和网络条件调整 - 建议:根据目标网站的承受能力合理设置节点数量 #### 5.2.3 监控分布式状态 - **活跃节点数**:界面中"活跃节点"显示当前连接的工作节点数量 - **队列长度**:"队列长度"显示待处理的任务数量 - **总任务数**:"总任务数"显示系统处理的总任务数 - **日志信息**:日志区域显示分布式相关信息 ## 6. 配置说明 ### 6.1 Redis配置 修改 `distributed/config.py` 文件: ```python # Redis配置 REDIS_HOST = "localhost" # Redis主机地址 REDIS_PORT = 6379 # Redis端口 REDIS_DB = 0 # Redis数据库索引 ``` ### 6.2 爬取配置 ```python # 爬取配置 DEFAULT_DELAY = 1 # 默认请求间隔(秒) DEFAULT_MAX_PAGES = 100 # 默认最大爬取页面数 DEFAULT_MAX_DEPTH = 3 # 默认最大爬取深度 ``` ### 6.3 分布式配置 ```python # 任务相关配置 TASK_TIMEOUT = 30 # 任务超时时间(秒) MAX_RETRY_COUNT = 3 # 任务最大重试次数 # 节点相关配置 WORKER_HEARTBEAT_INTERVAL = 5 # 工作节点心跳间隔(秒) WORKER_TIMEOUT = 10 # 工作节点超时时间(秒) ``` ## 7. 常见问题排查 ### 7.1 Redis连接失败 #### 错误信息 ``` ❌ Redis连接失败: Error 10061 connecting to localhost:6379. 由于目标计算机积极拒绝,无法连接。 ``` #### 解决方案 1. **检查Redis服务是否启动** - Windows:`redis-server --service-start` - Linux:`sudo systemctl start redis-server` - macOS:`brew services start redis` 2. **检查Redis配置** - 确保主机地址和端口正确 - 检查防火墙是否允许Redis端口访问 3. **使用单节点模式** - 取消勾选"启用分布式模式" - 单节点模式不依赖Redis ### 7.2 Redis命令未识别 #### 错误信息 ``` 'redis-cli' 不是内部或外部命令,也不是可运行的程序或批处理文件。 ``` #### 解决方案 - **检查环境变量**:确保Redis安装目录已添加到系统PATH - **使用完整路径**:如 `"C:\Program Files\Redis\redis-cli.exe" ping` ### 7.3 端口被占用 #### 错误信息 ``` Error binding to 127.0.0.1:6379: Address already in use ``` #### 解决方案 1. **查找占用端口的进程** - Windows:`netstat -ano | findstr :6379` - Linux/macOS:`lsof -i :6379` 2. **终止占用进程** - Windows:`taskkill /F /PID <进程ID>` - Linux/macOS:`kill -9 <进程ID>` 3. **修改Redis端口** - 编辑Redis配置文件(`redis.conf` 或 `redis.windows.conf`) - 修改 `port` 配置项 ### 7.4 分布式功能导入失败 #### 错误信息 ``` 分布式功能导入失败: No module named 'redis' ``` #### 解决方案 - 安装Redis模块:`pip install redis` - 确保在正确的Python环境中安装 ## 8. 最佳实践 ### 8.1 性能优化 1. **工作节点数量**: - 根据网络带宽和目标网站承受能力调整 - 建议开始时使用2-3个节点 - 逐步增加节点数量,观察系统性能 2. **请求间隔**: - 适当设置请求间隔,避免对目标网站造成过大压力 - 建议设置为1-3秒 - 尊重网站的robots.txt规则 3. **爬取深度**: - 合理设置爬取深度,避免无限递归 - 建议设置为2-5层 ### 8.2 资源管理 1. **内存使用**: - 定期清理已爬取数据 - 合理设置最大页面数 - 监控Redis内存使用情况 2. **磁盘空间**: - 定期导出和清理数据 - 监控日志文件大小 ### 8.3 稳定性保障 1. **错误处理**: - 程序具有自动重试机制 - 定期检查日志,处理异常情况 2. **备份策略**: - 定期导出爬取数据 - 备份Redis数据 3. **监控系统**: - 监控Redis服务状态 - 监控工作节点连接状态 ## 9. 功能特性 ### 9.1 核心功能 | 功能 | 描述 | |------|------| | 分布式爬取 | 支持多节点并行爬取 | | 网页大小记录 | 精确记录每个网页的字节大小 | | URL去重 | 基于URL标准化和哈希的高效去重 | | 多策略支持 | 支持BFS和DFS爬取策略 | | 结果导出 | 支持JSON和CSV格式导出 | | 实时监控 | 分布式统计信息实时更新 | | 节点管理 | 自动管理工作节点状态 | | 任务重试 | 失败任务自动重试 | ### 9.2 界面功能 | 功能 | 描述 | |------|------| | 起始URL配置 | 输入爬取的起始URL | | 爬取参数设置 | 设置最大页面数、深度和策略 | | 分布式配置 | 配置Redis连接信息 | | 实时统计 | 显示爬取进度和分布式状态 | | 结果表格 | 展示爬取结果,包含网页大小 | | 详情查看 | 双击查看完整爬取信息 | | 日志记录 | 详细记录爬取过程 | | 数据导出 | 导出爬取结果 | ## 10. 许可证 本项目采用MIT许可证,详情请查看LICENSE文件。 ## 11. 联系方式 如有问题或建议,请提交Issue或联系项目维护者。 --- **使用提示**: - 请遵守robots.txt规则,尊重网站版权 - 合理设置爬取参数,避免对目标网站造成过大压力 - 定期备份爬取数据,防止数据丢失 - 分布式模式下确保Redis服务稳定运行 祝您使用愉快!