Install
openclaw skills install content-fetch-skill多站点网页内容抓取工具,基于 Playwright 浏览器自动化抓取 Twitter/X.com 推文、知乎文章/回答、微信公众号文章、今日头条、虎嗅等站点,以及任意通用网页。统一通过 URL 自动匹配站点并执行抓取,输出结构化 JSON、页面截图和图片。当用户要求"抓取/爬取/下载/获取"网页文章、推文、公众号文章、知乎回答、新闻内容时使用。触发词:抓取推文、爬取 Twitter、爬取 X、下载推文、抓取知乎、爬取知乎、抓取公众号、爬取微信文章、抓取头条、爬取头条、抓取虎嗅、爬取虎嗅、抓取网页、爬取文章、下载文章、获取网页内容、保存网页、采集内容。
openclaw skills install content-fetch-skill基于 Playwright 浏览器自动化的多站点内容抓取工具。通过统一入口 workflow.py 接收 URL,自动识别目标站点并调度对应的爬取脚本,最终输出结构化的 JSON 数据、页面截图与图片资源。
当用户提出以下需求时调用本技能:
# 安装依赖(首次使用)
pip install playwright pyyaml
playwright install chromium
# 通过统一入口运行(推荐,会自动匹配站点)
python workflow.py --url <目标URL>
# 显式指定参数
python workflow.py \
--url https://x.com/some_user/status/1234567890 \
--proxy http://127.0.0.1:17890 \
--cookies x_cookie.json
首次运行后,配置会自动写入 config.json,下次运行无需重复输入。
content-fetch-skill/
├── SKILL.md # 本文件,技能元信息和调用说明
├── workflow.py # 统一入口:URL → 站点匹配 → 调度爬取
├── config.yaml # 站点配置(代理、Cookie 路径、domain)
├── scripts/ # 各站点爬取脚本,每个导出 scrape_task
│ ├── scrape_twitter.py # Twitter/X.com(推文、长文)
│ ├── scrape_zhihu.py # 知乎(文章、回答)
│ ├── scrape_wechat.py # 微信公众号
│ ├── scrape_toutiao.py # 今日头条
│ ├── scrape_huxiu.py # 虎嗅
│ └── scrape_general.py # 通用站点 fallback
├── references/
│ └── troubleshooting.md # 故障排查(代理、Cloudflare、登录等)
├── x_cookie.json # Twitter Cookie(需用户提供)
├── zhihu_cookie.json # 知乎 Cookie(需用户提供)
└── fetch_data/ # 抓取结果输出根目录
└── {站点}/{任务ID}/ # 每次任务一个独立目录
├── result.json # 结构化抓取结果
├── page_screenshot.png # 全页面截图
└── images/ # 下载的图片资源
workflow.py 解析 URL 域名,按以下优先级匹配 config.yaml 中的站点:
domain 字段general 节点fetch_data/unknown/| 站点 | 标识 | Cookie | 代理 | 特殊能力 |
|---|---|---|---|---|
| Twitter/X.com | twitter | 必填 | 通常需要 | 自动展开"显示更多"、识别长文 Article、增量去重 |
| 知乎 | zhihu | 必填 | 可选 | 支持文章页和问题回答页 |
| 微信公众号 | wechat | 可选 | 可选 | 自动关闭登录弹窗 |
| 今日头条 | toutiao | 可选 | 可选 | - |
| 虎嗅 | huxiu | 可选 | 可选 | 智能清理正文头尾、过滤广告/相关推荐 |
| 通用网页 | general | 可选 | 可选 | 智能识别 article/content 容器 |
所有站点统一返回 List[Dict],字段对齐:
[
{
"title": "标题",
"content": "正文纯文本",
"url": "原始页面 URL",
"images": [
{"url": "图片URL", "alt": "alt文本", "local_path": "images/image_1.jpg"}
],
"created_at": "发布时间",
"author": "作者",
"like_count": 0,
"retweet_count": 0,
"reply_count": 0,
"screenshot": "page_screenshot.png"
}
]
workflow.py 支持的参数:
| 参数 | 说明 | 必填 |
|---|---|---|
--url | 目标 URL(任意支持的站点链接) | 是 |
--proxy | 代理地址,例如 http://127.0.0.1:17890,传 none 表示不使用代理 | 否 |
--cookies | Cookie 文件路径(JSON 格式,Playwright 兼容) | 视站点而定 |
--headless | 无头模式,默认开启 | 否 |
--no-save-config | 本次运行不保存配置到 config.yaml | 否 |
每个站点独立配置,结构示例:
fetch_site:
proxy: none
twitter:
proxy: http://127.0.0.1:17890
cookies_path: x_cookie.json
domain: x.com
zhihu:
proxy: none
cookies_path: zhihu_cookie.json
domain: zhihu.com
general:
proxy: none
cookies_path: ''
headless: true
default_url: ''
参数优先级:命令行参数 > 站点专属配置 > 全局默认 > 用户交互输入。首次运行时如果存在旧版 config.json,会自动迁移为 YAML 格式。
新增站点的标准流程:
scripts/ 下创建 scrape_{站点标识}.pyscrape_task,签名固定:
async def scrape_task(
proxy: str,
url: str,
cookies: str = '',
headless: bool = True,
output_dir: str = '',
output: str = ''
) -> List[Dict]:
...
config.yaml 的 fetch_site 下添加站点配置(含 domain 用于 URL 匹配)workflow.py 的 SITES_REQUIRING_COOKIE 中加入站点标识Twitter、知乎需要登录态。推荐使用浏览器扩展(如 EditThisCookie)导出 JSON 后保存到项目根目录:
x_cookie.jsonzhihu_cookie.json脚本会自动转换 EditThisCookie 格式(包括 expirationDate、数字型 sameSite)为 Playwright 兼容格式。
交互式选择文件:在步进式提问的 Cookie 步骤输入 [dialog] 可弹出系统文件选择对话框(基于 tkinter,无 GUI 环境会自动降级为文本输入)。
完整问题清单见 references/troubleshooting.md,常见情况:
| 问题 | 解决方案 |
|---|---|
| Cloudflare 拦截(403) | 使用住宅 IP 代理替代数据中心 IP |
| 代理连接失败 | curl -x http://127.0.0.1:17890 -s https://x.com 验证代理 |
| Cookie 失效 / 被重定向到登录页 | 重新导出最新 Cookie |
| 推文内容截断 | 脚本已自动点击"Show more",检查日志中的"点击展开"输出 |
| 图片下载失败 | 部分站点需要 Referer 头,虎嗅脚本已内置;通用站点可能拿不到 |