← 全部文章

重定向控制与原始 Buffer 模式

FourA 的 API 现支持可配置的重定向限制和原始二进制响应。这两个选项改变了处理实际抓取边缘情况的方式。

重定向链会导致爬虫崩溃。二进制 response 被按文本解码时会发生损坏。一旦越过“获取页面、解析 HTML”的初级阶段,这两个问题就会频繁出现。

我们发布了两个全新的 request 选项来分别处理这些问题:followRedirects 和 returnBuffer。它们现已在 API 上线。

工作原理

使用 followRedirects 控制重定向

大多数抓取 API 将重定向作为布尔值处理:跟随或不跟随。这在遇到死循环重定向链,或者需要中间的 302 response 本身来提取追踪参数时就会失效。

FourA 的 followRedirects 接受 0 到 20 之间的整数。缺省(或设置为 0)时,将返回包含完整 header 的原始重定向 response。设置为 5 时,request 最多跟随 5 次跳转,并返回最终落点的结果。

curl -X POST "https://eu.api.foura.ai/v1/request" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/short-link",
    "followRedirects": 3,
    "unblocker": true
  }'

这最多会跟随三次重定向。如果链路在两次重定向内解析完毕,你将获得最终页面。如果超过三次,你将获取第三次跳转返回的内容。

两者的区别比想象中更重要。电商网站在进入商品页面前通常会经过追踪 URL 进行重定向。你需要跟随这些跳转。但联盟网络和短链服务有时会产生多达六、七甚至八次跳转的深层链路。而且某些重定向循环永远无法解析。限制具体的跳转次数意味着你在采集数据的同时,不会陷入耗尽 request 超时的无限循环。

在此之前,变通方案是发送禁用重定向的 request,手动解析 Location header,然后再发送另一个 request。这至少需要两次 API 调用、双倍的延迟以及额外维护的代码。现在只需一次调用并指定一个数字即可。

使用 returnBuffer 获取原始二进制 Response

在采集图片、PDF 或 protobuf payload 时,文本解码会破坏数据。HTTP 库会假定 response 是文本,应用字符集检测,并静默损坏所有不符合规则的字节。Protobuf 变得不可读。图片 header 损坏。最终会产生损坏的文件,且没有任何明确的错误信息来解释原因。

returnBuffer 指示 API 完全跳过文本解码。

curl -X POST "https://eu.api.foura.ai/v1/request" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product-image.jpg",
    "returnBuffer": true
  }'

响应体以原始字节形式返回(在 JSON 响应中进行 base64 编码)。在客户端进行解码后,即可获得与服务器完全一致的内容。没有字符集假设,没有编码转换,也没有隐性损坏。

这是我们最常收到的技术支持工单之一:用户采集商品图片或 PDF 文档,结果得到无法打开的文件。解决方法一直都相同,但现在可以直接使用参数标记,无需再编写变通方案。

实际影响

两项功能都减少了每个任务的 API 调用次数。followRedirects 消除了手动跟踪重定向的循环。returnBuffer 消除了“抓取、发现文件损坏、修改设置重新抓取”的反复过程。

针对包含大量重定向的目标(联盟链接、短链接、电商追踪链路),在早期测试中,当用户从手动处理重定向切换至 followRedirects 时,请求数量降低了 40-60%。对于二进制采集任务(商品图片、文档下载),returnBuffer 将多步处理方案简化为一个配置项(早期测试结果)。

这些算不上抓人眼球的功能。但如果某个网站在结账流程中增加了一个重定向跳数,导致爬虫在凌晨三点崩溃时,你就会意识到这些功能的价值。

高阶用法

将 followRedirects 与响应验证结合使用,可以精确控制重定向链路。在跟随重定向的同时,如果最终目标发生错误,则直接将请求判定为失败:

curl -X POST "https://eu.api.foura.ai/v1/request" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product/12345",
    "followRedirects": 5,
    "unblocker": true,
    "validate": {
      "status": { "fail": [403, 503] },
      "data": { "fail": ["Access Denied", "captcha"] }
    }
  }'

这最多跟随 5 次重定向,随后检查最终 response。如果目标站点将你重定向至验证页面或拒绝访问拦截页,request 会直接失败。下游无需再过滤无效数据。

对于二进制数据采集,若需在下载大文件前确认内容类型,可将 returnBuffer 与 HEAD request 配合使用。FourA 正确支持 HEAD 方法,因此你可以在不获取 body 的情况下直接检查 header。确认 Content-Type 并评估是否需要下载后,再使用 returnBuffer: true 发起完整 request。

另外,若你正使用 browser tasks 处理重度依赖 JavaScript 的目标,请注意这些选项仅适用于直接 HTTP 引擎。Browser request 则通过浏览器内置的导航机制处理重定向,默认会自动跟随且无上限限制。

后续规划

我们正在推进通过 API 开放更多 request 级别的控制能力:自定义 DNS 解析、分阶段超时调优以及证书处理选项。目标是通过简洁的 REST 接口提供完整的浏览器配置控制,同时省去维护底层基础设施的开销。

如果你需要特定配置选项,欢迎反馈。dashboard 已支持展示使用这些新选项时的 request 性能表现,你可以自行评估效果差异。