开始试用
返回

别再抓取页面了,改为寻找 API

用你偏好的 AI 总结本文
试用我们的高级代理

无限量测试我们的优质代理,畅享卓越质量。

  • 移动代理和住宅代理
  • ZIP 级别定位
  • 静态 IP 和轮换 IP
  • 内置质量过滤器
立即试用

在费力驯服浏览器之前,先看看它已经在为您做什么。

您打开一个页面。需要的数据就在那里,明明白白地显示在屏幕上。然后您查看页面源代码,发现它几乎是空的。只有一副 div 骨架。没有价格。没有列表。没有任何可以解析的内容。

页面下方某处有一个“加载更多”按钮,或者是无限滚动,又或者是一个在页面加载后稍等片刻才填充内容的加载动画。您的第一反应是 Selenium。或者 Playwright。启动浏览器,等待元素出现,点击按钮,抓取渲染后的 DOM。

这种直觉通常是错的。

在编写任何一行浏览器自动化代码之前,先看看您的浏览器已经在做什么。它一定是从某个地方获取数据的,别无他法。那个“空白”页面之所以能填满商品,是因为 JavaScript 调用了后端,并把响应渲染成了屏幕上的像素。

找到那个请求。复制它。自己运行一遍。

整个技巧就是这么简单。它只需几分钟,却能为您省下数小时与无头浏览器、等待条件以及每次改版都会失效的选择器缠斗的时间。

我们来找找看。

用可靠的代理加速数据采集。$3.50 起试用 NodeMaven,获得 750MB 流量

立即试用

您的浏览器已经在和数据源对话

现代网站大多是架在 API 之上的界面。首次加载时拿到的 HTML 往往只是一个空壳。真正的内容要等页面向后端发出请求并拿回 JSON 响应后才会出现。JavaScript 接过这个响应,再把它绘制到屏幕上。

您可以把它称作“隐藏 API”。 这是一个实用性的称呼,而不是技术上的定义。它通常并不是什么秘密。

它只是前端用来获取自身数据的内部端点,而当初没有人在构建它时会预料到爬虫会直接看到它。正因如此,它往往比 HTML 要诚实得多。

这对您为什么重要:

  • HTML 是为渲染而生的,而不是为解析而生。它充斥着布局噪音、广告位,以及每次改版都会变动的标记。
  • 浏览器自动化成本高昂。每个无头浏览器实例都会吞噬内存和 CPU。乘以成千上万个页面,开销很快就会累积起来。
  • API 响应通常已经是结构化的。商品、价格、ID 和图片都以干净的字段形式返回,而不是深埋在三层 div 之下。
  • 分页问题往往已经解决。为“加载更多”按钮提供数据的端点通常接受页码或游标参数。您不需要去点击那个按钮,只需调用按钮所调用的接口即可。
  • 筛选和排序通常也只是参数而已。 分类、排序方式和搜索词通常会直接出现在请求 URL 中。

跳过渲染,直接与数据源对话。

找到请求,而不是与页面较劲

这里主要靠 Chrome DevTools 来完成。Firefox 的 Network 面板用法也一样。

  1. 打开目标页面。
  2. 打开 DevTools(按 F12,或右键选择“检查”)。
  3. 切换到 Network 标签页。
  4. 按 Fetch 或 XHR 筛选。这样可以隐藏图片、字体和 CSS,只留下真正重要的流量。
  5. 重新加载页面。
  6. 触发任何会加载您所需数据的操作。
  7. 观察请求逐一出现。
  8. 逐个点击这些请求,查看 Response 标签页。

值得触发的操作:

  • 点击“加载更多”
  • 滚动页面触发无限加载
  • 在搜索框中输入内容
  • 应用筛选条件
  • 更改排序方式
  • 翻页浏览结果
  • 选择商品规格

您需要在响应中寻找的内容:

  • 返回 JSON,而不是 HTML
  • 一个条目数组(商品、房源列表、帖子,或页面展示的任何内容)
  • 分页字段,例如 page、totalPages 或 hasNext
  • 与屏幕上可见内容一一对应的 ID
  • URL 中看起来用于控制查询的参数

您首先要在大量噪音中逐个点击筛查:分析统计请求、广告跟踪器、会话心跳。全部忽略即可。您要找的是真正为页面提供数据的那一两个请求。

