想象你请了一位全能数字管家“小布”。早上你说一句“帮我查一下下周去杭州的高铁票,并把最便宜的一趟发给我”,半小时后,一份整理好的车次表就躺在你的邮箱里。小布做了什么?它打开浏览器、进入订票网站、在搜索框填入出发地和目的地、点击查询、翻看结果页、提取价格与时间、最后将信息整理成清单。这套动作,正是 Browser Use 框架赋予 AI 的能力:让大语言模型像人一样操作真实浏览器。它的工作循环可以浓缩为六个字——观察、思考、行动:先看当前页面(观察),再由大模型判断下一步(思考),然后调用工具点击、输入、滚动(行动),接着再看新页面……直到任务完成。本文将用小布管家的故事,拆解 Browser Use 的框架概述、核心架构、页面理解、操作执行、表单填写、数据提取与反检测策略,让你从零理解并上手。
理解 Browser Use,你将能构建自主浏览网页、填写表单、提取数据的 AI Agent,这是 AI 应用落地中极具商业价值的能力。
可视化演示
对比观察者模式的发布-订阅通知机制与命令模式的请求封装-执行流程,动态展示主题状态变更触发观察者更新的完整链路。
本节配有交互动效(进入视口后自动加载,约 3KB)。
观察者模式 Subject状态变更触发notify() 遍历观察者列表调用update() S→O1/O2/O3 一对多依赖关系通知
框架概述
想象你雇佣小布的第一天,最关心的问题是:这位管家到底能做什么?它和我请一个“会写网页脚本的程序员”有什么区别?这就好比把传统网页自动化工具比作一份打印好的剧本,每一步都写死,页面一改剧本就得重写;而 Browser Use 更像一位会随机应变的管家,你只需要说清目标,它自己看着办。
Browser Use 是一个开源 Python 框架,它让大语言模型(LLM)像真实用户一样操作浏览器。用户用一句自然语言描述任务目标,框架就会驱动浏览器自动执行。与 Selenium 最大的不同在于:Selenium 需要你用代码把每一步操作写死,而 Browser Use 由 LLM 根据网页实际反馈动态决策下一步。这意味着同一个 Agent 可以适应不同界面,而不需要重新编写脚本。
核心工作原理是一个闭环流程:发起任务 → 获取浏览器状态快照 → LLM 决策动作 → 执行动作 → 更新状态 → 再次观察,直到任务完成。这个循环中的四个关键要素是:LLM(大脑)、浏览器环境(执行场)、DOM 快照(观测)、动作协议(工具接口)。它们各司其职,缺一不可。
小布之所以“聪明”,不是因为它记住了所有网页的点击坐标,而是因为它每做一步都会看一眼当前情况再想下一步——这就是“观察-思考-行动”的管家工作流。你对它说得越清楚,它干得越漂亮。
- 页面状态 $s_t$在浏览器环境中,$s_t$ 表示第 t 步时的可观测页面状态,包括当前 URL、DOM 快照与可交互元素列表。
- 动作 $a_t$Agent 在当前状态下做出的操作,例如点击某个按钮、在输入框中填入文本、滚动页面。
- 环境执行 $\text{Browser}(s_t, a_t)$浏览器环境接收动作并执行,把页面状态从 $s_t$ 更新为 $s_{t+1}$。
- 大模型决策 $\text{LLM}(\cdot)$LLM 综合任务目标和历史信息(已发生的状态与动作),输出当前这一步的动作。
核心架构
小布不是一个人在跑腿:它的“大脑”负责判断该做什么,“眼睛”负责观察环境,“手”负责真正执行。三者之间靠一套固定的协作流程连接起来,这套流程就是 Agent 循环。你可以把它想象成管家的例行工作法:先环顾四周,再动脑子盘算,最后伸出手做事,每做完一件就再环顾一次。
在 Browser Use 中,Agent 循环包含四个环节:观察(observe)——把浏览器当前状态序列化为 DOM 快照;思考(reason)——LLM 结合任务目标和历史,推理出下一步动作;行动(act)——输出一个结构化工具调用并交由浏览器执行;反馈(feedback)——执行后获得新的页面快照,回到观察环节。
工具调用是这套架构的“通用语言”。动作不是自由文本,而是结构化的 JSON 格式,例如 {"action": "click", "selector": "button#submit"}。框架内部通过 Playwright 驱动真实浏览器执行这些动作。同时,Agent 维护一段记忆(history),记录目标、已执行动作序列和结果,作为后续决策依据。停止条件有两个:任务完成,或达到最大步数上限而终止。
小布每完成一个动作,都会在日志本上记一笔,然后重新看看四周再决定下一步。这套“记日志—观察—思考—行动”的工作法,正是 Browser Use 核心架构的通俗写照。
- 历史记录 $h_{<t}$截至第 t 步之前的所有页面状态与动作序列,相当于 Agent 的工作日志。
- 动作 token $a_{t,i}$第 t 步动作字符串中的第 i 个 token,token 是模型生成文本的最小单位。
- 连乘表达式 $\prod$自回归生成中,每个 token 的条件概率相乘,得到整个动作序列被采样的概率。
- 条件概率 $P(\cdot)$在给定目标与历史条件下,这个动作被 LLM 选中的概率。
页面理解
小布进入一个大型商场,怎么在密密麻麻的柜台中找到目标任务?它优先看三样东西:招牌文字像不像(文本语义)、柜台是否开门(可见性)、柜台类型对不对(元素类型)。这三条经验,恰好对应页面理解的核心策略。
Browser Use 的页面理解分两步:先把浏览器渲染后的 DOM 树解析成文本快照,再从快照中找到与用户目标最相关的可交互元素。相比直接使用截图,DOM 解析更精确、token 开销更低,还能拿到“看不见”的结构信息,例如 aria-label、name 等属性。当然,对于复杂场景,框架也支持截图并交给多模态模型作为补充。
解析时需要注意几个技术细节。一是可见性:display: none 或 visibility: hidden 的元素用户看不到,Agent 必须跳过。二是 iframe:嵌套页面需要先切换到子框架才能操作内部元素。三是元素定位:Browser Use 返回给 LLM 的是带索引的元素列表,每个元素包含标签名、属性、文本和可交互性描述,LLM 据此选择目标。
小布找目标柜台不是靠运气,而是靠“招牌像不像、开没开门、类型对不对”三条经验组合打分。Browser Use 的元素定位,本质上就是这套打分思维的工程实现。
- 候选元素 $e$DOM 树中某个可交互元素,例如按钮、输入框或链接。
- 文本相似度 $\text{sim}$任务目标与元素文本之间的语义相似度,例如“购买”和“立即购买”很接近。
- 可见性指示 $\mathbb{1}[\text{vis}(e)]$元素可见时取值为 1,不可见时为 0,避免 Agent 操作页面隐藏元素。
- 类型匹配 $\text{type\_fit}$元素标签类型是否符合任务需要的操作类型,例如点击任务应匹配按钮。
操作执行
小布找到目标后,“动手”环节就要干净利落:该按的门铃要按(click),该写的留言要写(type),该上的楼层要上(go to)。如果手抖按错了怎么办?它会观察结果反馈,再决定是重试还是换一种方式。
Browser Use 将操作抽象成一份有限的“动作空间”。每个动作由名称和参数组成,参数通过 CSS 选择器或元素索引指定目标元素。底层使用 Playwright 驱动真实浏览器,因此支持鼠标、键盘、滚动等原生事件,行为与真人操作几乎没有差别。
常用动作包括:click(selector) 点击目标元素;type(selector, text) 在输入框中输入文本,会先清空原内容;scroll(direction) 按方向滚动页面;open(url) 打开新网址;back() 与 forward() 控制浏览器前进后退。一次复杂任务由多步动作组合完成,每一步执行后 Agent 都会拿到新的页面快照,与预期对比判断动作是否生效,必要时调整策略或重试。
小布的技能清单看起来简单,但组合起来就能完成“查机票—比价格—填订单”这类复杂差事。动作空间从不过度复杂,够用、稳定、可组合,才是工程上最优雅的设计。
- 动作空间 $\mathcal{A}$Agent 可用的全部动作集合,是框架定义的“官方技能列表”。
- 点击操作 $\text{click}(sel)$在参数
sel指定的元素上执行一次鼠标左键点击。 - 输入操作 $\text{type}(sel, \text{text})$向
sel命中的输入框填入字符串text。 - 导航操作 $\text{open}(url)$ 与 $\text{back}()$打开新网页或退回上一个页面。
表单填写
入住酒店时,小布帮你填登记表:姓名、证件号、联系方式。它要先看清每一栏要什么,再对照资料夹里的信息一一填写,最后检查一遍再点提交。这完整复现了 Browser Use 处理表单场景的流程。
表单填写要解决三个子问题:识别表单字段、匹配数据来源、提交并处理反馈。Browser Use 通过 DOM 中的 label 关联、placeholder 文案和 name 属性来推断字段语义。例如 <label for="phone">手机号</label> 对应的输入框,Agent 就知道应该填手机号。然后它从任务上下文或历史信息中寻找对应数据,再执行 type 操作填入。
填写完成后进入提交环节:点击提交按钮,观察页面是否出现验证码、错误提示或成功跳转。若出现校验失败,Agent 会尝试修正(例如手机号格式错误时重新输入)。框架还内置合规校验逻辑:对手机号、邮箱等常见字段做格式校验,数据不合法就不提交,避免制造脏数据。
小布填表前会核对资料、填完后会检查一遍再按“提交”,这既是优秀管家的职业习惯,也是表单填写 Agent 行为范式的核心原则:识别、映射、填写、校验,一步都不能少。
- 必填字段集 $F_{\text{req}}$表单中标记为必填的字段集合,例如姓名、手机号。
- 字段值 $v_f$Agent 为字段 $f$ 准备填入的值,例如手机号的 "13812345678"。
- 校验函数 $\phi(v_f)$对值做格式校验的函数,手机号必须满足 11 位数字、邮箱必须包含 @ 等。
- 完成度计算分子是校验通过的必填字段数量,分母是必填字段总数,比值衡量表单整体完整度。
数据提取
小布逛完商场,除了“看过”还不够,你要的是它把有用的情报整理成一张表格带回来。数据提取正是让 AI Agent 从网页中“带走结构化价值”的关键能力。
Browser Use 提供两条提取路径:规则定位和 LLM 语义抽取。规则定位适合表格结构清晰的页面,例如用 XPath 抓取 <table> 的行列内容,速度快且稳定;LLM 语义抽取适合描述性文本,例如从一段商品介绍中抽取名称、价格、评分等字段。两者可以结合:先规则定位页面区域,再交给 LLM 做字段级提取。
技术实现上,结构化提取会先定义 schema,例如 {"product": string, "price": number},然后让 LLM 从页面文本片段中按 schema 抽取并输出 JSON。对于多页列表,Agent 会递归点击“下一页”,提取后去重、合并,最后对结果做 JSON schema 校验和重复值清理,导出为 CSV 或 JSON 文件。
小布把广袤信息中挑挑拣拣、去伪存真、整理成清单,这正是数据提取的核心意义。它不追求“看完全部网页”,而是追求“精准带回你真正要的东西”。
- 页面文本 $p$从当前页面截取的有效文本片段,例如商品卡片里的描述文字。
- 目标字段 $f$要提取的字段名,例如 “price“(价格)或 ”product”(商品名)。
- 候选值集合 $V_p$从页面文本中构造出的可能作为字段值的候选片段集合。
- 最大概率选取 $\arg\max$遍历所有候选,取令 $P_\theta(v \mid p, f)$ 最大的 $v$ 作为最终提取结果。
反检测策略
小布勤勤恳恳工作,但如果它每次访问都像精确到毫秒的机器一样整齐划一,网站的风控系统很容易识破它不是真人,从而限制访问甚至封禁账号。真实浏览器自动化必须面对反检测问题。
网站的反爬/风控体系通常会检测请求频率、User-Agent 指纹、访问时间间隔、鼠标移动轨迹、Cookie 行为等特征。Browser Use 这类自动化框架天然容易暴露这些特征,因此需要反检测策略。但必须强调:反检测必须在合法合规的框架内使用,例如遵守网站的 robots.txt、控制合理的访问频率,绝不用于恶意爬取或突破登录鉴权。
常用的反检测手段包括:模拟人类节奏——在动作之间加入随机延迟,延迟时长服从对数正态分布,而非固定值;模拟鼠标轨迹——移动过程带加速度与轻微偏移,不沿直线猛然跳转;指纹伪装——轮换合理的 User-Agent,通过代理 IP 轮换避免同一 IP 高频访问;行为规范性——不瞬间打开几十个标签页,重要交互前先滚动页面再操作。
小布学会像真人一样偶尔发呆、偶尔停顿,这种“不完美”反而让它成为更可信赖的管家。反检测的本质不是伪装成坏人,而是让机器人的行为更像一个遵守规矩的普通人。
- 停留时长 $t_{\text{dwell}}$从读取页面完成到发起下一个动作之间的时间间隔,也就是“思考后的停顿”。
- 对数正态分布 $\text{LogNormal}$一种取值永远为正、带长尾的分布,符合人类“偶尔快、偶尔慢”的真实节奏。
- 参数 $\mu, \sigma$控制平均等待时长和波动幅度,例如 $\mu=0.5, \sigma=0.3$ 表示平均约几百毫秒。
- 采样 $\sim$每次动作前从分布中随机抽取一个延迟值,而不是使用固定数字。
AI 应用场景
AI 驱动的 UI 自动化测试
阶段:测试自动化
解决的问题:传统 Selenium 脚本需要人工维护大量 CSS 选择器和 XPath,前端布局一改脚本就崩。Browser Use 让 LLM 根据页面语义自主定位元素,大幅降低脚本维护成本。
具体案例:某电商前端团队用 Browser Use 构建冒烟测试 Agent,每日自动遍历核心购买链路(搜索→详情→加购→结算)。界面调整时 Agent 根据 DOM 变化自动调整操作,测试通过率从 70% 提升到 95%。
竞品价格监控与市场情报
阶段:数据采集
解决的问题:人工每小时刷新竞品页面效率低、易遗漏,且信息散落难以汇总。Browser Use 定时访问竞品页面,用 LLM 提取价格、库存、促销字段并输出结构化报告。
具体案例:某电商运营团队用 Browser Use 构建价格监控 Agent,每小时采集 10 个竞品的商品标题、价格、促销信息写入数据库,发现异常降价自动触发邮件告警。
企业 ERP 表单自动录入
阶段:办公自动化
解决的问题:许多企业旧系统没有开放 API,员工每天手工把 Excel 数据复制到网页表单中,枯燥且易出错。Browser Use 根据数据源自动完成字段映射、填写与提交。
具体案例:某财务团队用 Browser Use 实现报销单自动录入:Agent 从邮件附件解析发票信息,将数据填入 ERP 表单,完成合规校验后提交,单笔操作从 5 分钟降到 30 秒。
Python 演示
"""Browser Use 风格浏览器自动化 Agent 的简化演示"""import re class FakeBrowser: """模拟浏览器环境:维护页面元素列表""" def __init__(self): self.url = "https://shop.example.com" self.elements = [ ("input", "搜索框", {"placeholder": "请输入商品", "data_id": 0}), ("button", "搜索", {"class": "search-btn", "data_id": 1}), ] self.filled = {} def snapshot(self): """生成当前页面的文本快照(模拟 DOM 序列化)""" lines = [] for el in self.elements: tag, text, attrs = el attrs_str = " ".join(f"{k}={v}" for k, v in attrs.items()) lines.append(f"[{attrs['data_id']}] <{tag} {attrs_str}>{text}</{tag}>") return "\n".join(lines) def click(self, el_id): """模拟点击搜索按钮:点击后页面出现商品结果""" if el_id == 1: self.elements.append( ("div", "无线耳机 Pro 价格 199.00 元", {"class": "product-price", "data_id": 2}) ) return f"点击了元素 {el_id}" def fill(self, el_id, text): """模拟在输入框中输入文本""" self.filled[el_id] = text return f"在元素 {el_id} 输入了 {text}" class BrowserUseAgent: """简化版 Browser Use Agent:LLM 决策 + 浏览器执行循环""" def __init__(self, goal, max_steps=5): self.goal = goal self.max_steps = max_steps self.history = [] self.result = None self.typed = False def llm_decide(self, snapshot): """模拟 LLM 生成动作(真实场景此处调用大模型 API)""" if "price" in self.goal and "product-price" in snapshot: return ("extract", {}) if not self.typed and "搜索框" in snapshot: return ("fill", {"el_id": 0, "text": "无线耳机"}) if "search-btn" in snapshot: return ("click", {"el_id": 1}) return None def execute(self, browser, action, params): """执行动作并返回结果描述""" if action == "fill": self.typed = True return browser.fill(params["el_id"], params["text"]) if action == "click": return browser.click(params["el_id"]) if action == "extract": match = re.search(r"价格 (\d+\.?\d*) 元", browser.snapshot()) self.result = match.group(1) if match else "未找到价格" return f"提取到价格:{self.result}" return "未知操作" def run(self, browser): """主循环:观察 -> 思考 -> 行动 -> 反馈""" for step in range(self.max_steps): snapshot = browser.snapshot() decision = self.llm_decide(snapshot) if decision is None: self.history.append( {"step": step, "action": "无动作", "detail": "未找到合适操作"}) return False action, params = decision detail = self.execute(browser, action, params) self.history.append( {"step": step, "action": action, "params": params, "detail": detail}) if action == "extract": return True return False def main(): browser = FakeBrowser() agent = BrowserUseAgent("在商店搜索无线耳机并提取价格") ok = agent.run(browser) print(f"任务完成:{ok}") print(f"任务目标:{agent.goal}") print(f"提取结果:{agent.result}") print("\nAgent 运行轨迹:") for h in agent.history: print(f" step {h['step']}: {h['action']} {h['params']} -> {h['detail']}") if __name__ == "__main__": main()
class FakeBrowser模拟真实浏览器环境,维护一个元素列表并提供快照与操作接口。def snapshot将 DOM 元素序列化为文本快照,模拟真实 Browser Use 中发给 LLM 的页面状态。def llm_decide模拟大模型根据页面快照生成动作,真实实现中这里会调用大模型 API。order of decisions代码按照“先输入、再点击、最后提取”的优先级逐步推进任务。def execute动作分发器,把结构化的动作指令拆解为具体的浏览器操作。if action == "extract"使用正则从页面文本中提取价格,对应 LLM 结构化提取的简化版本。def run核心主循环:观察快照、决策动作、执行操作、记录历史,直到提取完成或步数耗尽。self.typed状态标记变量,确保搜索框只填写一次,避免重复输入。
常见误区
误区我反正会写 Selenium 脚本,把定位器换成提示词,不就是 Browser Use 了吗?底层不都是在操作浏览器。
正解两者有本质区别:Selenium 脚本是“死剧本”,每一步预先写死,页面一变就崩;Browser Use 是“活管家”,每一步由 LLM 实时读取页面快照后动态决策。它没有写死的步骤序列,而是用“观察—思考—行动”循环决策。相当于按剧本演出的演员与随机应变的管家之间的差别。
为何常见:因为两者最终都是操作浏览器的程序,初学者容易只看到表象,忽略了“自主决策”这一核心差异。
误区AI 识别网页肯定像人眼一样看截图,把页面图片发给大模型就完事了。
正解大多数场景下 Browser Use 优先用 DOM 解析,把网页结构、元素属性、可访问性文本送给 LLM,而不是截图。DOM 文本准确、token 便宜、能精确定位属性;截图只作为多模态模型的补充手段。就像管家找东西先看标签,而不是凭模糊的视觉印象。
为何常见:受多模态大模型宣传的影响,很多人默认视觉理解是唯一路径,忽略了 DOM 级数据的工程优势。
误区Browser Use 找不到按钮?那一定是框架太弱,换个更“智能”的框架就好了。
正解定位失败大多不是框架问题,而是环境因素:元素在 iframe 内未切换、页面异步数据未加载完成、CSS 动画导致元素不可点击、元素被遮挡。正确做法是使用等待机制、切换 iframe、获取稳定可达的元素。好比管家找不到人,先要确认人是否在里屋(iframe),而不是急着换个管家。
为何常见:新手遇到报错的第一反应是换工具,而不是排查环境状态,忽视了浏览器自动化的工程性。
误区学了反检测策略,我就能在任意网站上肆无忌惮地采集数据,绕过一切风控。
正解反检测的目标是“合规采集”:遵守 robots.txt、控制请求频率、模拟合理的人类行为节奏。绕过登录鉴权、突破风控抓取受限数据在多数地区有法律风险。真正的大规模数据需求应优先申请官方 API。小布的“伪装”是为了像普通人一样风度翩翩,而不是为了做坏事。
为何常见:看到“反检测”三个字就容易联想到爬虫破解,忽视了技术伦理与法律边界。
面试题
Q1. Browser Use 属于哪类框架?
- A.静态网页抓取库
- B.大模型浏览器自动化框架← 正确答案
- C.前端 UI 组件库
- D.数据库中间件
答案:B。Browser Use 的核心是让大语言模型驱动浏览器完成操作,属于 AI Agent 浏览器自动化框架。静态抓取只读不操作,UI 组件库与数据库中间件更是离题万里。
Q2. Browser Use 的 Agent 循环顺序是?
- A.行动→观察→思考
- B.观察→思考→行动← 正确答案
- C.思考→行动→观察
- D.行动→思考→观察
答案:B。标准流程是先观察页面快照,再让 LLM 思考决策,最后执行动作,动作完成后观察新状态进入下一轮循环,因此是“观察→思考→行动”。
Q3. 页面理解时,DOM 解析相比视觉截图的主要优势是?
- A.获取像素级颜色信息
- B.定位精确且 token 开销低← 正确答案
- C.完全替代浏览器渲染
- D.不需要处理 iframe 问题
答案:B。DOM 提供结构化的标签、属性、文本与可交互信息,能精确定位元素,且纯文本的 token 消耗远低于图像。像素颜色对定位无帮助,DOM 也无法替代渲染,iframe 问题依然需要处理。
Q4. 表单填写中,判定“必填字段全部通过校验”用的指标是?
- A.页面加载网络耗时
- B.表单完成度← 正确答案
- C.点击提交按钮次数
- D.DOM 树的节点总数
答案:B。表单完成度定义为校验通过的必填字段数除以必填字段总数,等于 1 时才满足提交条件。页面耗时、点击次数、DOM 总量都与字段校验无关。
Q5. 下列哪些属于 Browser Use 的典型操作?
- A.click 点击元素← 正确答案
- B.type 输入文本← 正确答案
- C.scroll 滚动页面← 正确答案
- D.compile 编译代码
答案:ABC。Browser Use 的动作空间包括点击、输入、滚动、打开网址、前进后退等浏览器操作,并不存在“编译代码”这类动作,编译属于开发工具而非浏览器行为。
Q6. 数据提取时,LLM 语义抽取相比 XPath 解析的优点是?
- A.处理描述性文本更灵活← 正确答案
- B.执行速度一定更快
- C.完全不需要页面内容
- D.保证百分之百准确
答案:A。LLM 擅长从非结构化描述文本中抽取字段,例如从商品介绍中提炼价格;XPath 依赖固定 DOM 结构,适合规则明确的表格。语义抽取并非一定更快,也必须依赖页面内容,且不能保证零错误。
Q7. 元素定位失败时,应该优先排查哪些情况?
- A.元素位于 iframe 内← 正确答案
- B.页面异步数据未加载← 正确答案
- C.元素被遮挡不可点击← 正确答案
- D.更换网络运营商
答案:ABC。iframe 未切换、异步渲染未完成、元素被其他层遮挡是定位与点击失败的三大常见根因。更换网络运营商与 DOM 定位没有直接关系,不能解决问题。
Q8. 反检测中模拟人类阅读时间通常采用哪种分布?
- A.均匀分布
- B.对数正态分布← 正确答案
- C.二项分布
- D.泊松分布
答案:B。对数正态分布具有“正数且带长尾”的特征,符合人类阅读中偶尔快、偶尔慢的真实节奏。均匀分布的固定间隔反而规律性太强,容易被风控识别为机器行为。
Q9. 传统 Selenium 与 Browser Use 的核心区别是?
- A.前者写死步骤后者动态决策← 正确答案
- B.前者支持点击后者不支持
- C.后者必须人工点击操作
- D.两者在原理上完全相同
答案:A。Selenium 依赖预定义脚本,页面的每一步操作路径固定;Browser Use 由 LLM 实时观察页面后自主决策下一步。两者都支持点击,Browser Use 是自动操作不需要人工点击,原理上完全不用于前者。
Q10. 关于反检测的合规做法,以下说法正确的有?
- A.遵守网站的 robots.txt 协议← 正确答案
- B.控制合理的请求访问频率← 正确答案
- C.可绕过登录鉴权采集数据
- D.优先申请使用官方 API← 正确答案
答案:ABD。合规的反检测应在授权范围内进行:遵守 robots.txt、合理控制频率、优先使用官方数据接口。绕过登录鉴权抓取非公开数据在多数地区存在法律风险,不属于合规行为。