← ClaudeAtlas

web-scrapinglisted

从任意网页抓取完整内容并整理为 Markdown:探测 SSR/API、处理限流、CDP 复用 Chrome 登录态、图片本地化
Linearl/reasonix_skill_repo · ★ 2 · Web & Frontend · score 65
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