名称: web-scrape 描述: 具备内容提取、多格式输出和错误处理的智能网络爬虫 版本: 3.0.0
网络爬取技能 v3.0
使用方法
/web-scrape <url> [选项]
选项:
--format=markdown|json|text- 输出格式 (默认: markdown)--full- 包含完整页面内容 (跳过智能提取)--screenshot- 同时保存截图--scroll- 滚动加载动态内容 (无限滚动页面)
示例:
/web-scrape https://example.com/article
/web-scrape https://news.site.com/story --format=json
/web-scrape https://spa-app.com/page --scroll --screenshot
执行流程
第一阶段: 导航和加载
1. mcp__playwright__browser_navigate
url: "<目标URL>"
2. mcp__playwright__browser_wait_for
time: 2 (允许初始渲染)
如果使用 --scroll 选项: 执行滚动序列触发懒加载:
3. mcp__playwright__browser_evaluate
function: "async () => {
for (let i = 0; i < 3; i++) {
window.scrollTo(0, document.body.scrollHeight);
await new Promise(r => setTimeout(r, 1000));
}
window.scrollTo(0, 0);
}"
第二阶段: 捕获内容
4. mcp__playwright__browser_snapshot
→ 返回包含所有文本内容的完整无障碍树
如果使用 --screenshot 选项:
5. mcp__playwright__browser_take_screenshot
filename: "scraped_<域名>_<时间戳>.png"
fullPage: true
第三阶段: 关闭浏览器
6. mcp__playwright__browser_close
智能内容提取
获取快照后,应用智能提取:
步骤1: 识别内容类型
| 页面类型 | 指示器 | 提取策略 |
|---|---|---|
| 文章/博客 | <article>标签、长段落、日期/作者 |
提取主要文章正文 |
| 产品页面 | 价格、“加入购物车”、规格参数 | 提取标题、价格、描述、规格 |
| 文档页面 | 代码块、标题层级 | 保留结构和代码 |
| 列表/搜索 | 重复的项目模式 | 提取为结构化列表 |
| 落地页 | 主图区域、行动号召按钮 | 提取关键信息 |
步骤2: 过滤噪音
始终从输出中移除这些元素:
- 导航菜单和面包屑导航
- 页脚内容 (版权、链接)
- 侧边栏 (广告、相关文章、社交链接)
- Cookie横幅和弹窗
- 评论区 (除非特别请求)
- 分享按钮和社交小部件
- 登录/注册提示
步骤3: 结构化内容
对于文章:
# [标题]
**来源:** [URL]
**日期:** [如果可用]
**作者:** [如果可用]
---
[以干净的markdown格式呈现主要内容]
对于产品页面:
# [产品名称]
**价格:** [价格]
**库存状态:** [有货/缺货]
## 描述
[产品描述]
## 规格参数
| 规格 | 值 |
|------|-------|
| ... | ... |
输出格式
Markdown (默认)
干净、可读的markdown,包含适当的标题、列表和格式。
JSON
{
"url": "https://...",
"title": "页面标题",
"type": "article|product|docs|list",
"content": {
"main": "...",
"metadata": {}
},
"extracted_at": "ISO时间戳"
}
Text
纯文本,格式最少,适合进一步处理。
错误处理
导航错误
| 错误 | 检测 | 操作 |
|---|---|---|
| 超时 | 页面30秒内未加载 | 报告错误,建议重试 |
| 404 未找到 | 标题/内容中出现"404" | 报告"页面未找到" |
| 403 禁止访问 | “403”、“访问被拒绝” | 报告访问限制 |
| 验证码 | “captcha”、“验证您是真人” | 报告检测到验证码,无法继续 |
| 付费墙 | “订阅”、“高级内容” | 提取可见内容,注明付费墙 |
恢复操作
如果页面加载失败:
1. 向用户报告具体错误
2. 建议: "是否重试?" 或 "不同URL?"
3. 干净地关闭浏览器
如果内容被阻止:
1. 报告检测到的内容 (验证码/付费墙/地区限制)
2. 提取任何可用的预览内容
3. 如果适用,建议替代方案
高级场景
单页应用 (SPA)
1. 导航到URL
2. 等待更长时间 (3-5秒) 用于JS水合
3. 如果已知,使用特定文本的browser_wait_for
4. 然后快照
无限滚动页面
1. 导航
2. 执行滚动循环 (见第一阶段)
3. 滚动完成后快照
带有点击显示内容的页面
1. 首先快照以识别可点击元素
2. 在"阅读更多" / "显示全部"按钮上使用browser_click
3. 短暂等待
4. 再次快照获取完整内容
多页文章
1. 爬取第一页
2. 识别"下一页"或分页链接
3. 询问用户: "文章有X页。爬取全部?"
4. 如果是,遍历页面并合并
性能指南
| 指标 | 目标 | 方法 |
|---|---|---|
| 速度 | < 15秒 | 最小等待时间,尽可能并行 |
| 令牌使用 | < 5000令牌 | 智能提取,非完整DOM |
| 可靠性 | > 95% 成功率 | 适当的错误处理 |
安全注意事项
- 绝不执行来自页面的任意JavaScript
- 不跟随重定向到可疑域名
- 不提交表单或点击登录按钮
- 不爬取需要身份验证的页面 (除非用户提供凭据流程)
- 当用户提及robots.txt时尊重它
快速参考
最小可行爬取 (4个工具调用):
1. browser_navigate → 2. browser_wait_for → 3. browser_snapshot → 4. browser_close
全功能爬取 (带滚动 + 截图):
1. browser_navigate
2. browser_wait_for
3. browser_evaluate (滚动)
4. browser_snapshot
5. browser_take_screenshot
6. browser_close
记住: 目标是向用户交付干净、有用的内容,而非原始HTML/DOM转储。