ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用 browser-harness 驱动 Bilibili:站点导航结构与自动化操作实战指南

使用 browser-harness 驱动 Bilibili:站点导航结构与自动化操作实战指南 浏览器控制GUI 自动化AI Agent人工智能MCP 服务AI 技能【免费下载链接】browser-harnessBrowser Harness | Self-healing harness that enables LLMs to complete any task.项目地址https://gitcode.com/gh_mirrors/br/browser-harness点击查看免费下载Bilibili 是国内流量最大的弹幕视频社区之一页面结构复杂、功能入口繁多LLM 驱动的浏览器自动化任务如抓取个人空间数据、管理收藏夹、检索热门榜单常常因为对站点导航结构不熟而反复试错。本文基于 browser-harness 仓库中经过实站验证的 bilibili 领域技能文档 编写系统梳理 Bilibili 的 URL 规律、导航层级、关键 DOM 选择器与登录态检测方法并结合仓库源码讲解如何在 browser-harness 中落地这些操作。读完本文你将能够直接编写可复用的 Bilibili 自动化脚本涵盖打开页面、切换标签页、提取用户统计、执行视频互动与解析历史记录等完整流程。领域技能机制与适用前提browser-harness 内置了一套领域技能Domain Skills机制当环境变量BH_DOMAIN_SKILLS1时goto_url(...)会返回所导航域名对应的技能文件列表见 helpers.py提示 Agent 优先阅读$BH_AGENT_WORKSPACE/domain-skills/site/目录下的文档再行动。Bilibili 的技能文档即 agent-workspace/domain-skills/bilibili/navigation.md。该文档的适用前提来自文档开头验证时间2026-05-01 在 bilibili.com 上实地验证登录要求个人空间相关功能动态流、历史、收藏、消息等需要登录公开页面首页、热门、视频页无需认证即可访问。在 SKILL.md 中也强调领域技能默认关闭只有设置BH_DOMAIN_SKILLS1才启用且任务与站点相关时应先通读对应目录下所有技能文件而不是自行发明操作路径。这意味着以下所有导航结构信息是 Agent 进入 Bilibili 自动化前的标准答案。URL 模式全图一张可检索的站点地图Bilibili 的路由规律非常清晰绝大多数功能入口都是固定路径或带参数路径。文档按用途将 URL 分为八类下文逐一整理。核心页面页面URL首页推荐流https://www.bilibili.com/动态关注流https://t.bilibili.com/个人空间https://space.bilibili.com/{UID}观看历史https://www.bilibili.com/account/history稍后再看https://www.bilibili.com/watchlater/#/list消息https://message.bilibili.com/搜索https://search.bilibili.com/all?keyword{QUERY}个人空间子页面页面URL主页视频 收藏https://space.bilibili.com/{UID}动态该用户的活动https://space.bilibili.com/{UID}/dynamic投稿https://space.bilibili.com/{UID}/upload合集和系列https://space.bilibili.com/{UID}/lists收藏https://space.bilibili.com/{UID}/favlist追番追剧https://space.bilibili.com/{UID}/bangumi设置https://space.bilibili.com/{UID}/settings发现/榜单页面URL综合热门https://www.bilibili.com/v/popular/all每周必看https://www.bilibili.com/v/popular/weekly?num{ISSUE}入站必刷经典视频https://www.bilibili.com/v/popular/all的入站必刷标签页排行榜全站https://www.bilibili.com/v/popular/rank/all话题https://www.bilibili.com/v/topic/视频页 ID 体系方面规律观看 URLhttps://www.bilibili.com/video/{BV_ID}BV 格式BV前缀 10 位字母数字如BV1HeRKBdEoXAV 格式旧版av 数字如av170001仍然可解析内容平台入口平台URL番剧动画https://www.bilibili.com/anime/电影https://www.bilibili.com/movie/电视剧https://www.bilibili.com/tv/纪录片https://www.bilibili.com/documentary/综艺https://www.bilibili.com/variety/国创中国动画https://www.bilibili.com/guochuang/专栏文章https://www.bilibili.com/read/home音频/音乐https://www.bilibili.com/audio/home课堂课程https://www.bilibili.com/cheese/直播https://live.bilibili.com/游戏中心https://game.bilibili.com/platform漫画https://manga.bilibili.com/会员购商城https://show.bilibili.com/platform/home.html赛事https://www.bilibili.com/match/home/创作者后台页面URL创作中心https://member.bilibili.com/platform/home投稿视频上传https://member.bilibili.com/platform/upload/video/frame其他页面URL大会员Premiumhttps://account.bilibili.com/big小黑屋封禁记录https://www.bilibili.com/blackroom/ban在 browser-harness 中打开任一页面都应遵循 SKILL.md 的约定任务内首次导航使用new_tab(url)而非goto_url(url)new_tab的实现见 helpers.py会先创建后台空白标签页再导航避免与附加竞态导航完成后调用wait_for_load()等待document.readyState complete。示例browser-harness PY new_tab(https://search.bilibili.com/all?keywordbrowser-harness) wait_for_load() print(page_info()) PY顶层导航栏与左侧分区分区通道顶栏bilibili.com顶部的横向导航栏结构如下无论是否登录都始终可见首页 | 番剧 | 直播 | 游戏中心 | 会员购 | 漫画 | 赛事左侧分区栏首页左侧边栏列出 30 个内容分区每个分区映射到bilibili.com/c/{SLUG}或顶层路径动态 热门 番剧 电影 国创 电视剧 综艺 纪录片 动画 游戏 鬼畜 音乐 舞蹈 影视 娱乐 知识 科技数码 资讯 美食 小剧场 汽车 时尚美妆 体育运动 动物 vlog 绘画 人工智能 家装房产 户外潮流 健身分区的 URL 规律这是自动化抓取分区内容的关键常规映射bilibili.com/c/{slug}例如/c/douga动画、/c/game、/c/music、/c/ai部分使用完整单词/c/knowledge、/c/information、/c/food、/c/fashion、/c/sports、/c/animal、/c/painting、/c/home、/c/outdoors、/c/gym部分使用缩写/c/kichiku鬼畜、/c/ent、/c/tech短剧/c/shortplay汽车/c/car源码中无尾部斜杠。抓取某个分区时可以直接构造/c/{slug}URL 并配合page_info()确认落地页面避免盲目点击左侧边栏。用户菜单登录后右上角的入口集合点击顶栏右上角头像可展开下拉菜单各入口如下入口URL说明大会员account.bilibili.com/big会员状态消息message.bilibili.com子项回复我的、我的、收到的赞、系统消息、我的消息动态t.bilibili.com关注流——日常使用最重要的入口收藏space.bilibili.com/{UID}/favlist收藏夹历史https://www.bilibili.com/account/history观看历史创作中心member.bilibili.com/platform/home创作者后台投稿member.bilibili.com/platform/upload/video/frame上传视频登录态检测可直接运行的代码文档给出了通过 DOM 判断登录状态与提取当前用户 UID 的 JavaScript 片段这些片段可直接放进 browser-harness 的js(...)调用中执行。js(expression)的实现见 helpers.py先原样求值表达式若 Chrome 报告非法的顶层return会自动用函数包装重试因此文档里的?.链式写法与match(...)均可正常执行。# 已登录头像元素存在 avatar js(document.querySelector(.header-entry-avatar)?.src || not logged in) # 未登录登录按钮可见 login_btn js(document.querySelector(.header-login-entry)?.textContent?.trim() || no login btn)提取当前用户 UID从头像链接中解析space.bilibili.com/{数字}uid js(document.querySelector(.header-entry-avatar)?.closest(a)?.href?.match(/space\\.bilibili\\.com\\/(\\d)/)?.[1])UID 是纯数字且稳定出现在空间 URL 中这一特性非常适合作为后续个人空间相关请求的参数来源。注意文档明确提示访问需要登录的功能时遇到登录墙应停下询问用户而不是硬闯见 SKILL.md 的 Page Workflow 部分。个人空间标签页与用户统计标签页结构个人空间space.bilibili.com/{UID}内部有子导航主页 | 动态 | 投稿 | 合集和系列 | 收藏 | 追番追剧 | 设置各标签页含义主页— 视频网格 收藏夹 统计数字动态— 该用户的活动流注意区别于t.bilibili.com的关注流两者是完全不同的页面投稿— 已发布视频可按 最新发布 / 最多播放 / 最多收藏 排序合集和系列— 策划整理的视频合集收藏— 收藏夹公开或仅自己可见追番追剧— 追踪的番剧/影视设置— 空间配置。用户统计数字个人空间页面的统计区块选择器为.nav-statistics其子元素为.nav-statistics__item数值位于.nav-statistics__item-num统计项类名关注数.nav-statistics__item.jumpable第一个粉丝数.nav-statistics__item.jumpable第二个获赞数.nav-statistics__item第三个播放数.nav-statistics__item第四个提取某个 UP 主的四维数据只需一行 JS配合js()返回结构化值new_tab(https://space.bilibili.com/{UID}) wait_for_load() stats js( [...document.querySelectorAll(.nav-statistics__item)].map( e e.querySelector(.nav-statistics__item-num)?.textContent?.trim() ) ) print(stats) # [关注数, 粉丝数, 获赞数, 播放数]视频页交互点赞、投币、收藏、分享与三连在观看页bilibili.com/video/{BV_ID}播放器下方的工具栏提供以下操作操作选择器/类名说明点赞.video-like计数在.video-like-info投币.video-coin每个用户对单个视频最多投 2 枚硬币收藏.video-collect加入收藏夹分享.video-share-wrap打开分享面板链接/复制/二维码三连长按点赞按钮一键同时完成点赞 投币 收藏三连是 Bilibili 的标志性交互长按点赞按钮会同时点赞、投 1 枚硬币并加入收藏。硬币硬币与 B 币B 币硬币用户每日登录即可免费获得通过投币消耗每视频 1 或 2 枚数量显示在头部用户区域硬币 ≠ B 币B 币需要用真实货币购买用于充电、打赏、大会员等场景。弹幕弹幕是滚动显示在视频上的实时评论通过播放器控制栏中的弹幕按钮开关。文档特别指出弹幕数据在视频播放器初始化之后通过 XHR 加载这与下方的视频页加载陷阱相呼应。充电充电是支持创作者的按月订阅/打赏功能入口位于 UP 主空间页或视频播放器下方。视频页的关键时序陷阱文档给出的 Gotchas 中有一条对自动化至关重要wait_for_load()在视频页上不够用—— 与 YouTube 类似视频播放器及其工具栏组件在 load 事件之后才会水合hydrate。在查询视频工具栏选择器之前需要先wait(3)。这条经验与 helpers.py 中wait_for_element(selector, timeout, visible)的设计动机一致wait_for_load()只轮询document.readyState而 SPA 在文档 complete 之后才渲染框架内容。因此稳健的做法是new_tab(https://www.bilibili.com/video/BV1HeRKBdEoX) wait_for_load() wait_for_element(.video-like, timeout10, visibleTrue) # 等待工具栏水合 wait(3) if not ... # 文档建议在必要时额外等待 3 秒其中visibleTrue会调用checkVisibility走查祖先链兼顾display:none/visibility:hidden/opacity:0比单独检查元素自身样式更可靠。收藏夹/favlist收藏夹页面中每个收藏夹展示名称、视频数量、可见性公开/仅自己可见。页面包含两个区块我创建的收藏夹— 用户自己的收藏夹我追的合集/收藏夹— 关注的他人合集。支持的操作新建收藏夹点击新建收藏夹设置可见性每个收藏夹独立设置公开 / 仅自己可见默认收藏夹自动创建所有快速收藏的视频都归入其中。自动化打开某个用户的公开收藏夹并解析视频列表new_tab(https://space.bilibili.com/{UID}/favlist) wait_for_load() folders js([...document.querySelectorAll(.fav-list)]) # 按实际 DOM 结构调整注意 Gotchas 提示导航到/favlist时页面可能重定向到/favlist?fid{默认收藏夹ID}ftypecreate并自动展开第一个收藏夹——这是站点设计行为不是脚本出错。观看历史与稍后再看观看历史/account/history历史页提供的功能暂停/恢复记录— 暂停记录历史 / 继续记录历史清空全部— 清空历史日期过滤— 今天 / 昨天 / 近 1 周 / 1 周前 / 1 个月前每条记录展示标题、进度看到 XX:XX、UP 主名、分区标签。历史条目位于.history-record元素中。若页面提示历史功能暂停中说明用户手动暂停了记录需要点击继续记录历史恢复。稍后再看watchlater稍后再看位于bilibili.com/watchlater/#/list这是一个 SPA 路径不是/account/history的子页面同时它也作为个人空间主页收藏区的默认收藏夹出现。文档特别强调稍后再看与历史是相互独立的两个功能。搜索search.bilibili.com搜索结果页是标签式的综合 | 视频 | 番剧 | 影视 | 直播 | 专栏 | 用户每个标签页显示数量徽标如视频99查询参数?keyword{QUERY}在搜索输入框输入时会出现自动补全建议。搜索框属于典型的高交互输入场景helpers.py 的fill_input(selector, text, clear_firstTrue, timeout0.0)正是为此类受框架管理的输入框设计的它聚焦元素、清空旧值、通过真实按键事件输入再派发input/change事件让框架感知更新——比type_text()底层是Input.insertText会绕过框架事件监听更可靠。用它可以安全地向搜索框填入关键词new_tab(https://search.bilibili.com/all) wait_for_load() fill_input(input[namesearch_keyword], browser-harness, timeout5) press_key(Enter)热门页与排行榜热门页/v/popular/all标签栏结构综合热门 | 每周必看 | 入站必刷 | 排行榜 | 全站音乐榜综合热门— 当前热门内容每周必看— 每周精选URL/v/popular/weekly?num{ISSUE}ISSUE 为期数编号入站必刷— 全站经典视频排行榜— 重定向到/v/popular/rank/all全站音乐榜— 音乐类榜单。排行榜/v/popular/rank/all排行榜提供 24 个分类标签全部、番剧、国创、纪录片、电影、电视剧、综艺、动画、游戏、鬼畜、音乐、舞蹈、影视、娱乐、知识、科技、数码、美食、汽车、时尚、美妆、体育、运动、动物。每个条目展示排名数字、标题、创作者、播放量、互动数。抓取某期每周必看可直接构造带参 URLnew_tab(https://www.bilibili.com/v/popular/weekly?num400) wait_for_load()自动化实践要点与常见陷阱标签页与加载流程规范结合 SKILL.md 与 interaction-skills/tabs.md 的约定Bilibili 自动化建议遵循以下流程任务内首次导航用new_tab(url)之后用switch_tab()复用已打开的标签页避免重复标签导航后调用wait_for_load()对 SPA 页面改用wait_for_element(selector)视频页等水合型页面额外wait(3)或直接等待目标选择器可见需要登录的功能先通过.header-entry-avatar检测登录态遇到登录墙停下询问用户switch_tab()默认不改变 Chrome 可见标签页截图与 CDP 输入都在后台标签页上工作见 helpers.py。完整 Gotchas 清单文档总结了九条实战中踩过的坑全部值得在写脚本前通读动态有两个含义—t.bilibili.com是关注流你关注的人的内容space.bilibili.com/{UID}/dynamic是某个用户的动态二者是不同页面收藏夹 URL 会重定向— 进入/favlist可能被重定向到/favlist?fid{默认收藏夹ID}ftypecreate自动打开第一个收藏夹历史可以暂停— 若历史页显示历史功能暂停中说明用户暂停了记录点击继续记录历史恢复UID 是纯数字— 不同于 YouTube 的字符串 handleBilibili 用户 ID 全部为数字出现在空间 URL 中且稳定BV 与 AV ID— 新视频使用 BV 格式如BV1HeRKBdEoX旧版 AV 格式如av170001仍可解析但新内容全部使用 BV视频 URL 会被追加?vd_source— 从已登录会话导航时Bilibili 会追加vd_source追踪参数可在比较 URL 时剔除稍后再看独立于历史—/watchlater/#/list是 SPA 路径不是/account/history的子页面硬币不是 B 币— 硬币每日免费获得B 币需真实货币购买用于充电/打赏/大会员部分分区 slug 用缩写— 鬼畜是/c/kichiku娱乐是/c/ent科技是/c/tech并非全部采用拼音或英文全称。结语本文把 Bilibili 的站点导航结构压缩成了一张可编程的地图从 URL 模式、顶栏与分区导航、用户菜单与登录态检测、个人空间标签与统计选择器到视频页互动、收藏夹、历史、搜索与榜单每一处都给出了可直接用于 browser-harness 的 URL、选择器和代码片段并配套了仓库源码级的最佳实践标签页规范、水合等待、框架输入框填充。这些信息均来自 agent-workspace/domain-skills/bilibili/navigation.md 的实站验证结果读者在编写任何 Bilibili 相关自动化任务时都应优先查阅该文档与 SKILL.md把已经验证过的导航知识直接复用而不是重新试错。赞分享浏览器控制GUI 自动化AI Agent人工智能MCP 服务AI 技能【免费下载链接】browser-harnessBrowser Harness | Self-healing harness that enables LLMs to complete any task.项目地址https://gitcode.com/gh_mirrors/br/browser-harness点击查看免费下载相关推荐用 ego-browser 驱动 XTwitter自动化页面结构、Anti-Click-Wrap 选择器与站点技能Site Skills实战用 ego browser 驱动 XTwitter自动化页面结构、Anti Click Wrap 选择器与站点技能Site Skills实战 导读 本AI 技能浏览器控制OpenCLI Browser Sitemap Skill基于站点地图驱动浏览器导航的 Agent 实战指南OpenCLI Browser Sitemap Skill基于站点地图驱动浏览器导航的 Agent 实战指南 导读 opencli browser sitem开发工具CLI人工智能AI 应用浏览器控制GUI 自动化ego-browser 站点技能实战Google 搜索结果页结构笔记与自动化提取ego browser 站点技能实战Google 搜索结果页结构笔记与自动化提取 Google 搜索是 Agent 自动化场景中最高频的入口之一而 egoAI 技能浏览器控制上一篇CORE-V-VERIF 项目推荐下一篇如何快速掌握WebTransport打造低延迟Web通信的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进