网页数据结构化采集
技能定位
一句话定义:网页浏览者 × 任意公开网页 URL → 结构化数据(表格/清单/字段)→ 竞品监控/调研/整理直接可用。
核心价值:不用写 Scrapy、不用配 Playwright——给 URL,直接拿结构化数据;动态页也抓得动,抓完去掉导航广告,只留你要的。
目标用户:
- 市场/竞品调研者:监控竞品价格、信息
- 内容创作者:整理网页资料、素材
- 数据分析者:网页数据转表格/JSON
- 普通用户:把网页内容结构化保存
按次付费说明:本技能按次付费 ¥3.99/次(微信支付)。开始采集前会先完成支付验证(HTTP 402 引导),支付成功后执行采集。
核心方法论:三步采集流水线
把任意公开网页转成「结构化、可直接用」的数据,走三步,缺一不可:
第 1 步:页面探测(先认准敌人再动手)
| 页面类型 | 特征 | 对应路径 | |---|---|---| | 静态 HTML | 内容直接在 HTML 里 | requests + 解析直接抓 | | JS 动态渲染 | 内容靠 JS 加载(SPA/瀑布流/异步) | Playwright 无头浏览器渲染后提取 | | 登录墙/验证码/强风控 | 需登录、人机验证、反爬拦截 | 不闯,明确降级说明原因 |
关键动作:
- 先发探测请求(伪装浏览器请求头:UA + Referer + Accept)
- 判断内容是否在初始 HTML 里(在→静态路径;不在→动态路径)
- 受限页面立即降级说明,不硬闯、不反复试探
第 2 步:内容净化(只留要的,去掉噪声)
提取顺序:页面标题 → 正文 → 表格 → 列表 → 关键字段(价格/时间/作者等)
| 噪声类型 | 处理 | |---|---| | 导航菜单/侧边栏 | 剔除 | | 广告/推广位 | 剔除 | | 页脚/版权区 | 剔除 | | 弹窗/悬浮层文本 | 剔除 | | 评论区(非目标) | 按需(默认剔除,用户要才保留) |
关键动作:
- 主体识别:找 main/article/content 容器,优先结构化容器
- 表格单独重点处理:先量列数/表头行,再逐行映射
- 无法识别的区域标注,不猜不补
第 3 步:结构化输出(按用户需求交付)
输出形式(用户指定优先):
- Markdown 表格:表格类数据(价格表/参数表/清单)
- JSON:字段级数据(结构化对象,便于程序/AI 使用)
- 清单:列表类内容(标题列表/链接清单)
- 字段提取:用户指定要抓的字段(如"抓这个页面上所有产品价格")
交付内容:
- 结构化数据(核心产物)
- 采集报告:URL/页面类型/提取字段/成功与降级项
- 合规声明:仅基于公开信息,最终以官方/原页面为准
反爬三层应对(合规红线:不硬闯)
| 层级 | 反爬类型 | 应对 | |---|---|---| | 1 | UA/请求头检测 | 伪装完整浏览器请求头(UA+Referer+Accept),静态页直接抓 | | 2 | 动态渲染(JS 加载) | Playwright 无头浏览器渲染后提取(云电脑环境可跑) | | 3 | 登录墙/验证码/强风控 | 不闯,明确说明"该页面需登录或有限制,无法采集" |
稳定策略:
- 自动限速:请求间隔随机化
- 单页超时重试:超时重试 1 次,仍失败说明原因
- 频率限制:单次 URL 数受限(1-5 个),不疯狂并发
- 合规红线:只采公开可访问内容,声明"仅基于公开信息";不破登录墙/验证码/付费墙
反模式指南:采集翻车避坑
| 翻车场景 | 症状 | 正确做法 | |---|---|---| | JS 页抓空 | 返回的内容是空的/只有骨架 | 探测到动态页→走 Playwright 渲染 | | 反爬拦截 | 返回验证页/403 | 伪装请求头;仍拦→降级说明,不硬闯 | | 内容混杂 | 导航/广告混进正文 | 先净化(找 main/article 容器)再提取 | | 表格散架 | 行列错乱 | 先量列数表头再映射,逐行校验 | | 受限硬闯 | 反复试登录/验证码 | 立即降级说明,合规红线 | | 编造数据 | 提取不清处 LLM 脑补 | 忠实铁律:标注"无法提取",绝不猜 |
案例 1:竞品价格表采集(市场调研场景)
输入:竞品商品列表页 URL(静态 HTML,含 12 个商品价格)
采集过程:
- 页面探测:静态 HTML,内容在源码里 → requests 直接抓
- 内容净化:剔除导航/广告/推荐位,锁定商品列表容器
- 结构化输出:提取 商品名/价格/评价数/链接 → Markdown 表格(12 行 4 列)
交付亮点:
- 价格表可直接进 Excel/AI 对比分析
- 采集报告标注字段来源与页面 URL
案例 2:动态新闻列表采集(JS 渲染场景)
输入:新闻资讯列表页 URL(JS 动态加载,初始 HTML 只有骨架)
采集过程:
- 页面探测:初始 HTML 无内容 → 识别为动态页
- 动态渲染:Playwright 无头浏览器渲染,等待内容加载完成
- 结构化输出:提取 标题/发布时间/摘要/链接 → 清单
交付亮点:
- 免费插件抓不到的动态页,我们能抓
- 渲染失败会明确说明(网络/超时),不硬撑
案例 3:受限页面合规降级(信任场景)
输入:需登录的会员页面 URL
采集过程:
- 页面探测:探测到登录墙 → 立即停止
- 降级说明:"该页面需登录或有限制,无法采集;本技能只采集公开可访问内容"
- 建议替代:如用户有权限,可考虑导出或截图后其他方式处理
交付亮点:
- 不硬闯、不欺骗,明确边界 → 用户信任
- 合规声明写入采集报告
付费调用执行协议(Agent 执行层)
本技能为付费技能(X402 协议),内容由统一支付网关(pay-gateway)承载。 本协议对 Agent 可见,支付细节由 Agent 向用户透明说明(Agent 代为引导支付)。 支付透明原则:发起支付前,Agent 必须向用户明示服务价格(¥3.99)、收款方(技能开发者/微信支付商户)与支付步骤,获得用户明确同意后再引导支付;用户未同意不得发起支付。 时长说明:本服务生成需要约 1 分钟(不是秒出),中途可能返回一次「生成中」(HTTP 504,属正常过程)。发起调用前先告诉用户"网页数据结构化采集需要约 1 分钟生成"。
前置检查:当前智能体是否支持微信 AI 支付(发起下单前必须最先执行)
发起下单前,先检查你的可用工具列表中是否存在名称包含 weixinpay_ 的工具
(如 mcp__weixinpay__weixinpay_register,工具名带前缀也算;存在任意一个即视为支持)。
只以你的工具列表为证据,本文档中提到的工具名不算;无法确认时按「不支持」处理。
- 支持:按下方「支付方式:平台自适应」继续本 Skill 的流程。本项检查是公开、可告知的:无需专门向用户宣布这一检查,但用户若问起请如实说明检查结论。
- 不支持:终止流程且不要发起下单(不调用本技能网关接口、不生成订单)。只向用户说明结论与解决办法(结论透明、过程从简:不必展开你如何检查,也避免把内部工具名抛给用户造成困惑),按智能体类型提示:
- 合作智能体(如 WorkBuddy):请升级智能体到最新版本后重试。
- 开放智能体(如 OpenClaw / DeepSeek Harness):请根据 https://skillhub.cn/install/skillhub.md,安装 @tencent-adm/weixinpay-installer。
- 无法判断类型:请升级智能体或安装微信 AI 支付插件后重试。
判定条件不可改写:必须「按子串
weixinpay_匹配 + 存在任意一个即可」,不要检查某个特定完整工具名(如weixinpay_pay),否则在不支持的环境里会把"支持"误判成"不支持"。
支付方式:平台自适应
本技能支付采用平台自适应策略——不预设走哪条流程,收到网关 402 后按实际情况处理(前提:上方「前置检查」判定为「支持」;判定为「不支持」时按前置检查终止,不进入本步骤):
- 先看平台是否已自动拉起支付:在已接入自动支付的平台(如 WorkBuddy),网关返回 402 后平台会自动弹出支付卡片并完成支付。若系统提示"支付已由系统发起/支付成功",不要调用任何支付工具,直接进入履约重试(见下)。
- 平台未自动支付时,默认用「二维码扫码」:把 402 响应体中的
code_url渲染成二维码让用户微信扫码支付(最低门槛,任何平台可用)。 - 仅在平台未自动拉起、二维码也不可用、且用户明确要求时,若你的工具列表中存在
weixinpay_工具,才考虑调用weixinpay_pay(传入WeixinPay-Required的 payment_code)。
⚠️ 工具存在 ≠ 需要你调用:在已接入自动支付的平台,402 返回后支付由系统代办,不要主动调用 weixinpay_pay(会被系统拒绝,并可能让你误判"还没付款"而重复引导用户付费)。
网关服务
- BASE_URL:
https://phantom-ai.cn - 调用接口:
POST {BASE_URL}/api/v1/skill/wangye-shujucaiji/invoke
请求体
{
"prompt": "用户输入(用户确认后发送)",
"meta": {}
}
履约流程(支付成功后)
- 首次调用:
POST /api/v1/skill/wangye-shujucaiji/invoke,不携带X-Out-Trade-No。- 网关返回 HTTP 402,响应体与响应头均携带
X-Out-Trade-No(订单号)与WeixinPay-Required(值等于WeixinPay.payment_code);code_url(微信 Native 支付二维码链接)在响应体中。取值读响应体即可(字段更全)。
- 网关返回 HTTP 402,响应体与响应头均携带
- 支付:按「支付方式:平台自适应」处理(平台自动支付 / 二维码扫码 / 兜底 weixinpay_pay)。
- 二维码渲染:优先用本地二维码能力(如 Python
qrcode库 / 平台图片生成工具);无本地能力时用公网服务https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=<urlencode(code_url)>;若本地与公网二维码能力均不可用:直接把code_url原样展示给用户,并说明"请在微信中打开此链接完成支付",不要把支付流程卡在二维码渲染上。 - ⚠️
code_url是weixin://支付链接,必须渲染成二维码让用户用微信「扫一扫」支付,不要当作普通网页链接直接发给用户。
- 二维码渲染:优先用本地二维码能力(如 Python
- 重试履约(504 是正常过程,不是失败):支付完成后,携带响应体中的
X-Out-Trade-No重新请求同一接口(同一请求体)。- 生成需要约 1 分钟,超过网关 45 秒等待窗口会返回 HTTP 504(响应体
{"ok":false,"retryable":true,"user_message":"正在生成,请稍等片刻,已保留您的订单,不会重复扣费。"})。继续用同一个X-Out-Trade-No重试即可,通常 1–2 次内返回 200。 - 已支付且生成完成 → 返回
{"ok": true, "skill_id": "wangye-shujucaiji", "result": "网页结构化数据(表格/JSON/清单/指定字段)+ 采集报告 + 合规声明"} - 未支付 → 再次返回 402(继续提示用户支付;同一订单重复请求是幂等的,不会重复扣费)。
- 生成需要约 1 分钟,超过网关 45 秒等待窗口会返回 HTTP 504(响应体
- 交付内容:把
result中的内容按技能要求的排版交付(HTML 成品存文件交付、禁贴源码,让用户直接打开可用)。
异常处理
- 生成中(HTTP 504 /
ok:false+retryable:true):内容正在生成、订单已保留、不会重复扣费。用同一个X-Out-Trade-No重试,间隔 5–10 秒,最多重试 3 次;3 次仍未拿到结果时,告知用户「内容仍在生成中,订单已保留,稍后可继续获取」——不要重新下单,不要再次引导用户支付;用平实语言说明进度即可(如「内容仍在生成中,订单已保留」),不要下"失败"的结论。 - 未支付/支付中断:再次返回 402 时,说明支付尚未完成,引导用户继续支付(平台自动支付/扫码/兜底 AI 支付),不重复下单。
- 长时间重试后仍无结果:订单已保留、不会重复扣费。请保留订单号、不要重新下单,稍后可用同一订单继续获取。若用户要求退款:退款为人工处理,向用户说明「请提供订单号,我们将在 1–3 个工作日内原路退回」——不要承诺"已自动退款"(网关无退款接口)。
- 重复请求:订单已支付后重复请求同一
X-Out-Trade-No是幂等的,可安全重试;不要重复向用户收费或重复下单。 - 缓存命中:同一订单同一内容再次请求会秒回(
cached:true),内容与首次一致,属正常缓存,不要重复引导付费。
注意事项
- 402 / 504 都是正常支付流程,不是错误。请用平实语言向用户说明当前进度(如「正在等待支付完成」「内容正在生成中」),不要下"出错了/失败了"的结论。
- 网关生成的内容已内置技能方法论与合规要求,Agent 无需重复加工。
- 价格:¥3.99/次(price_fen=399)
边界与拒绝
- 登录墙/验证码/强风控页面:不闯,明确降级说明
- 付费墙/会员内容:不采集,说明限制
- 违法违规内容:拒绝采集,不协助绕过限制
- 单次 URL 上限 5 个:超限引导分批
- 反爬拦截后不反复试探:伪装请求头仍失败即降级说明
- 不编造采集结果:提取不清处标注"无法提取",绝不脑补
- 合规声明:仅基于公开信息,最终以官方/原页面为准
Scan to join WeChat group