重定向链会使爬虫崩溃。二进制响应在被解码为文本时会损坏。一旦您度过了“获取页面、解析 HTML”的阶段,这两个问题就会经常出现。
我们推出了两个新的 request 选项来处理这两个问题:followRedirects 和 returnBuffer。它们现在已在 API 上线。
工作原理
使用 followRedirects 进行重定向控制
大多数爬虫 API 将重定向作为布尔值处理:跟随或不跟随。这在遇到循环重定向链,或者您需要中间的 302 response 本身来提取跟踪参数之前是可行的。
FourA 的 followRedirects 接受 0 到 20 之间的整数。省略它(或设置为 0),您将获得原始的重定向 response,包括 header 等所有内容。将其设置为 5,request 将最多跟随五次跳转,然后返回最终到达的任何内容。
curl -X POST "https://eu.api.foura.ai/v1/request" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/short-link",
"followRedirects": 3,
"unblocker": true
}'
这将跟随最多三次重定向。如果重定向链在两次内结束,您将获得最终页面。如果超过三次,您将获得第三次跳转返回的内容。
这种区别比您想象的更重要。电商网站在到达商品页面之前会通过跟踪 URL 进行重定向。您会想要跟随这些重定向。但联盟网络和 URL 缩短服务有时会创建深达六、七、八次跳转的链条。而且某些重定向循环根本无法解决。限制在特定次数意味着您可以收集数据,而不会陷入耗尽 request 超时时间的无限循环中。
在此之前,解决方法是发送一个禁用重定向的 request,手动解析 Location header,然后发送另一个 request。这至少需要两次 API 调用,两倍的延迟,以及您必须维护的代码。现在只需一次调用并指定一个数字即可。
使用 returnBuffer 获取原始二进制响应
当您收集图片、PDF 或 protobuf 负载时,文本解码会破坏数据。HTTP 库会假定 response 是文本,应用字符集检测,并静默损坏每个不匹配的字节。Protobuf 变得不可读。图片 header 损坏。您最终会得到损坏的文件,并且没有明显的错误消息来解释原因。
returnBuffer 告诉 API 完全跳过文本解码。
curl -X POST "https://eu.api.foura.ai/v1/request" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/product-image.jpg",
"returnBuffer": true
}'
response body 将以原始字节形式返回(在 JSON response 中为 base64 编码)。在您端进行解码,您就能获得与服务器发送的完全一致的内容。没有字符集假设,没有编码转换,没有静默损坏。
这是我们见过的最常见的支持工单之一:用户收集商品图片或 PDF 目录,结果得到无法打开的文件。解决方法总是相同的,但现在有了一个 flag,而不需要再使用变通方法。
影响
这两个功能都减少了每个任务的 API 调用次数。followRedirects 消除了手动追踪重定向的循环。returnBuffer 消除了“获取、发现损坏、使用不同设置重新获取”的循环。
对于重定向密集的 target(联盟链接、URL 缩短服务、电商跟踪链),在早期测试中,当用户从手动重定向处理切换到 followRedirects 时,我们看到 request 数量减少了 40-60%。对于二进制收集任务(商品图片、文档下载),returnBuffer 将多步骤的变通方法简化为了单个选项(早期结果)。
这些并不是华而不实的功能。它们是那种您平时不会想到,直到您的爬虫在凌晨 3 点因为网站在结账流程中增加了一个额外的重定向跳转而崩溃时才会意识到的东西。
针对高级用户
将 followRedirects 与 response 验证结合使用,以精确控制重定向链。跟随重定向,但如果最终目的地受阻,则使 request 失败:
curl -X POST "https://eu.api.foura.ai/v1/request" \
-H "Authorization: Bearer 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"] }
}
}'
这将跟随最多五次重定向,然后检查最终的 response。如果网站将您重定向到 CAPTCHA 页面或拒绝访问页面,request 将干净利落地失败。无需在下游过滤垃圾数据。
对于二进制收集,当您需要在下载大文件之前检查内容类型时,请将 returnBuffer 与 HEAD request 结合使用。FourA 正确处理 HEAD(在内部防止常见的 libcurl 错误),因此您可以在不获取 body 的情况下检查 header。检查 Content-Type,决定是否值得下载,然后使用 returnBuffer: true 发起完整的 request。
如果您正在针对重 JavaScript 的 target 使用 浏览器任务,请注意这些选项适用于直接 HTTP 引擎。浏览器 request 通过 Chrome 内置的导航处理重定向,默认情况下会无限制地跟随它们。
下一步计划
我们正在致力于通过 API 开放更多 request 级别的控制:自定义 DNS 解析、分阶段超时调整以及证书处理选项。我们的目标是通过干净的 REST 接口提供完整的 curl-impersonate 功能,而无需基础设施开销。
如果您需要特定的选项,我们随时倾听您的反馈。仪表板已经显示了您的 request 在使用这些新选项时的表现,所以您可以亲自衡量差异。