重定向链会导致爬虫崩溃。二进制 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 性能表现,你可以自行评估效果差异。