全部文章

推出 Auto:适用任意目标的统一 endpoint

Auto endpoint 会为每个 request 选择 Single、Proxy Finder 或 Browser,处理反爬虫挑战,并返回可供下次调用复用的 session。

最新动态

/api/auto endpoint 现在是获取任何 URL 有效 response 的最短路径。将其指向目标。Auto 会选择通过 Single, Proxy Finder 或 Browser 运行 request,在遇到反爬虫挑战时进行处理,并返回一个可供下次调用重用的会话。

单一 endpoint。任何目标。无需您手动切换模式。

这就是核心理念。本文余下部分将介绍其工作原理、使用成本以及需要注意的细节。

工作原理

Auto 底层设有一系列阶梯规则(按成本从低到高排列)。在每次 request 中,Auto 会逐级尝试,直到某一级返回符合您 validate 规则的 response。

阶梯顺序如下:

  1. 缓存会话 (Cached session)。 如果 Auto 拥有该主机之前调用的预热会话,它会首先通过该会话重放。这是成本最低的路径。
  2. Proxy Finder。 轮换 proxy request。适用于主要依靠 IP 信誉进行防护的网站。
  3. Browser。 执行 JavaScript 的完整渲染,解决反爬虫挑战,并收集网站下发的 cookie。

一旦某一级成功,Auto 会存储它找到的会话:所使用的 proxy id,网站下发的 cookie,以及 User-Agent。在下次调用同一主机时,Auto 会首先尝试该会话。如果它依然有效,您只需支付低成本层级的费用,而非高成本层级。

最小化调用示例:

curl -X POST "https://api.foura.ai/api/auto" \
  -H "Authorization: Bearer pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/data",
    "validate": { "status": { "accept": [200] } }
  }'

精简后的 response:

{
  "status": 200,
  "data": "...",
  "headers": [...],
  "meta": {
    "rung": "cache",
    "solved": false,
    "attempts": 1,
    "credits": 2
  },
  "session": {
    "proxy": "CLN1B8",
    "cookies": [{ "name": "cf_clearance", "value": "..." }],
    "userAgent": "..."
  }
}

接下来你需要关注两个字段。meta.rung 告诉你哪条路径胜出。session 是一个三元组,你可以将其带入 /api/single 调用,以自行重放相同的出口。proxy 字段是一个不透明的 base36 ID(无原始 IP),可安全记录并在系统间安全传递。

影响

这里有两个关键数字。

对受保护站点的首次调用会运行 Browser 阶段:渲染、求解、收集 cookie 并返回页面。这大约消耗 10 个 credit。一旦 Auto 缓存了该主机的有效会话,后续调用将通过 Single 运行,消耗 2 个 credit。因此,第二次调用比首次调用便宜 5 倍,且只要会话有效,之后的每次调用都会保持低费率。我们在上线期间于生产环境中进行了测量:无 cookie 的出口(一旦找到)重放时每次调用准确消耗 2 个 credit,而以往当每个请求都经过 Proxy Finder 时需要 10 个 credit。

第二个数字是:失败的阶段不收费。如果 Auto 尝试了三个代理并在第四个代理成功返回前都返回 403,则仅计算第四个代理的 credit。你只需为交付的内容付费,而非为搜索付费。

这就是核心价值。昂贵的阶段只运行一次,便宜的阶段会持续运行,而你无需自己编写缓存逻辑。

还有两种行为值得注意,因为它们解决了实际的生产难题:

地理围栏目标不再浪费出口。 当站点对大多数出口返回 451(或法律封锁插页)时,Auto 会学习哪些国家实际交付了内容。在下一次调用时,它会优先从这些国家获取新出口,并将并发负载分摊到这些出口上。因此,单个幸运的出口不会被过度使用并受到速率限制。

验证在每个阶段运行。 内容错误的页面(返回状态 200 且正文为法律声明的地理封锁)绝不会被视为成功。如果你的 validate.data.fail 显示"legal reasons",Auto 会继续尝试直到某个阶段通过验证。缓存的阶段不行。任何阶段都不行。如果没有任何阶段通过,你会得到一个诚实的失败结果和真实原因。

针对高级用户

当你通过 Auto 推送大量请求时,以下几个设置非常重要。

timeout_ms 是整个操作的预算,而不是每个阶段的预算。默认值为 120 秒。Auto 会对其进行分配:每个子调用获得 min(自然超时时间, 剩余预算),一旦剩余时间过少,系统就会停止启动新阶段。对于交互式延迟工作,请设置为 20000。对于允许较长尾部延迟的批量爬取,请保留默认值。

forceProxy 默认开启。除非你设置了 forceProxy: false,否则 Auto 从不使用 FourA 的源 IP 接触目标。注意一点:某些站点(带有 IP 信任门控的交互式 Cloudflare)从干净的数据中心 IP 访问实际上比从低信任的住宅出口访问效果更好。因此,forceProxy: false 会让某些目标变得更容易,而不是更难。如果你在特定主机上遇到重复的挑战,值得尝试将其关闭。

ignoreProxies 是客户端的避免列表。传递你已知失效的 proxy ID (来自之前在你一侧触发 rate limit 的 session.proxy),Auto 将在所有环节跳过它们:热 session 复用,出口搜索,以及对 Proxy Finder 的子调用。因此 Auto 不会重新选择你刚指定要避免的出口。

meta 还允许你在其上构建自己的仪表板:今天哪些 host 触发了浏览器层,每次交付的平均尝试次数,已解决 challenge 的 request 与干净 request 的比例。如果特定 host 突然从 2 个 credit 攀升到 10 个,这就是一个 session 衰减信号,你可以在账单飙升前采取行动。

结合这四者的示例如下:

import requests

r = requests.post(
    "https://api.foura.ai/api/auto",
    headers={"Authorization": "Bearer pk_live_..."},
    json={
        "url": "https://example.com/product/9876",
        "timeout_ms": 30000,
        "forceProxy": True,
        "ignoreProxies": ["CLN1B8", "K7X9AB"],
        "validate": {
            "status": {"accept": [200]},
            "data":   {"accept": ['"price":'], "fail": ["captcha", "legal reasons"]}
        }
    }
).json()

# If Auto delivered, keep the session for the next call to this host
if r.get("status") == 200 and "session" in r:
    session = r["session"]                              # {proxy, cookies, userAgent}
    print(r["meta"]["rung"], r["meta"]["credits"], r["meta"]["attempts"])

关于 validate 模式本身,请参阅之前的演练:Validate Rules Now Decide What Counts as Success

下一步

Auto 目前的路线图上有两项计划。

接下来会在 Dashboard 中推出会话检查功能。目前,Auto 为每个主机保留的会话位于服务内部,当您在本地调试消耗时无法查看。我们正在开发按主机的会话视图,以便您查看缓存的会话、它们的时长、生命周期以及每个会话背后的层级历史。此外,还会提供一个按钮,当目标发生变化且您知道缓存错误时,可以手动丢弃会话。

在此之后,将实施更严格的成本控制。每个请求的硬性信用额度上限 (在此次调用上的花费绝不超过 X,如果超出则直接失败),以及为目标从不需要浏览器层级的团队提供“single-only”模式。这两个功能目前都处于特性标志(flag)之后。

Auto 的意义在于您无需考虑调用哪个产品。但这并不意味着您无法检查具体情况。每个响应都会附带其采用的层级和建立的会话。读取这两个字段,您就会确切知道调用成本的来源。