如何判断您找到的是正确的端点

并非每个 200 OK 都有用。在动手构建任何东西之前,先逐项核对以下几点:

  • 响应正文中包含您真正需要的记录
  • 在页面上更改筛选条件、页码或搜索词时,请求也会随之变化
  • 数据是结构化的,而不是一大片 HTML
  • 该端点接受您可以控制的参数
  • 您可以在浏览器之外发送同样的请求,并得到相同的结果

绿色的状态码只代表服务器给出了响应。然而,有些端点返回的是部分数据、空占位符,或仅供某个小部件使用的 HTML 片段。有些则返回 GraphQL 而不是普通数组。在围绕某个端点构建爬虫之前,每次都要检查实际返回的内容。

复制请求并进行测试

发现了有希望的请求?在 DevTools 中右键点击该请求,选择 Copy as cURL。

将其粘贴到:

  • Postman
  • Insomnia
  • 一个使用 requests 库

复制下来的请求为您提供了重现它所需的一切:

  • The URL
  • HTTP 方法
  • 查询参数
  • 请求体(如果是 POST 请求)
  • 请求头
  • Cookie
  • 浏览器携带的任何会话或身份验证状态

重要提示! 请只复现您有权访问的请求,并遵守目标网站的服务条款。

将请求粘贴到您选用的工具中,点击发送,然后检查是否得到与 DevTools 中看到的相同响应。如果一致,您就获得了一个可用、可脚本化的数据源。

需要为您的爬虫配备可靠的代理?从 $3.50 起使用 NodeMaven,即可获得 750MB 流量进行测试

立即试用

找出真正起作用的参数

真正的省时之处就在这里。

查看您找到的请求的查询字符串:

值得测试的常见参数:

  • 页面 或 offset:返回哪一段结果
  • 限制 或 page_size:每次请求返回多少条结果
  • cursor:用分页令牌代替页码
  • 查询 或 q:搜索关键词
  • 类别 或 筛选:缩小结果集范围
  • sort:改变结果排序

现在稍微试探一下它们的极限。

如果网站前端始终只显示每页 20 条内容,不妨尝试请求 50 或 100 条。有时后端会接受这样的请求。仅这一处改动 就能减少您的总请求数,这意味着触发速率限制的几率更低,爬虫整体运行速度也更快。

如果端点暴露了游标(cursor),您可以 直接串联请求 ,而无需猜测页数。如果筛选条件只是参数,您就可以精确请求所需的那部分数据,而不必先全部拉取再在客户端筛选。

不要以为这种方法总是奏效。 服务器通常会限制页面大小。有些会忽略无法识别的参数。有些则会在您超出内部限制的那一刻直接报错。每一次参数改动都要经过测试。

从一个请求到一个真正的爬虫

一旦确认了端点及其参数,把它变成一个可用的爬虫基本上只是搭建管道的工作。

就这么简单。 只需一个循环、一次请求,以及一个可以直接解析的 JSON 响应。

添加错误处理,遵守速率限制,并按您的需要存储结果:CSV、数据库,或者任何您的数据管道所期望的位置。核心循环很少需要比这更复杂。

当这条捷径行不通时

直接调用 API 并非万能。它们也会失败,最好提前了解失败的原因。

这种捷径通常在以下情况下失效:

  • 该端点 需要身份验证 ,而您无法合理地复现
  • 它依赖于会话 很快就会过期的 cookie
  • 令牌会动态轮换,并且 需要重新生成
  • 该端点 要求浏览器生成的状态,例如指纹或签名请求
  • 速率限制非常严格
  • An 反机器人系统 部署在端点前面
  • 该 端点经常变动,因为它本来就不是一个稳定的公开 API
  • 数据确实只 在客户端 JavaScript 运行之后才存在,背后没有对应的请求

当您撞上其中任何一堵墙时,浏览器自动化就真正派上用场了。 Playwright 或 Selenium 当浏览器本身必须成为工作流的一部分,而不只是一个您试图绕开的渲染引擎时,才有意义。

代理在 API 采集中的作用

一旦您的爬虫直接请求某个端点,发送的请求量往往远超人工逐页点击所能达到的水平。这正是采用这种方式的意义所在,但也正是基于 IP 的速率限制和封锁开始产生影响的地方。

