如何使用浏览器开发工具查找和抓取隐藏的API
Advanced Data Extraction Specialist
TL;DR:
- 隐藏API是页面使用的请求,但不作为公共开发者API进行宣传。 它可能返回JSON、GraphQL数据、HTML片段或前端消费的流。
- 浏览器开发者工具揭示请求契约。 记录页面操作,筛选Fetch/XHR,检查URL、方法、查询、有效载荷、响应、发起者和分页行为。
- 仅重新生成公共或授权请求。 当请求依赖于登录、私人数据、访问控制令牌或网站条款禁止的使用时,请停止。
- 将浏览器视为发现和后备层。 内部端点可以在没有通知的情况下更改,并且有些请求需要在同一浏览器会话中建立的Cookies或状态。
- 验证字段和页面身份。 成功状态不足以保证;检查预期的模式、本地化、分页游标和所需的公共记录。
许多JavaScript页面在文档加载后获取其真实内容。渲染的卡片只是浏览器网络面板中已经可见的结构化响应的一种表现。
抓取隐藏的API意味着观察那些由浏览器发起的请求,并且在数据是公共的或明确授权的情况下,重现最小的稳定请求契约。这并不意味着发现私人端点、突破身份验证或扩展页面的权限。
什么是隐藏API?
隐藏API是网站自己的前端使用的内部HTTP或WebSocket接口,而不是作为支持的公共API呈现。该端点可能是未记录的,并且可以在前端更改时随时更改。
常见的响应形状包括:
- JSON对象或数组;
- GraphQL响应封装;
- 插入页面的HTML片段;
- 换行分隔的事件流;
- 需要网站自己解码器的二进制格式。
这个短语描述了可发现性,而不是权限。浏览器中可见的请求仍然可以包含账户状态、个人数据、许可内容或合同限制。保持工作流在公共或授权的表面之内。
DOM抓取与内部JSON请求
合适的来源是返回批准字段的最小稳定契约的来源。
| 问题 | DOM提取 | 内部请求提取 |
|---|---|---|
| 数据格式 | HTML元素和属性 | 通常是结构化的JSON或GraphQL |
| 发现 | 检查渲染的页面 | 检查网络活动 |
| 设计变更的敏感性 | CSS和DOM更改 | 端点和模式更改 |
| 浏览器要求 | 客户端渲染所需 | 通常需要用于发现或会话状态 |
| 分页 | 点击、滚动、下一链接 | 页面、偏移、游标或请求有效载荷 |
| 最佳使用 | 数据仅存在于演示中 | 稳定的公共字段以结构化响应出现 |
当页面自身的呈现是权威来源或请求契约太脆弱时,请使用DOM。当它清晰地暴露所需的公共字段,并且工作流可以遵循相同的访问边界时,请使用内部响应。
第一步——在页面操作前打开开发者工具
网络面板只记录在打开时进行的请求。打开开发者工具,选择网络,启用导航时保留日志,并清除现有列表。
Chrome开发者工具网络参考 文档中记录了保留日志、请求类型过滤器、有效载荷检查、响应预览、发起者、HAR导出,以及以fetch或cURL形式复制。
现在执行一个加载数据的操作:
- 提交一个公共搜索;
- 切换一个类别;
- 加载下一结果页面;
- 展开一个公共详细面板;
- 滚动直到下一个批次出现。
一个操作创建的请求差异比先与整个页面交互要小,更易于审计。
第二步——筛选Fetch/XHR并找到带数据的响应
选择Fetch/XHR,然后检查与页面操作时间对齐的请求。搜索响应体以找到页面上可见的一个稳定的公共值,例如物品ID、确切标题或类别代码。
检查这些字段:
| 开发者工具字段 | 要捕获的内容 | 重要性 |
|---|---|---|
| 请求URL | 来源、路径和查询 | 定义路由和页面参数 |
| 方法 | GET或POST | 确定参数存放的位置 |
| 有效载荷 | 查询字符串、表单数据或JSON | 携带过滤器和游标 |
| 响应 | 顶级模式和所需字段 | 确认请求包含目标数据 |
| 发起者 | 脚本或调用堆栈 | 显示哪个页面操作创建了它 |
| 头 | 内容类型和必要的公共上下文 | 区分表现形式和地区 |
| 时间 | 开始和持续时间 | 有助于将请求与操作关联 |
不要复制每个浏览器头。只需从方法、URL、有效载荷和文档公共上下文开始。只有在经过受控测试证明请求契约需要它时,才添加一个头。
第 3 步 — 决定请求是否安全重现
可重现的请求必须保持在与页面相同的授权边界内。
当满足以下条件时,可以继续:
- 响应包含用户可以在没有账户的情况下访问的公共数据;
- 请求是明确授权的集成或测试的一部分;
- 预期的数量是相称的;
- 字段是所述数据集所需的。
当满足以下条件时,请停止:
- 响应暴露了私人或账户范围的数据;
- 重现将越过登录、付费墙或访问控制边界;
- 请求依赖于一个不属于你的机密;
- 该站点的条款或项目的批准不允许该活动。
Chrome HAR 导出指南 notes that sanitized exports omit sensitive headers such as Cookie, Set-Cookie, and Authorization. Use sanitized captures for documentation unless the approved debugging task specifically requires protected values.
第 4 步 — 复制请求,然后简化
DevTools 可以将请求复制为 cURL 或 Node.js fetch 调用。将该输出视为诊断快照,而不是生产代码。
按照以下顺序删除:
- 跟踪和浏览器生成的头部;
- 与公共表示无关的 cookies;
- 一次性关联值;
- 不改变所需结果的参数;
- 冗余的内容协商头。
每次更改后,验证响应架构和所需记录。目标是一个可以逐字段解释的最小请求合同。
浏览器的 Fetch API 将 cookies 和验证头视为凭证。MDN Fetch API 指南 解释了凭证处理如何与跨源请求交互。除非该任务明确获得授权并且存储和访问模型经过审查,否则不要在独立脚本中传递凭证。
第 5 步 — 将响应映射到稳定的架构
内部响应通常暴露比数据集所需的更多字段。定义一个狭窄的输出合同。
json
{
"source_url": "https://example.com/public-search?q=notebook",
"query": "notebook",
"page": {
"cursor": "next-public-cursor",
"has_more": true
},
"items": [
{
"id": "item-123",
"title": "Illustrative public result",
"url": "https://example.com/public/items/item-123",
"price": null
}
]
}
上述模式是一个示例。保持可空字段为可空,保留源 URL,并在响应提供稳定标识符时保留它。
当发现需要 JavaScript 和浏览器状态时,开始一个免费的 Scrapeless Scraping Browser 会话。
第 6 步 — 在扩展之前理解分页
分页通常出现在四个地方之一:
- 查询中的一个
page数字; - 一个
offset加上一个固定限制; - 响应中的一个不透明光标;
- 请求体中的 GraphQL 变量。
精确触发一个下一页操作并比较两个请求。记录哪一个值改变以及哪个响应字段提供下一个值。不要发明或解码不透明光标。
使用与合同相关的停止规则:has_more 变为 false,下一个光标缺失,结果数组为空,或达到批准的最大页面计数。以稳定的公共 ID 而不是标题文本进行去重。
第 7 步 — 当请求需要时保持会话状态
某些内部请求只有在页面建立 cookies、同意、区域设置或其他允许状态后才能工作。在这种情况下,将发现和提取保持在一个有限的浏览器会话中。
Scrapeless Scraping Browser 在云浏览器中运行 JavaScript,并在经过批准的导航中保持会话状态。使用它来观察请求并从相同的上下文中提取响应,而不是将不透明的状态导出到不相关的客户端。
Scrapeless Scraping Browser 文档 记录了有限会话的生命周期和地理路由参数。在验证请求时,保持地理、语言、cookies 和页面顺序固定。
浏览器回退:当内部 API 是错误来源时
当内部端点不稳定、账户范围、与短暂状态紧密耦合或缺少呈现相关字段时,浏览器仍然是安全的回退选择。
选择渲染的 DOM 提取,当满足以下条件时:
- 响应架构更频繁地变化而不是语义页面元素;
- 仅在客户端渲染后才能计算公共字段;
- 端点的授权模型不明确;
- 重播请求将需要复制敏感凭证;
- 页面可见表示是记录的数据集。
JavaScript 渲染指南 解释了初始 HTML、客户端渲染内容和异步请求之间的区别。
隐藏 API 抓取故障排除
| 观察 | 可能的解释 | 检查 |
|---|---|---|
| 响应为 HTML,而非 JSON | 重定向、挑战、同意或错误表示 | 最终 URL、内容类型、标题、主体标记 |
| JSON 项为空 | 错误的语言环境、缺少公共参数或分页结束 | 比较有效的浏览器请求和页面状态 |
| 字段消失 | 架构漂移或条件结果类型 | 保留可空字段并验证每个项目类型 |
| 游标重复 | 错误的游标来源或缓存请求 | 从当前接受的响应中读取下一个游标 |
| 独立请求被拒绝 | 需要浏览器会话状态 | 保持提取在授权的浏览器上下文中 |
| DOM 和 JSON 计数不同 | UI 过滤、个性化或额外响应记录 | 确定哪个表示是权威的 |
逐一更改一个变量,并保存一个经过清理的接受响应形状示例。如果请求跨越访问边界,请停止而不是调整客户端。
结论:将请求合同视为依赖项
抓取隐藏 API 可以用结构化公共数据替代脆弱的 DOM 解析,但端点是内部依赖,而不是支持的公共合同。通过一个页面操作发现它,减少复制的请求,仅映射所需字段,并记录分页和状态。
保持浏览器回退以应对架构变化和会话绑定流程。每当页面、端点或数据集范围发生变化时,重新检查授权。
准备好构建一个意识到浏览器的提取工作流程了吗?
加入 Scrapeless 社区,讨论公共数据发现和架构设计:Discord · Telegram。
查看 Scrapeless 定价,然后在 app.scrapeless.com 注册,获取免费的抓取浏览器运行时。
常见问题
问:抓取隐藏 API 合法吗?
抓取内部请求在访问公共或授权数据时可能是合法的,但法律、合同和事实各不相同,因此请查看网站条款并为项目获得法律建议。
问:隐藏 API 和公共 API 一样吗?
隐藏 API 是前端内部使用的,未承诺文档、稳定性或第三方访问,而公共 API 则在支持合同下有意公开。
问:检查隐藏 API 时需要代理吗?
本地 DevTools 检查不需要代理,但在获得的特定地点数据集或比例收集工作流程中可能需要。
问:当内部请求返回“拒绝访问”页面时,你该怎么办?
停止并检查返回的表示、授权边界和项目范围;不要将不同的标头或令牌视为权限。
问:如何处理 DOM 或架构变化?
重新运行一个已知的页面操作,比较请求和响应合同,更新可空映射,并保持为内部响应不再提供的字段准备的渲染 DOM 回退。
问:隐藏 API 抓取器应该使用多少并发?
在站点发布规则、授权和观察到的稳定性支持更高水平之前,保持每个主机三或更少工人的并发。
问:这个工作流程可以在没有 AI 代理的情况下运行吗?
是的,DevTools 发现、经过清理的请求重现、架构验证和浏览器回退是确定性的工程步骤,不需要 AI 代理。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



