# process-urls 接口文档 ## 接口概述 `process-urls` 是一个用于批量爬取网页内容的REST API接口,支持POST方式访问,能够处理包含多个URL地址的请求,并返回结构化的网页爬取结果。 ## 接口信息 - **接口路径**: `/api/data-parse/process-urls` - **请求方法**: `POST` - **内容类型**: `application/json` - **功能描述**: 批量爬取网页内容,支持多种网页格式 ## 请求参数 ### 请求体格式 ```json { "urlArr": [ "https://example.com/page1", "https://example.com/page2", "https://mp.weixin.qq.com/s/4yz-kNAWAlF36aeQ_cgQQg" ] } ``` ### 参数说明 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | urlArr | array | 是 | 包含网页URL地址的字符串数组 | ### 参数验证规则 1. **urlArr字段**: 必须存在且为数组类型 2. **数组内容**: 不能为空数组 3. **URL格式**: 每个元素必须为字符串类型 4. **URL有效性**: 支持http和https协议 ## 响应格式 ### 成功响应 (200/206) ```json { "success": true, "message": "成功爬取所有 3 个URL", "data": { "total_urls": 3, "success_count": 3, "failed_count": 0, "contents": [ { "url": "https://mp.weixin.qq.com/s/4yz-kNAWAlF36aeQ_cgQQg", "data": "新任命 | 宜宾产城竹颂万怡酒店任命王刚先生(John Wang)出任运营总监...", "status": "success", "content_length": 748, "original_length": 2006415, "status_code": 200, "encoding": "UTF-8" } ], "failed_items": [] } } ``` ### 部分成功响应 (206) ```json { "success": true, "message": "部分成功: 成功爬取 2 个URL,失败 1 个URL", "data": { "total_urls": 3, "success_count": 2, "failed_count": 1, "contents": [ { "url": "https://example.com/page1", "data": "页面内容...", "status": "success", "content_length": 1500, "original_length": 2000, "status_code": 200, "encoding": "UTF-8" } ], "failed_items": [ { "url": "https://invalid-url.com", "error": "连接超时", "status": "failed" } ] } } ``` ### 错误响应 (400/500) ```json { "success": false, "message": "请求参数错误", "data": { "total_urls": 0, "success_count": 0, "failed_count": 0, "contents": [], "failed_items": [] } } ``` ## 响应字段说明 ### 顶层字段 | 字段名 | 类型 | 说明 | |--------|------|------| | success | boolean | 请求是否成功 | | message | string | 处理结果描述 | | data | object | 详细数据对象 | ### data 对象字段 | 字段名 | 类型 | 说明 | |--------|------|------| | total_urls | integer | 总URL数量 | | success_count | integer | 成功爬取的URL数量 | | failed_count | integer | 失败的URL数量 | | contents | array | 成功爬取的内容列表 | | failed_items | array | 失败的URL列表 | ### contents 数组元素字段 | 字段名 | 类型 | 说明 | |--------|------|------| | url | string | 网页URL地址 | | data | string | 爬取到的网页内容(清理后的文本) | | status | string | 状态标识,固定为 "success" | | content_length | integer | 清理后内容的字符长度 | | original_length | integer | 原始HTML内容的字符长度 | | status_code | integer | HTTP响应状态码 | | encoding | string | 网页编码格式 | ### failed_items 数组元素字段 | 字段名 | 类型 | 说明 | |--------|------|------| | url | string | 失败的网页URL地址 | | error | string | 失败原因描述 | | status | string | 状态标识,固定为 "failed" | ## HTTP状态码 | 状态码 | 说明 | |--------|------| | 200 | 完全成功,所有URL都成功爬取 | | 206 | 部分成功,部分URL成功爬取 | | 400 | 请求参数错误(参数格式、类型、缺失等) | | 500 | 服务器内部错误 | ## 使用示例 ### JavaScript (前端) ```javascript // 使用fetch API async function crawlWebsites(urls) { try { const response = await fetch('/api/data-parse/process-urls', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ urlArr: urls }) }); const result = await response.json(); if (result.success) { console.log(`成功爬取 ${result.data.success_count} 个网页`); // 处理成功爬取的内容 result.data.contents.forEach(content => { console.log(`URL: ${content.url}`); console.log(`内容: ${content.data.substring(0, 100)}...`); }); // 处理失败的URL if (result.data.failed_count > 0) { console.log(`有 ${result.data.failed_count} 个URL爬取失败`); result.data.failed_items.forEach(failed => { console.log(`失败URL: ${failed.url}, 原因: ${failed.error}`); }); } } else { console.error(`爬取失败: ${result.message}`); } } catch (error) { console.error('请求异常:', error); } } // 调用示例 const urls = [ 'https://mp.weixin.qq.com/s/4yz-kNAWAlF36aeQ_cgQQg', 'https://example.com/page1' ]; crawlWebsites(urls); ``` ### Python (后端) ```python import requests import json def test_process_urls_api(): api_url = "http://localhost:5000/api/data-parse/process-urls" test_data = { "urlArr": [ "https://mp.weixin.qq.com/s/4yz-kNAWAlF36aeQ_cgQQg", "https://httpbin.org/html" ] } try: response = requests.post( api_url, json=test_data, headers={'Content-Type': 'application/json'}, timeout=120 ) if response.status_code in [200, 206]: result = response.json() print(f"爬取成功: {result['message']}") # 处理结果 for content in result['data']['contents']: print(f"URL: {content['url']}") print(f"内容长度: {content['content_length']}") else: print(f"请求失败: {response.status_code}") print(response.text) except Exception as e: print(f"异常: {e}") # 运行测试 test_process_urls_api() ``` ### cURL 命令行 ```bash curl -X POST \ http://localhost:5000/api/data-parse/process-urls \ -H "Content-Type: application/json" \ -d '{ "urlArr": [ "https://mp.weixin.qq.com/s/4yz-kNAWAlF36aeQ_cgQQg", "https://httpbin.org/html" ] }' ``` ## 功能特性 ### 1. 批量处理 - 支持同时处理多个URL - 自动管理请求队列和延迟 - 提供整体处理统计 ### 2. 智能重试 - 自动重试失败的请求 - 最多重试3次 - 不同类型的错误采用不同的重试策略 ### 3. 内容解析 - 使用BeautifulSoup自动解析HTML - 提取纯文本内容,去除HTML标签 - 智能内容清理和格式化 ### 4. 反爬虫保护 - 模拟真实浏览器请求头 - 随机延迟机制 - 支持重定向和超时处理 ### 5. 详细日志 - 完整的处理过程日志 - 错误分类和统计 - 便于调试和监控 ## 注意事项 ### 1. 性能考虑 - 每个URL处理时间取决于网页大小和网络状况 - 建议单次请求的URL数量不超过20个 - 接口设置了120秒超时时间 ### 2. 网络限制 - 某些网站可能有反爬虫机制 - 建议在稳定的网络环境下使用 - 遵守目标网站的robots.txt规则 ### 3. 内容大小 - 大型网页可能产生大量文本内容 - 注意前端显示时的内存使用 - 建议对长内容进行分页或截断显示 ### 4. 错误处理 - 接口会返回详细的错误信息 - 建议前端实现适当的错误提示 - 部分失败时仍可处理成功的内容 ## 错误码说明 | 错误类型 | 说明 | 处理建议 | |----------|------|----------| | 连接超时 | 网络连接超时 | 检查网络状况,稍后重试 | | HTTP状态码错误 | 服务器返回非200状态码 | 检查URL有效性,确认网站可访问 | | 内容解析失败 | HTML解析异常 | 系统会自动使用原始内容 | | 编码错误 | 字符编码不支持 | 系统会自动处理编码转换 | ## 更新日志 | 版本 | 日期 | 更新内容 | |------|------|----------| | 1.0.0 | 2025-08-18 | 初始版本,支持基本的网页爬取功能 | ## 技术支持 如有问题或建议,请联系开发团队或查看相关日志文件。