浏览器使用代理配置:每个会话的出口IP

搜索浏览器使用代理,Google会给你Chrome的设置对话框。这是另一件事:通过经过身份验证的住宅IP路由浏览器使用AI代理库,每个代理一个IP。

搜索浏览器使用代理,Google会给你Chrome的设置对话框,chrome.proxy扩展API和企业PAC文件教程。这些都不是你想要的。你想要的是通过经过身份验证的代理路由browser-use - 这个拥有108k GitHub星标的Python库,让LLM驱动真实浏览器 - 这样你的代理不会从办公室IP攻击目标。这就是指南:参数实际所在的位置,为什么在升级后会默默停止工作,如何为每个并行代理提供自己的出口IP,以及当IP在任务中移动时会发生什么。

浏览器使用代理参数的实际位置

代理是浏览器会话的属性,而不是代理的属性。在当前库中,BrowserBrowserSession的别名 - 文档明确指出它们是完全相同的类 - 因此你找到的任何使用一个名称的教程都适用于另一个。参数是proxy,文档将其类型化为具有四个字段的ProxySettingsserverbypassusernamepassword。一个等效的字典也可以使用,这是大多数人传递的:

import asyncio
from browser_use import Agent, Browser
# llm = ...  your model of choice; see the browser-use docs for the import

PROXY = {
    "server": "http://gate.quantumproxies.io:8000",  # scheme is mandatory
    "username": "USER",
    "password": "PASS",
    "bypass": "localhost,127.0.0.1",                  # keep local calls off the proxy
}

browser = Browser(proxy=PROXY, headless=False)

async def main():
    agent = Agent(
        task="Open https://api.ipify.org?format=json and report the IP you see",
        llm=llm,
        browser_session=browser,
    )
    await agent.run()

asyncio.run(main())

人们常犯的两个错误。首先,凭证属于usernamepassword字段,而不是塞入server中 - Chromium不会响应来自URL嵌入密码的代理身份验证挑战,browser-use没有输入对话框。其次,server需要一个方案。gate.quantumproxies.io:8000不是代理URL;http://gate.quantumproxies.io:8000才是。如果凭证给你带来了麻烦,将你的服务器IP列入白名单可以完全消除用户:密码的因素 - 网关识别呼叫者,浏览器从未看到407。

为什么你的浏览器使用代理配置默默无效

在这个主题上访问最多的页面是GitHub问题#2445,提交于2025年7月:一个在0.1.45版本中工作的代理在0.5.4版本中停止生效,唯一的线索是代理在其自己的摘要中愉快地报告DNS_PROBE_FINISHED_NXDOMAIN。这种失败模式 - 代理将网络错误叙述为网站的事实 - 是一个半配置代理的标志。在你消耗更多令牌之前,先完成这个列表:

import requests

PROXY_URL = "http://USER:PASS@gate.quantumproxies.io:8000"
r = requests.get(
    "https://api.ipify.org?format=json",
    proxies={"http": PROXY_URL, "https": PROXY_URL},
    timeout=20,
)
print(r.status_code, r.text)   # must NOT be your own IP

如果打印出一个外国IP,凭证和网关是正常的,问题在于会话连接。如果打印出你自己的地址或407,首先修复它。我们的免费IP检查器告诉你出口从另一侧看起来如何 - ASN、类型和声誉 - 这是当页面加载但每个页面都是CAPTCHA时要检查的第二件事。

检查表匹配浏览器使用代理症状(DNS错误、真实IP泄漏、在旧版本上工作的配置)与要检查的修复
配置通常看起来是正确的。失败几乎总是代理实际接收到的会话、缺少的方案或全局环境变量。

每个会话一个代理,这样并行代理不会共享出口IP

这就是参数位于会话而不是全局配置上的全部原因。通过一个共享的Browser运行十个代理,目标会看到来自一个地址的十倍流量,这是烧掉住宅IP的最快方式。在协程内构建会话,并给每个会话一个自己的粘性会话标识符,以便网关在任务的生命周期内将其固定到一个出口:

import asyncio, secrets
from browser_use import Agent, Browser

def session_proxy(sid: str, country: str = "us"):
    return {
        "server": "http://gate.quantumproxies.io:8000",
        "username": f"USER-country-{country}-session-{sid}",
        "password": "PASS",
    }

async def run_task(task: str, country: str):
    sid = secrets.token_hex(3)                  # e.g. a1b2c3
    browser = Browser(
        proxy=session_proxy(sid, country),
        user_data_dir=None,                     # incognito: no shared cookies
        allowed_domains=["*.example.com"],      # keep the agent on target
    )
    agent = Agent(task=task, llm=llm, browser_session=browser)
    return await agent.run()

async def main():
    await asyncio.gather(
        run_task("Find the price of SKU-1", "us"),
        run_task("Find the price of SKU-1", "de"),
        run_task("Find the price of SKU-1", "gb"),
    )

asyncio.run(main())

