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

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

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

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

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

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

PROXY = {
    "server": "http://residentialpremium.quantumproxies.io:8080",  # 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`需要一个方案。`residentialpremium.quantumproxies.io:8080`不是代理URL；`http://residentialpremium.quantumproxies.io:8080`才是。如果凭证给你带来了麻烦，[将你的服务器IP列入白名单](https://quantumproxies.io/residential-proxies)可以完全消除用户：密码的因素 - 网关识别呼叫者，浏览器从未看到407。

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

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

1. 你将`proxy=`传递给了代理从未接收到的会话。创建一个`Browser`，传递那个确切的对象，并且不要让一个默认会话在你不知情的情况下被创建。
2. 你设置了`cdp_url`。连接到一个已经运行的Chrome意味着代理属于该浏览器的启动标志（`--proxy-server=...`），而不是你的会话配置 - browser-use无法重新配置它。
3. 全局`HTTP_PROXY`或`HTTPS_PROXY`环境变量正在与会话设置抗衡，或者更糟的是，悄悄地将你的LLM API调用通过计量带宽路由。
4. 代理本身已死。首先在代理之外测试它 - 这不花钱，并排除了一半的搜索空间。

```python
import requests

PROXY_URL = "http://USER:PASS@residentialpremium.quantumproxies.io:8080"
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检查器](https://quantumproxies.io/ip-checker)告诉你出口从另一侧看起来如何 - ASN、类型和声誉 - 这是当页面加载但每个页面都是CAPTCHA时要检查的第二件事。

![一个被要求报告自身 IP 的 browser-use 智能体把 DNS_PROBE_FINISHED_NXDOMAIN 当作关于网站的事实来叙述，这是代理只配置了一半的迹象。卡片把症状与修复方法对应起来：DNS 错误、显示的是你自己的 IP、在 0.1.45 上能用的配置，或与会话冲突的全局 HTTPS_PROXY 变量。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785776552/blog/generated/qp-b10-005-diag1.png)
*配置通常看起来是正确的。失败几乎总是代理实际接收到的会话、缺少的方案或全局环境变量。*

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

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

```python
import asyncio, secrets
from browser_use import Agent, Browser

def session_proxy(sid: str, country: str = "us"):
    return {
        "server": "http://residentialpremium.quantumproxies.io:8080",
        "username": f"USER-country-{country}-sid-{sid}-ttl-30m",
        "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](https://quantumproxies.io/mobile-proxies)的行为再次不同，因为运营商NAT将数千个真实用户置于同一地址之后。

[给每个代理一个自己的住宅出口IP](https://quantumproxies.io/residential-proxies)

![三个 browser-use 智能体各自在自己的任务中创建，拥有独立的 Browser，并在用户名中带有粘性代理会话，分别从美国、德国和英国的不同住宅出口访问同一目标。卡片列出了规则：每个智能体一个 Browser，每个 Browser 一个粘性会话，不共享 Cookie。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785776552/blog/generated/qp-b10-005-diag2.png)
*在任务内部构建会话，而不是在外部。每个代理一个Browser，每个Browser一个粘性会话，每个身份一个IP。*

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

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

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

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

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

## 常见问题

### 如何在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调用。欲了解更广泛的图景，请参阅我们的[反检测框架和身份验证代理地图](https://quantumproxies.io/blog/anti-detect-frameworks-authenticated-proxies-map)。

[在200多个国家运行超过9000万个住宅IP的browser-use](https://quantumproxies.io/residential-proxies)
