web-scrapinglisted
Install: claude install-skill Linearl/reasonix_skill_repo
# 网页内容抓取 playbook
目标:从任意网页抓取完整内容,整理为多份 Markdown 文档(文字 + 图片本地化)。基于 B 站专栏文集抓取的实战经验(22 篇、1912 张图、0 失败)。
## 1. 探测页面类型
1. 用 `web_fetch` 抓 URL。
2. 返回有实质内容的文本/HTML → 直接解析。
3. 返回"空壳"HTML(只有 `<div id="app">`、大量 `<script>`,无正文)→ 是 **CSR/JS 渲染**,正文由 JS 调 API 填充。此时 `web_fetch` 无用,进入第 2 步。
## 2. 找数据 API
- 打开目标页,用浏览器 DevTools Network 面板(或 F12 → XHR 过滤)看页面发了哪些 JSON 请求。
- 找到接口后先手工 curl 验证:`curl -s -A "<UA>" -H "Referer: https://<域名>/" "<API_URL>"`。
- 实例:B 站专栏
- 文集列表:`https://api.bilibili.com/x/article/list/web/articles?id=<文集id>`(URL `rl964642` → id=964642)
- 文章正文:`https://api.bilibili.com/x/article/view?id=<文章id>` → `data.content` 是 **Quill Delta JSON**(`{"ops":[...]}`),不是 HTML;`insert` 为字符串=段落文本,`insert.native-image.url`=图片
- 留意响应中的 `code` 字段:`0` 成功;`-509` 限流;`-352` 签名/风控失败;`-101` 未登录。
## 3. 处理限流(-509 等)
- `-509 请求过于频繁` 是 **IP 级限流**,匿名请求最容易触发;带完整 cookie(如 `buvid3`)可显著缓解。
- 应对顺序:
1. 先访问 `https://www.bilibili.com/` 用 `curl -c cookies.txt` 拿匿名 cookie,请求带 `-b cookies.txt` + `Referer`。
2. 间隔 2–4 秒 + 指数退避重试(等待 10s、18s、26s…)。
3. 仍不行 → 复用浏览器登录态(第 4 步),登录后基本无限流。
- 需要 wbi 签名时参考 `MediaCrawler 的 `media_platform/bilibili/help.py`` 的 `BilibiliSign`(md5(query+salt),salt 由 img_key/sub_key 按固定 64 位置换表生成;img_key/sub_key 从 `https://api.bilibili.com/x/web-interface/nav` 的 `wbi_img` 或页面 localStorage 的 `wbi_img_urls` 取)。
## 4. CDP 复用 Chrome 登录态(推荐)
前提:本机 Chrome 已登录目标站点。
1. 关闭 Chrome,用**原用户数据目录**带调试参数重启(保留原目录才有登录态):
`chrome.exe --remote-debugging-port=9222 --remote-allow-origins=* --user-d