三个标志在那里真正发挥作用。user_data_dir=None以隐身模式运行,因此代理不能继承彼此的cookie并悄悄地将两个身份合并到一个配置文件中。allowed_domains将导航限制为模式列表 - 请注意,TLD位置的通配符,如example.*,是故意被拒绝的,超过一百个条目的列表被优化为集合,模式匹配被关闭。用户名中的会话标识符使出口IP稳定;国家和会话的确切标志名称位于你的仪表板中,但形状在任何地方都是相同的。

选择每个任务的出口国家

从错误的国家浏览的代理在购物、比价或检查可用性时默认是错误的。因为代理是按会话的,国家是每个任务的参数 - 将country-us换成country-de,同一任务返回德国价格。从池中选择200多个国家,并保持浏览器与之匹配:通过args传递匹配的语言(Chromium接受--lang=de-DE),而不是让德国出口IP请求美国英语页面。对于仅限移动的界面和最高信任的出口,移动IP的行为再次不同,因为运营商NAT将数千个真实用户置于同一地址之后。

给每个代理一个自己的住宅出口IP

流程显示任务队列扩展到每个代理一个浏览器使用会话,每个都有自己的粘性代理会话,因此目标站点看到不同的住宅IP
在任务内部构建会话,而不是在外部。每个代理一个Browser,每个Browser一个粘性会话,每个身份一个IP。

当IP在任务中旋转时会发生什么

代理的速度比抓取器慢。在每个动作后的默认0.5秒暂停之间,0.25秒的最小页面状态等待和0.5秒的网络空闲等待之间,browser-use在模型说出任何话之前每步花费超过一秒 - 而模型的往返通常需要几秒钟以上。因此,一个十五步的任务运行一到两分钟的挂钟时间。如果你的出口IP在每个请求中旋转,站点将在这些步骤中的每一个上看到不同的地址:登录丢失,购物车清空,代理报告结账按钮消失。

解决方法是一个粘性会话,其窗口舒适地超过你的最坏情况任务持续时间,而不是你的平均值。计时几个真实运行,取最慢的,并增加余量 - 代理会重试,重试会将时钟加倍。当一个任务真正需要超过任何粘性窗口时,将其分片:登录并导出状态,然后在一个新的会话中恢复,使用你通过storage_state保存的cookie。如果你在选择每个请求旋转和粘性之间,我们的AI代理基础设施检查表涵盖了围绕这个决策的其余层。

保持代理不用于你的LLM调用

这一个花费真金白银,几乎没有人注意到。将HTTPS_PROXY设置为环境变量以使代理“应用于所有地方”也会将每个模型API调用通过你的住宅网关路由 - 每一步的提示和响应,按千兆字节计费以获得绕远路的特权。仅在Browser上配置代理,并保持进程环境不变。在你计算字节时,请注意browser-use默认通过enable_default_extensions加载uBlock Origin:保持开启,因为它杀死的每个广告请求都是你不需要支付的。完整的算术在我们关于AI代理带宽成本的细分中,而经典抓取版本的权衡在无头浏览器与HTTP请求成本中。

常见问题

如何在browser-use中设置代理?

在构建Browser(也导出为BrowserSession)时传递proxy=,然后将该对象交给Agent。该值携带带有显式http://方案的server,加上usernamepassword和一个可选的bypass列表。没有代理级别的代理设置 - 它属于会话。

为什么我的browser-use代理配置不起作用?

按可能性顺序:代理在一个与你配置的会话不同的会话上运行,server缺少其方案,你设置了cdp_url,因此浏览器在没有代理标志的情况下在其他地方启动,或者全局代理环境变量正在覆盖你。首先用普通HTTP客户端验证代理 - 代理日志中的DNS错误通常意味着没有附加代理。

每个browser-use代理可以使用不同的IP吗?

可以,而且你应该这样做。在每个任务协程中创建Browser,使用自己的代理凭证,而不是共享一个实例。将唯一的会话标识符添加到网关用户名中,将每个代理固定到其运行期间的不同出口,因此十个并行代理看起来像十个用户,而不是一个非常忙碌的用户。

哪种代理类型最适合browser-use代理?

用于研究和价格检查的旋转住宅代理,其中每个任务都是独立的,粘性住宅代理用于任何有登录或购物车的情况,而移动代理用于目标具有敌意或仅限移动的情况。数据中心IP适用于内部目标和未受保护的页面,它们每千兆字节的成本要低得多 - 这很重要,因为浏览器代理移动大量千兆字节。

代理是否能阻止browser-use被检测到?

不能。代理仅修复IP层;自动化Chromium的指纹是一个单独的问题,代理以毫秒精度点击的行为也是如此。可信的住宅出口去除了最简单的信号,但如果目标运行严肃的机器人管理,应该与一个隐身导向的浏览器构建配对。

这里没有什么是奇特的:代理是会话属性,破坏它的两件事是缺少的方案和你从未交付的会话。做好这些,给每个并行代理一个自己的粘性出口,并保持网关远离你的模型API调用。欲了解更广泛的图景,请参阅我们的反检测框架和身份验证代理地图

在200多个国家运行超过9000万个住宅IP的browser-use