此外,代理配置取决于具体的工作流程。跨数千个请求拉取分页结果通常需要 轮换住宅代理,将流量分散到不同的 IP 上。

围绕登录或持久会话构建的工作流程则更适合使用 粘性会话 ,在一段时间内保持同一个 IP。

需要在数小时内保持单一稳定身份的长时间运行任务,通常更适合搭配 静态 ISP 代理.

NodeMaven 运营着覆盖 190 多个国家/地区、拥有 3000 万+ IP 的住宅代理池,支持轮换与粘性会话(最长 24 小时)、HTTP(S) 和 SOCKS5 协议,以及城市或 ZIP 级别的定向。

移动代理和 ISP 代理则覆盖需要不同 IP 画像的工作流程。所有这些都能与 Python 的 requests 库无缝配合,因此将代理接入上述循环只需简单修改一下配置即可。

隐藏 API 还是浏览器爬取?

方法最适合主要优势主要缺点
直接 API 请求前端调用 JSON 端点的网站速度快、数据干净、资源开销低端点可能在不另行通知的情况下变更,可能需要处理身份验证
Playwright重度依赖 JS 的网站,以及需要真实浏览器行为的工作流程可处理渲染、点击以及复杂流程比原始请求更慢、更消耗资源
Selenium成熟的自动化流水线、传统工具链生态成熟,浏览器支持广泛通常比 Playwright 慢,配置开销更大

使用能够为您提供所需数据的最简单层级。

用可靠的代理为您的数据采集提供动力。从 $3.50 起、含 750MB 流量,即刻开始使用 NodeMaven

立即试用

30 秒检查清单

在启动 Selenium 或 Playwright 之前:

  • 打开 Network 标签页
  • 按 Fetch/XHR 筛选
  • 重新加载页面
  • 触发动态内容(滚动、点击、筛选、搜索)
  • 检查 JSON 响应
  • 找到分页或筛选参数
  • 将请求复制为 cURL
  • 在浏览器之外测试它
  • 用循环将其自动化
  • 如果工作流需要扩大规模,请添加代理

您看到的网站并不是数据真正所在的地方

您正在查看的页面很少是数据的真正来源。在它背后的某个地方,一个请求发出、一个响应返回,屏幕上的一切都是由这次交换构建出来的。

在动用浏览器之前,先找到那个请求。大多数时候,这只是五分钟的绕行,却能为您省去数小时的 Selenium 等待、脆弱的选择器和缓慢的页面渲染。

一旦您的爬虫直接与 API 对话,下一个问题就是规模。NodeMaven 为您提供住宅、移动和 ISP IP,让这些请求持续运行而不会触发速率限制。 以 $3.50 试用 ,看看一个干净、直连 API 的爬虫能带您走多远。

准备好扩展您的爬虫了吗?从 $3.50 起试用 NodeMaven,获得 750MB 流量,即刻开始

立即试用

常见问题

隐藏 API 是网站用于为其前端加载数据的内部 API 端点。它可能没有公开文档,但您通常可以在浏览器的 Network(网络)标签页中看到这些请求。

打开 Chrome DevTools,进入 Network 面板,并按 Fetch/XHR 筛选请求。重新加载页面,并与会加载新数据的元素进行交互。寻找返回有用 JSON 或其他结构化数据的请求。

可能是。直接发送 API 请求通常比解析渲染后的 HTML 更快,占用的资源也更少。不过,端点可能会变化、需要身份验证,或者有自己的访问限制。

可以。如果数据可以通过可访问的 API 端点获取,您通常可以使用 Python 的 requests 库等工具直接发送 HTTP 请求。

首先在 DevTools 中定位该 API 请求。然后在 Python 中复现其 URL、参数和所需的请求细节。解析 JSON 响应,并在需要时自动处理分页。

该端点可能需要身份验证、Cookie、特定请求头或有效的会话。它也可能设有访问控制或反机器人措施。请检查浏览器中的原始请求,了解服务器期望收到什么。

不是。内部端点可能会在没有通知的情况下发生变化。随着网站更新,参数、响应格式、URL 和身份验证要求都可能改变。在构建爬虫时,请确保这些变化易于检测和处理。

您可能还喜欢 这些文章

本网站使用 Cookie 文件 来提升您的使用体验。继续访问即表示您同意我们使用 Cookie。