浏览器使用代理配置:每个会话的出口IP
搜索浏览器使用代理,Google会给你Chrome的设置对话框。这是另一件事:通过经过身份验证的住宅IP路由浏览器使用AI代理库,每个代理一个IP。
搜索浏览器使用代理,Google会给你Chrome的设置对话框,chrome.proxy扩展API和企业PAC文件教程。这些都不是你想要的。你想要的是通过经过身份验证的代理路由browser-use - 这个拥有108k GitHub星标的Python库,让LLM驱动真实浏览器 - 这样你的代理不会从办公室IP攻击目标。这就是指南:参数实际所在的位置,为什么在升级后会默默停止工作,如何为每个并行代理提供自己的出口IP,以及当IP在任务中移动时会发生什么。
浏览器使用代理参数的实际位置
代理是浏览器会话的属性,而不是代理的属性。在当前库中,Browser是BrowserSession的别名 - 文档明确指出它们是完全相同的类 - 因此你找到的任何使用一个名称的教程都适用于另一个。参数是proxy,文档将其类型化为具有四个字段的ProxySettings:server,bypass,username和password。一个等效的字典也可以使用,这是大多数人传递的:
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())
人们常犯的两个错误。首先,凭证属于username和password字段,而不是塞入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。这种失败模式 - 代理将网络错误叙述为网站的事实 - 是一个半配置代理的标志。在你消耗更多令牌之前,先完成这个列表:
- 你将
proxy=传递给了代理从未接收到的会话。创建一个Browser,传递那个确切的对象,并且不要让一个默认会话在你不知情的情况下被创建。 - 你设置了
cdp_url。连接到一个已经运行的Chrome意味着代理属于该浏览器的启动标志(--proxy-server=...),而不是你的会话配置 - browser-use无法重新配置它。 - 全局
HTTP_PROXY或HTTPS_PROXY环境变量正在与会话设置抗衡,或者更糟的是,悄悄地将你的LLM API调用通过计量带宽路由。 - 代理本身已死。首先在代理之外测试它 - 这不花钱,并排除了一半的搜索空间。
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时要检查的第二件事。

每个会话一个代理,这样并行代理不会共享出口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在任务中旋转时会发生什么
代理的速度比抓取器慢。在每个动作后的默认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,加上username,password和一个可选的bypass列表。没有代理级别的代理设置 - 它属于会话。
为什么我的browser-use代理配置不起作用?
按可能性顺序:代理在一个与你配置的会话不同的会话上运行,server缺少其方案,你设置了cdp_url,因此浏览器在没有代理标志的情况下在其他地方启动,或者全局代理环境变量正在覆盖你。首先用普通HTTP客户端验证代理 - 代理日志中的DNS错误通常意味着没有附加代理。
每个browser-use代理可以使用不同的IP吗?
可以,而且你应该这样做。在每个任务协程中创建Browser,使用自己的代理凭证,而不是共享一个实例。将唯一的会话标识符添加到网关用户名中,将每个代理固定到其运行期间的不同出口,因此十个并行代理看起来像十个用户,而不是一个非常忙碌的用户。
哪种代理类型最适合browser-use代理?
用于研究和价格检查的旋转住宅代理,其中每个任务都是独立的,粘性住宅代理用于任何有登录或购物车的情况,而移动代理用于目标具有敌意或仅限移动的情况。数据中心IP适用于内部目标和未受保护的页面,它们每千兆字节的成本要低得多 - 这很重要,因为浏览器代理移动大量千兆字节。
代理是否能阻止browser-use被检测到?
不能。代理仅修复IP层;自动化Chromium的指纹是一个单独的问题,代理以毫秒精度点击的行为也是如此。可信的住宅出口去除了最简单的信号,但如果目标运行严肃的机器人管理,应该与一个隐身导向的浏览器构建配对。
这里没有什么是奇特的:代理是会话属性,破坏它的两件事是缺少的方案和你从未交付的会话。做好这些,给每个并行代理一个自己的粘性出口,并保持网关远离你的模型API调用。欲了解更广泛的图景,请参阅我们的反检测框架和身份验证代理地图。