通用智能网页数据采集 (universal-scraper)
输入网址,自动分析页面结构并采集数据,用户只需确认字段映射。
核心特性
| 特性 | 说明 | |------|------| | 智能页面分析 | AI自动检测表单、表格、分页结构 | | 自然语言交互 | 用户用自然语言描述需求,AI自动解析 | | 多Agent协作 | 研究员分析 → 开发者适配 → 测试员验证 → 评审员确认 | | 预置模板市场 | 电商、民宿、订单管理等场景一键启动 | | 自动错误恢复 | 多种错误自动尝试修复,无需用户干预 |
使用方式
方式一:自然语言触发(推荐)
"帮我采集这个网页的数据:https://xxx.com/orders"
"登录xxx.com,抓取最近一个月的订单"
"把这个表格导出成Excel"
AI会自动分析页面结构并引导确认。
方式二:命令行
# 智能采集(自动分析)
node scraper.js --url https://example.com/data --auto
# 使用模板
node scraper.js --template hostex --credentials ./cred.json
# 手动指定字段
node scraper.js --url https://example.com/orders --fields 订单号,金额,日期
方式三:API调用
const { SmartScraper } = require('./universal-scraper');
// 智能采集(AI自动分析)
const result = await SmartScraper.scrape({
url: 'https://example.com/orders',
description: '采集订单号、客户名、金额、日期'
});
// → 返回 { data: [...], fields: [...], template: '...' }
// 指定模板采集
const result2 = await SmartScraper.scrape({
url: 'https://hostex.com/reservations',
template: 'hostex-orders',
credentials: { username: '...', password: '...' }
});
多Agent协作流程
┌─────────────────────────────────────────────────────────────────┐
│ 用户请求入口 │
│ "帮我采集订单数据" │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 研究员 Agent (Researcher) │
│ ───────────────────────────────────────────────────────────── │
│ 1. URL分析与网站类型识别 │
│ 2. DOM结构扫描(表单、表格、分页) │
│ 3. 智能选择器候选生成 │
│ 4. 模板匹配推荐 │
│ 输出: pageAnalysis { type, selectors, template } │
└────────────────────────────┬────────────────────────────────────┘
│ 确认/修正
▼
┌─────────────────────────────────────────────────────────────────┐
│ 开发者 Agent (Developer) │
│ ───────────────────────────────────────────────────────────── │
│ 1. 选择器适配与优化 │
│ 2. 登录流程编排 │
│ 3. 分页翻页逻辑 │
│ 4. 反爬策略应用 │
│ 输出: scrapeConfig { login, scrape, pagination } │
└────────────────────────────┬────────────────────────────────────┘
│ 执行采集
▼
┌─────────────────────────────────────────────────────────────────┐
│ 测试员 Agent (Tester) │
│ ───────────────────────────────────────────────────────────── │
│ 1. 数据完整性校验 │
│ 2. 字段准确性验证 │
│ 3. 格式正确性检查 │
│ 4. 边界条件测试 │
│ 输出: testReport { passed, failed, issues } │
└────────────────────────────┬────────────────────────────────────┘
│ 通过/修复
▼
┌─────────────────────────────────────────────────────────────────┐
│ 评审员 Agent (Reviewer) │
│ ───────────────────────────────────────────────────────────── │
│ 1. 最终质量把关 │
│ 2. 确认导出格式 │
│ 3. 用户确认 │
│ 输出: approval { status, summary } │
└────────────────────────────┬────────────────────────────────────┘
│ 完成
▼
数据导出完成
预置模板市场
电商订单模板 (e-commerce-orders)
template: e-commerce-orders
name: 电商订单采集
websites:
- admin.shopify.com
- ma.aliexpress.com
- seller.taobao.com
fields:
- orderId: 订单号
- customer: 客户名称
- product: 商品名称
- quantity: 数量
- amount: 金额
- status: 订单状态
- createdAt: 下单时间
民宿订单模板 (hostex-orders)
template: hostex-orders
name: 百居易民宿订单
websites:
- www.myhostex.com
loginUrl: https://www.myhostex.com/app/login
loggedInSelector: .sidebar, .menu, [class*="nav"]
fields:
- guestName: 房客姓名
- roomName: 房间名称
- checkIn: 入住日期
- checkOut: 离店日期
- amount: 订单金额
- status: 状态
- platform: 平台来源
pagination:
container: .ant-pagination
nextButton: .ant-pagination-next
totalPattern: 共\s*(\d+)\s*条记录
财务报表模板 (finance-report)
template: finance-report
name: 财务报表导出
fields:
- date: 日期
- description: 摘要
- category: 类别
- income: 收入
- expense: 支出
- balance: 余额
社交媒体数据模板 (social-media)
template: social-media
name: 社交媒体数据
fields:
- username: 用户名
- posts: 帖子数
- followers: 粉丝数
- following: 关注数
- engagement: 互动率
配置说明
智能采集配置 (autoScrapeConfig)
| 参数 | 必填 | 说明 | |------|------|------| | url | 是 | 目标页面URL | | description | 否 | 自然语言描述采集需求 | | template | 否 | 使用预置模板 | | credentials | 否 | { username, password } |
手动配置 (manualConfig)
当自动配置不满足需求时使用:
登录配置 (loginConfig)
| 参数 | 必填 | 说明 | |------|------|------| | loginUrl | 是 | 登录页面URL | | username | 是 | 用户名/邮箱/手机号 | | password | 是 | 密码 | | loginButtonSelector | 否 | 登录按钮选择器,默认自动检测 | | usernameSelector | 否 | 用户名输入框,默认自动检测 | | passwordSelector | 否 | 密码输入框,默认自动检测 | | loggedInSelector | 否 | 登录成功标识 |
采集配置 (scrapeConfig)
| 参数 | 必填 | 说明 | |------|------|------| | targetUrl | 是 | 目标页面URL | | tableSelector | 否 | 表格选择器,默认自动检测 | | rowSelector | 否 | 行选择器,默认"tr" | | columnMappings | 是 | 列映射 | | paginationSelector | 否 | 分页容器 | | nextButtonSelector | 否 | 下一页按钮 | | totalRecordsPattern | 否 | 总记录数正则 | | maxPages | 否 | 最大页数,默认999 |
列映射 (columnMappings)
columnMappings: [
{ key: 'orderId', header: '订单号', selector: 'td:nth-child(1)' },
{ key: 'amount', header: '金额', selector: 'td:nth-child(2)' },
{ key: 'date', header: '日期', selector: 'td:nth-child(3)' }
]
错误处理
| 错误码 | 场景 | 自动处理 | |--------|------|----------| | E001 | URL无效 | 提示检查URL格式 | | E002 | 登录失败 | 自动重试3次,提示检查凭据 | | E003 | 选择器失效 | 自动尝试备选选择器 | | E004 | 登录超时 | 自动重试,增加等待时间 | | E005 | 需验证码 | 提示用户手动处理 | | E006 | 页面加载超时 | 自动重试,最大3次 | | E007 | 选择器未找到 | 交互式让用户确认/指定 | | E008 | 导出失败 | 保留JSON,提示手动导出 | | E009 | Cookie过期 | 自动清理并重新登录 | | E010 | 反爬拦截 | 自动降低请求频率 | | E011 | 模板不匹配 | 切换到手动配置模式 |
交互式错误处理
当发生需用户介入的错误时:
⚠️ 选择器定位失败
AI尝试了以下选择器均未找到:
1. tbody > tr:nth-child(1)
2. .data-row
3. table tr:first-child
请选择:
[1] 让我手动指定选择器
[2] 再试一次自动检测
[3] 查看页面截图帮助定位
快速启动示例
电商订单采集
用户: "帮我采集shopify后台的订单数据"
AI (研究员): 分析 https://admin.shopify.com/order...
AI (开发者): 适配选择器,开始采集
AI (测试员): 验证数据完整性
AI (评审员): 确认结果
→ 采集完成,导出 data/orders_2026-05-25.xlsx
民宿订单导出
用户: "导出百居易这个月的所有订单"
AI: 检测到模板 hostex-orders
AI (研究员): 确认页面结构匹配
AI (开发者): 使用预置配置采集
AI (测试员): 验证100条订单数据
AI (评审员): 确认导出
→ 导出完成: data/hostex_orders_2026-05.xlsx
自定义采集
用户: "抓取这个页面 https://example.com/inventory 的产品名称和库存"
AI (研究员): 分析页面结构
AI (研究员): 检测到表格包含产品信息
AI (开发者): 生成字段映射
字段映射预览:
- 产品名称 → td:nth-child(1)
- 库存数量 → td:nth-child(5)
确认这些字段? [Y/n]
技术栈
- Playwright ^1.59.1 - 浏览器自动化
- xlsx - Excel导出
- Cheerio - HTML解析
目录结构
universal-scraper/
├── SKILL.md # 本文件(多Agent调度入口)
├── config/
│ └── templates.yaml # 网站模板配置
└── references/
├── test_pool.md # 测试用例池
└── agent-prompts.md # Agent提示词模板
Last updated: 2026-05-25 Version: 2.0.0
微信扫一扫