以下是对Actionbook Scraper Skill的中文翻译:
Actionbook Scraper 技能
⚠️ 重要:两步验证
每个生成的脚本必须通过两个检查:
| 检查 | 验证内容 | 失败示例 |
|---|---|---|
| 第1部分:脚本运行 | 无错误,无超时 | 选择器未找到 |
| 第2部分:数据正确 | 内容与预期匹配 | 提取到的是“点击展开”而不是名称 |
┌─────────────────────────────────────────────────────┐
│ 1. 生成脚本 │
│ ↓ │
│ 2. 执行脚本 │
│ ↓ │
│ 3. 检查第1部分:脚本无错误运行? │
│ ↓ │
│ 4. 检查第2部分:数据内容正确? │
│ - 不为空 │
│ - 不是占位符文本(“加载中...”) │
│ - 不是UI文本(“点击展开”) │
│ - 字段正确映射 │
│ ↓ │
│ ┌───┴───┐ │
│ BOTH Pass Either Fails │
│ │ │ │
│ │ ↓ │
│ │ Is it Actionbook data issue? │
│ │ │ │
│ │ ┌───┴───┐ │
│ │ Yes No │
│ │ │ │ │
│ │ ↓ ↓ │
│ │ Log to Fix script │
│ │ .actionbook-issues.log │
│ │ │ │ │
│ │ └───┬───┘ │
│ │ ↓ │
│ │ Retry (max 3x) │
│ ↓ │
│ 输出脚本 │
└─────────────────────────────────────────────────────┘
默认输出格式
/actionbook-scraper:generate <url>
默认 = agent-browser脚本(bash命令)
agent-browser open "https://example.com"
agent-browser scroll down 2000
agent-browser get text ".selector"
agent-browser close
带 --standalone 标志
/actionbook-scraper:generate <url> --standalone
输出 = Playwright JavaScript代码
验证要求
两步验证
每个生成的脚本必须通过两个检查:
| 检查 | 验证内容 | 失败操作 |
|---|---|---|
| 1. 脚本运行 | 无错误,无超时 | 修复语法/选择器错误 |
| 2. 数据正确 | 内容与预期字段匹配 | 修复提取逻辑 |
第1部分:脚本执行检查
- 无运行时错误
- 无超时错误
- 浏览器正确关闭
第2部分:数据内容检查(重要)
验证提取的数据与预期结构匹配:
预期:公司名称,描述,网站,成立年份
实际: "点击展开", "加载中...", 空字符串
→ 失败:数据内容不正确,需要修复提取逻辑
数据验证规则:
| 规则 | 示例失败 | 修复 |
|---|---|---|
| 字段不为空 | name: "" |
检查选择器是否指向正确元素 |
| 无占位符文本 | name: "Loading..." |
添加等待动态内容 |
| 无UI文本 | name: "Click to expand" |
提取后展开,不是按钮文本 |
| 正确的数据类型 | year: "View Details" |
选择器错误,修复字段映射 |
| 合理的计数 | 预期约100,得到3 | 添加滚动/分页处理 |
针对agent-browser脚本
- 执行生成的命令
- 检查脚本无错误运行
- 检查数据内容正确:
- 字段与预期结构匹配
- 值是实际数据,不是UI文本
- 计数合理
- 如果失败:
- 分析哪里错了(脚本错误vs数据错误)
- 修复选择器,等待逻辑,或提取
- 重新执行
- 如果成功:
- 输出验证过的脚本
- 显示数据预览与字段验证
针对Playwright脚本(–standalone)
- 将脚本写入临时文件
- 用
node script.js运行 - 检查脚本无错误运行
- 检查输出数据正确:
- JSON结构与预期字段匹配
- 值包含实际数据
- 计数与预期范围匹配
- 如果失败:
- 分析错误类型
- 修复脚本
- 重新运行
- 如果成功:
- 输出验证过的脚本
架构概览
/generate <url> → 输出:agent-browser bash命令
/generate <url> --standalone → 输出:Playwright .js文件
┌─────────────────────────────────────────────────────────────┐
│ /generate <url> │
│ │
│ 1. 搜索Actionbook → 获取选择器 │
│ 2. 生成输出: │
│ │
│ WITHOUT --standalone │ WITH --standalone │
│ ───────────────────── │ ────────────────── │
│ agent-browser命令 │ Playwright .js代码 │
│ │ │
│ ```bash │ ```javascript │
│ agent-browser open ... │ const { chromium } = ... │
│ agent-browser get ... │ await page.goto(...) │
│ agent-browser close │ ``` │
│ ``` │ │
└─────────────────────────────────────────────────────────────┘
工具优先级
| 操作 | 主要工具 | 备用 | 注释 |
|---|---|---|---|
| 为URL查找选择器 | search_actions |
无 | 按域名/关键词搜索 |
| 获取完整选择器详情 | get_action_by_id |
无 | 使用来自搜索的action_id |
| 列出可用源 | list_sources |
search_sources |
浏览所有索引网站 |
| 生成agent-browser脚本 | Agent (sonnet) | - | 默认模式为 /generate |
| 生成Playwright脚本 | Agent (sonnet) | - | 使用 --standalone标志 |
| 结构分析 | Agent (haiku) | - | 解析Actionbook响应 |
| 请求新网站 | agent-browser |
手动 | 提交到actionbook.dev(唯一执行agent-browser的命令) |
工作流规则
重要:生成 → 验证 → 修复
每个生成的脚本都必须通过执行来验证。
| 步骤 | 操作 |
|---|---|
| 1 | 使用Actionbook选择器生成脚本 |
| 2 | 执行脚本以验证其工作 |
| 3 | 如果失败:分析错误,修复脚本,返回步骤2 |
| 4 | 如果成功:输出验证过的脚本+数据预览 |
验证过程
对于agent-browser脚本:
# 执行每个命令
agent-browser open "https://example.com"
agent-browser wait --load networkidle
agent-browser get text ".selector"
# 检查是否返回数据
# 如果错误 → 修复并重试
agent-browser close
对于Playwright脚本(–standalone):
# 写入临时文件并执行
node /tmp/scraper.js
# 检查输出文件是否有数据
# 如果错误 → 修复并重试
重要规则
- 总是验证生成的脚本 - 执行并检查两部分
- 第1部分:脚本必须运行 - 无错误,无超时
- 第2部分:数据必须正确 - 不为空,不是UI文本,字段映射正确
- 自动修复错误 - 不要输出破损的脚本或错误的数据
- 首先使用Actionbook MCP工具 - 永远不要猜测选择器
- 包括滚动处理 对于懒加载页面
- 包括展开/折叠逻辑 对于基于卡片的布局
- 总是关闭浏览器 - 包括
agent-browser close - 重试最多3次 - 如果仍然失败,报告具体问题
常见数据错误捕捉
| 错误 | 示例 | 修复 |
|---|---|---|
| 提取到按钮文本 | name: "Click to expand" |
提取展开后的内容 |
| 提取到占位符 | desc: "Loading..." |
添加等待动态内容 |
| 空字段 | name: "" |
修复选择器 |
| 错误的字段映射 | year: "San Francisco" |
修复每个字段的选择器 |
| 项目太少 | 预期100,得到3 | 添加滚动/分页 |
记录Actionbook数据问题
如果Actionbook选择器错误或过时,记录到本地文件:
.actionbook-issues.log
何时记录:
- 选择器在页面上不存在
- 选择器返回错误的元素
- 页面结构已更改
- 缺少关键元素的选择器
日志格式:
[YYYY-MM-DD HH:MM] URL: {url}
Action ID: {action_id}
Issue Type: {selector_error | outdated | missing}
Details: {description}
Selector: {selector}
Expected: {它应该选择的内容}
Actual: {它实际选择的内容或错误}
---
选择器优先级
当Actionbook提供多个选择器时,优先顺序如下:
data-testid- 最稳定,专为自动化设计aria-label- 基于可访问性,语义化css- 类选择器xpath- 最后的选择,最脆弱
命令
| 命令 | 描述 | 代理 |
|---|---|---|
/actionbook-scraper:analyze <url> |
分析页面结构并显示可用选择器 | structure-analyzer |
/actionbook-scraper:generate <url> |
生成agent-browser scraper脚本 | code-generator |
/actionbook-scraper:generate <url> --standalone |
生成Playwright/Puppeteer脚本 | code-generator |
/actionbook-scraper:list-sources |
列出具有Actionbook数据的网站 | - |
/actionbook-scraper:request-website <url> |
请求新网站被索引(使用agent-browser) | website-requester |
数据流
分析命令
1. 用户:/actionbook-scraper:analyze https://example.com/page
2. 从URL提取域名 → "example.com"
3. search_actions("example page") → [action_ids]
4. 对于最佳匹配:get_action_by_id(action_id) → 完整的选择器数据
5. Structure-analyzer代理格式化并展示结果
生成命令(默认:agent-browser脚本)
用户:/actionbook-scraper:generate https://example.com/page
步骤1:搜索Actionbook
search_actions("example.com page") → action_ids
步骤2:获取选择器
get_action_by_id(best_match) → selectors
步骤3:生成agent-browser脚本
```bash
agent-browser open "https://example.com/page"
agent-browser wait --load networkidle
agent-browser scroll down 2000
agent-browser get text ".item-container"
agent-browser close
步骤4:验证脚本(必需) 执行命令并检查是否提取数据 如果失败 → 分析错误 → 修复脚本 → 重试(最多3次)
步骤5:返回验证过的脚本+数据预览
**示例输出:**
````markdown
## 验证过的Scraper(agent-browser)
**状态**:✅ 已验证(提取50项)
运行这些命令来抓取:
```bash
agent-browser open "https://example.com/page"
agent-browser wait --load networkidle
agent-browser scroll down 2000
agent-browser get text ".item-container"
agent-browser close
数据预览
[
{"name": "项目1", "description": "..."},
{"name": "项目2", "description": "..."},
// ... 显示前3项
]
### 生成命令(--standalone:Playwright脚本)
```
用户:/actionbook-scraper:generate https://example.com/page --standalone
步骤1:搜索Actionbook选择器
步骤2:获取完整的选择器数据
步骤3:生成Playwright/Puppeteer脚本
步骤4:验证脚本(必需)
写入临时文件 → node /tmp/scraper.js → 检查输出
如果失败 → 分析错误 → 修复脚本 → 重试(最多3次)
步骤5:返回验证过的脚本+数据预览
```
**示例输出:**
````markdown
## 验证过的Scraper(Playwright)
**状态**:✅ 已验证(提取50项)
```javascript
const { chromium } = require('playwright');
// ... 生成的代码与Actionbook选择器
```
用法:
```bash
npm install playwright
node scraper.js
```
### 数据预览
```json
[
{"name": "项目1", "description": "..."},
// ... 第3项
]
```
请求网站命令
1. 用户:/actionbook-scraper:request-website https://newsite.com/page
2. 启动website-requester代理(使用agent-browser)
3. 代理工作流程:
a. agent-browser open "https://actionbook.dev/request-website"
b. agent-browser snapshot -i (发现表单选择器)
c. agent-browser type <url-field> "https://newsite.com/page"
d. agent-browser type <email-field> (可选)
e. agent-browser type <usecase-field> (可选)
f. agent-browser click <submit-button>
g. agent-browser snapshot -i (验证提交)
h. agent-browser close
4. 输出:提交确认
选择器数据结构
Actionbook以这种格式返回选择器数据:
{
"url": "https://example.com/page",
"title": "页面标题",
"content": "## 选择器参考
| 元素 | CSS | XPath | 类型 |
..."
}
常见选择器模式
基于卡片的布局:
容器:.card-list, .grid-container
卡片项目:.card, .list-item
卡片名称:.card__title, .card-name
卡片描述:.card__description
展开按钮:.card__expand, button.expand
详细提取(dt/dd模式):
// 键值对的常见模式
const items = container.querySelectorAll('.info-item');
items.forEach(item => {
const label = item.querySelector('dt').textContent;
const value = item.querySelector('dd').textContent;
});
表格布局:
表格:table, .data-table
标题:thead th, .table-header
行:tbody tr, .table-row
单元格:td, .table-cell
页面类型检测
| 指标 | 页面类型 | 模板 |
|---|---|---|
| 滚动加载更多 | 动态/无限 | playwright-js (带滚动) |
| 点击展开 | 基于卡片 | playwright-js (带点击) |
| 分页链接 | 分页 | playwright-js (带分页) |
| 静态内容 | 静态 | puppeteer或playwright |
| 检测到SPA框架 | SPA | playwright-js (网络空闲) |
输出格式
分析输出
## 页面分析:{url}
### 匹配操作
- **操作ID**:{action_id}
- **置信度**:高 | 中 | 低
### 可用选择器
| 元素 | 选择器 | 类型 | 方法 |
|---------|----------|------|---------|
| {name} | {selector} | {type} | {methods} |
### 页面结构
- **类型**:{静态|动态|spa}
- **数据模式**:{cards|table|list}
- **懒加载**:{是|否}
- **展开/折叠**:{是|否}
### 建议
- 建议模板:{template}
- 需要特殊处理:{notes}
生成代码输出
## 生成的Scraper
**目标URL**:{url}
**模板**:{template}
**预期输出**:{description}
### 依赖
```bash
npm install playwright
代码
{generated_code}
用法
node scraper.js
输出
结果保存到 {output_file}
## 模板参考
| 模板 | 标志 | 输出 | 运行方式 |
|----------|------|--------|----------|
| **agent-browser** | (默认) | CLI命令 | `agent-browser` CLI |
| playwright-js | --standalone | .js文件 | `node scraper.js` |
| playwright-python | --standalone --template playwright-python | .py文件 | `python scraper.py` |
| puppeteer | --standalone --template puppeteer | .js文件 | `node scraper.js` |
## 错误处理
| 错误 | 原因 | 解决方案 |
|-------|-------|----------|
| 未找到操作 | URL未索引 | 使用 `/actionbook-scraper:request-website` 请求索引 |
| 选择器不工作 | 页面更新 | 向Actionbook报告,尝试替代选择器 |
| 超时 | 页面加载慢 | 增加超时,添加重试逻辑 |
| 空数据 | 动态内容 | 添加滚动/等待处理 |
| 表单提交失败 | 网络/页面问题 | 重试或在actionbook.dev手动提交 |
## agent-browser 使用
对于 `request-website` 命令,插件使用 **agent-browser CLI** 自动化表单提交。
### agent-browser 命令
```bash
# 打开URL
agent-browser open "https://actionbook.dev/request-website"
# 获取页面快照(发现选择器)
agent-browser snapshot -i
# 输入表单字段
agent-browser type "input[name='url']" "https://example.com"
# 点击按钮
agent-browser click "button[type='submit']"
# 关闭浏览器(始终这样做)
agent-browser close
选择器发现
如果表单选择器未知,使用快照发现它们:
agent-browser open "https://actionbook.dev/request-website"
agent-browser snapshot -i # 返回页面结构与选择器
始终关闭浏览器
重要:任何agent-browser会话结束时,即使发生错误,始终运行 agent-browser close。
速率限制
- Actionbook MCP:本地使用无速率限制
- 目标网站:遵守robots.txt并请求间添加延迟
- 推荐:页面请求间1-2秒延迟
示例
示例1:生成agent-browser脚本(默认)
/actionbook-scraper:generate https://firstround.com/companies
输出:agent-browser命令
```bash
agent-browser open "https://firstround.com/companies"
agent-browser scroll down 2000
agent-browser get text ".company-list-card-small"
agent-browser close
用户运行这些命令来抓取。
### 示例2:生成Playwright脚本
/actionbook-scraper:generate https://firstround.com/companies --standalone
输出:Playwright JavaScript代码
const { chromium } = require('playwright');
// ... 完整脚本
用户运行:node scraper.js
### 示例3:分析页面结构
/actionbook-scraper:analyze https://example.com/products
输出:分析显示:
- 可用选择器
- 页面结构
- 推荐方法
### 示例4:请求新网站
/actionbook-scraper:request-website https://newsite.com/data
操作:提交表单到actionbook.dev(这个命令确实执行agent-browser)
## 最佳实践
1. **总是分析后再生成** - 先了解页面结构
2. **检查list-sources** - 验证网站是否已索引,再尝试
3. **审查生成的代码** - 验证选择器是否匹配预期元素
4. **添加适当的延迟** - 对目标服务器要尊重
5. **处理边缘情况** - 空状态,加载状态,错误
6. **逐步测试** - 在全面抓取前先在小部分上运行