# 代理IP抓取和验证服务 一个基于Node.js的代理IP自动抓取、验证和管理系统,提供RESTful API接口和定时任务调度。 ## 功能特性 - 🕷️ **自动抓取**: 从快代理网站抓取免费代理IP - ✅ **自动验证**: 通过访问百度验证代理可用性 - 🗄️ **数据存储**: 使用SQLite存储代理数据 - 🔄 **定时任务**: 自动抓取和验证维护代理池 - 🚀 **RESTful API**: 完整的API接口服务 - 📊 **统计监控**: 实时代理池状态统计 - 🛡️ **错误处理**: 完善的错误处理和重试机制 ## 项目结构 ``` dailiip/ ├── src/ │ ├── database/ │ │ ├── db.js # 数据库连接管理 │ │ └── models/ │ │ └── proxy.js # 代理数据模型 │ ├── services/ │ │ ├── scraper.js # 代理抓取服务 │ │ ├── validator.js # 代理验证服务 │ │ └── scheduler.js # 定时任务调度器 │ ├── routes/ │ │ └── proxies.js # API路由 │ └── app.js # 应用入口 ├── config/ │ └── database.js # 数据库配置 ├── logs/ # 日志目录 ├── proxies.db # SQLite数据库 ├── package.json └── README.md ``` ## 快速开始 ### 1. 安装依赖 ```bash npm install ``` ### 2. 启动服务 ```bash npm start ``` 服务将在 `http://localhost:3000` 启动 ### 3. 验证服务 访问 `http://localhost:3000/health` 检查服务状态 ## API接口 ### 基础信息 - **基础URL**: `http://localhost:3000` - **Content-Type**: `application/json` ### 接口列表 #### 1. 获取服务信息 ``` GET / ``` #### 2. 健康检查 ``` GET /health ``` #### 3. 获取代理列表 ``` GET /api/proxies?limit=100&offset=0&sortBy=response_time&order=ASC ``` - `limit`: 限制数量 (默认100) - `offset`: 偏移量 (默认0) - `sortBy`: 排序字段 (response_time, created_at, updated_at, ip, port) - `order`: 排序方式 (ASC, DESC) #### 4. 获取随机代理 ``` GET /api/proxies/random?count=1 ``` - `count`: 返回数量 (1-10) #### 5. 获取统计信息 ``` GET /api/proxies/stats ``` #### 6. 验证单个代理 ``` POST /api/proxies/verify { "ip": "192.168.1.1", "port": 8080 } ``` #### 7. 批量验证代理 ``` POST /api/proxies/verify-batch { "proxies": [ {"ip": "192.168.1.1", "port": 8080}, {"ip": "192.168.1.2", "port": 8080} ] } ``` #### 8. 手动触发抓取 ``` POST /api/proxies/scrape { "pages": 5 } ``` #### 9. 手动触发验证 ``` POST /api/proxies/validate-all { "limit": 50 } ``` #### 10. 搜索代理 ``` GET /api/proxies/search?ip=192.168.1.1&port=8080 ``` #### 11. 清理无效代理 ``` DELETE /api/proxies/cleanup ``` ## 定时任务 系统自动执行以下定时任务: ### 抓取任务 - **频率**: 每小时整点执行 - **功能**: 抓取快代理网站前5页的代理IP - **网址**: https://www.kuaidaili.com/free/inha/ ### 验证任务 - **频率**: 每10分钟执行一次 - **功能**: 验证数据库中的代理IP可用性 - **验证方式**: 通过访问 https://www.baidu.com - **超时时间**: 8秒 ### 健康检查 - **频率**: 每小时30分执行 - **功能**: 检查代理池健康状态 - **应急处理**: 可用代理少于10个时触发紧急抓取 ## 数据库结构 ### proxies 表 | 字段名 | 类型 | 说明 | |--------|------|------| | id | INTEGER | 主键,自增 | | ip | TEXT | IP地址 | | port | INTEGER | 端口号 | | location | TEXT | 地理位置 | | speed | INTEGER | 响应速度(毫秒) | | last_check_time | TEXT | 最后验证时间 | | is_valid | INTEGER | 是否可用 (1:可用, 0:不可用) | | response_time | INTEGER | 验证响应时间 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **唯一约束**: (ip, port) ## 使用示例 ### 获取随机代理 ```bash curl http://localhost:3000/api/proxies/random ``` 响应: ```json { "success": true, "data": { "id": 1, "ip": "101.132.134.160", "port": 8888, "location": "上海市", "is_valid": 1, "response_time": 150, "created_at": "2025-10-30 12:00:00", "updated_at": "2025-10-30 12:30:00" } } ``` ### 验证代理 ```bash curl -X POST http://localhost:3000/api/proxies/verify \ -H "Content-Type: application/json" \ -d '{"ip":"101.132.134.160","port":8888}' ``` 响应: ```json { "success": true, "data": { "ip": "101.132.134.160", "port": 8888, "isValid": true, "responseTime": 150, "error": null } } ``` ### 获取统计信息 ```bash curl http://localhost:3000/api/proxies/stats ``` 响应: ```json { "success": true, "data": { "total": 50, "valid": 30, "invalid": 20, "validRate": "60.00%" } } ``` ## 配置说明 ### 环境变量 - `PORT`: 服务端口 (默认: 3000) ### 数据库配置 数据库配置文件: `config/database.js` ```javascript const dbConfig = { development: { dialect: 'sqlite', storage: path.join(__dirname, '../proxies.db') } }; ``` ## 日志和监控 - 服务启动后会输出详细的执行日志 - 通过 `/health` 接口可查看系统状态 - 支持优雅关闭,保证数据完整性 ## 注意事项 1. **合法使用**: 请遵守网站服务条款,合理使用代理IP 2. **频率控制**: 内置请求延迟和重试机制,避免对目标网站造成压力 3. **数据质量**: 免费代理IP质量参差不齐,建议仅用于测试和学习 4. **资源占用**: 定时任务会占用一定的系统资源 ## 开发和部署 ### 开发模式 ```bash npm run dev ``` ### 生产部署 建议使用 PM2 进行进程管理: ```bash npm install -g pm2 pm2 start src/app.js --name "proxy-service" pm2 logs proxy-service pm2 status proxy-service ``` ## 许可证 MIT License ## 贡献 欢迎提交Issue和Pull Request!