# Selenium 为 Chrome 配置静态代理

> Selenium 为 Chrome 配置静态代理：为什么在 --proxy-server 中加登录会失败，以及 2 种经过验证的解决方案——IP 白名单或本地转发器。无需 KYC，可用加密货币支付。

- URL: https://steadyproxy.com/zh/guides/selenium-static-proxy/
- 最后更新: 2026-10-19
- Publisher: SteadyProxy (https://steadyproxy.com)

Chrome 只接受代理主机和端口，不接受登录。通过 IP 授权你的机器，或者让一个小型本地转发器来添加登录。

**快速回答 — 如何在 Selenium 和 Chrome 中使用静态代理？**

在 Chrome 中使用 Selenium 静态代理时，不要把用户名和密码放进 --proxy-server：Chrome 在这里只接受协议、主机和端口。请使用以下两种有效方法之一。在代理的 IP 白名单中授权你的机器，或者运行一个小型本地转发器，为 Chrome 添加登录。**SteadyProxy** 登录选项：用户名和密码，或 IP 白名单（最多 10 个 IP）。更新于 2026 年 10 月 19 日。

## 关键信息有哪些？

| 属性 | 值 |
| --- | --- |
| Chrome 开关 | --proxy-server=http://host:port，没有填写登录信息的字段 |
| 方法 1 | IP 白名单：最多 10 个你自己的 IP 可免密码连接 |
| 方法 2 | 127.0.0.1:8899 上的本地转发器添加 Proxy-Authorization 标头 |
| 避免 | 在 --proxy-server 中使用 user:password；来源不明的浏览器插件 |
| 检查 | 在受控浏览器中打开 api.ipify.org |
| 测试情况 | 转发器通过受密码保护的测试代理传递了 HTTPS 和 HTTP 请求，2026 年 10 月 19 日 |

## 为什么 Chrome 会拒绝代理 URL 中的凭据？

Chrome 的 --proxy-server 开关接受协议、主机和端口。Chromium 网络设置文档显示该格式中不含用户名或密码。当代理要求登录时，用户会看到登录框，但由 Selenium 驱动的脚本无法可靠地填写它。因此登录必须在 Chrome 之外完成：要么代理信任你机器的 IP，要么由你机器上的一个辅助程序为 Chrome 发送登录信息。

## 如何在 Selenium 中使用 IP 白名单？

这是最简单的方法。在不使用代理的情况下打开 api.ipify.org，找到你机器的公网 IP。将该 IP 添加到你的 SteadyProxy 账户白名单中；最多可注册 10 个源 IP。然后只把主机和端口传给 Chrome。示例使用的是 HTTP 端口；SOCKS5 以相同方式使用 socks5:// 和 SOCKS5 端口。我们的[白名单指南](https://steadyproxy.com/zh/guides/ip-allowlisting/)解释了白名单的两个方向。

*selenium_allowlist.py：仅用主机和端口的 Chrome*

```python
"""Selenium + Chrome through a static proxy authorised by IP allowlist.

Install: python -m pip install selenium
Before running: add this machine's public IP to the allowlist of your account.
"""
import os

from selenium import webdriver
from selenium.webdriver.common.by import By

HOST = os.environ.get("PROXY_HOST", "gw.steadyproxy.com")
PORT = os.environ.get("PROXY_PORT", "7777")

options = webdriver.ChromeOptions()
# Host and port only: Chrome's --proxy-server switch has no field for a username or password
options.add_argument("--proxy-server=http://" + HOST + ":" + PORT)

driver = webdriver.Chrome(options=options)
try:
    driver.get("https://api.ipify.org?format=json")
    print("Exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()

```

## 本地转发器如何添加登录？

本地转发器监听 127.0.0.1，接收 Chrome 不带登录信息的代理请求，添加 Proxy-Authorization 标头并将其传递给你的静态代理。它仅使用 Python 标准库。它通过 CONNECT 隧道处理 HTTPS，并以每个连接一个请求的方式处理普通 http://。请将其绑定到 127.0.0.1，这样其他机器就无法通过它使用你的代理。我们于 2026 年 10 月 19 日用 curl 通过一个会拒绝无正确登录请求的测试代理，对 HTTPS 和 HTTP 进行了测试。

*local_forwarder.py：127.0.0.1:8899 到你的静态代理*

```python
"""Local forwarder: Chrome -> 127.0.0.1:8899 (no login) -> static proxy (with login).

It adds the Proxy-Authorization header for you. Keep it bound to 127.0.0.1.
Run: python local_forwarder.py   (standard library only)
"""
import asyncio
import base64
import os

LISTEN_PORT = int(os.environ.get("LOCAL_PORT", "8899"))
UPSTREAM_HOST = os.environ.get("PROXY_HOST", "gw.steadyproxy.com")
UPSTREAM_PORT = int(os.environ.get("PROXY_PORT", "7777"))
CREDENTIALS = os.environ.get("PROXY_USER", "USERNAME") + ":" + os.environ.get("PROXY_PASS", "PASSWORD")
AUTH = "Proxy-Authorization: Basic " + base64.b64encode(CREDENTIALS.encode()).decode()
DROP = ("proxy-authorization:", "proxy-connection:", "connection:")


async def pipe(reader, writer):
    try:
        while data := await reader.read(65536):
            writer.write(data)
            await writer.drain()
    except ConnectionError:
        pass
    finally:
        writer.close()


async def handle(client_reader, client_writer):
    try:
        head = await client_reader.readuntil(b"\r\n\r\n")
    except (asyncio.IncompleteReadError, asyncio.LimitOverrunError):
        client_writer.close()
        return
    lines = head.decode("latin-1").split("\r\n")
    headers = [h for h in lines[1:] if h and not h.lower().startswith(DROP)]
    headers.append(AUTH)
    if not lines[0].upper().startswith("CONNECT "):
        headers.append("Connection: close")  # plain http:// - one request per connection
    try:
        up_reader, up_writer = await asyncio.open_connection(UPSTREAM_HOST, UPSTREAM_PORT)
    except OSError:
        client_writer.write(b"HTTP/1.1 502 Bad Gateway\r\nContent-Length: 0\r\n\r\n")
        client_writer.close()
        return
    up_writer.write(("\r\n".join([lines[0]] + headers) + "\r\n\r\n").encode("latin-1"))
    await up_writer.drain()
    await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))


async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", LISTEN_PORT)
    print("Forwarding 127.0.0.1:%d -> %s:%d" % (LISTEN_PORT, UPSTREAM_HOST, UPSTREAM_PORT))
    async with server:
        await server.serve_forever()


if __name__ == "__main__":
    asyncio.run(main())

```

在一个终端中启动转发器，然后用本地地址运行 Selenium。Chrome 永远不会看到密码，登录信息保留在你机器的环境变量中。

*selenium_forwarder.py：通过本地转发器的 Chrome*

```python
"""Selenium + Chrome through the local forwarder (username/password kept out of Chrome).

Start local_forwarder.py first, then run this file.
"""
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899")

driver = webdriver.Chrome(options=options)
try:
    driver.get("https://api.ipify.org?format=json")
    print("Exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()

```

## 如何用 Selenium 运行多个静态 IP？

为每个 IP 在各自的本地端口上运行一个转发器，例如 8899、8900 和 8901，每个都使用该 IP 的凭据。为每个端口启动一个 Chrome 驱动。使用 IP 白名单时，你可以跳过转发器，将每个 IP 的主机和端口传给各自的驱动。如果每个驱动需要在多次运行之间保留 cookie，请为它们分别指定 --user-data-dir。在正式工作之前，用 api.ipify.org 检查每个驱动。

## Firefox 和 Selenium 是否存在同样的问题？

是的，形式类似。Firefox 从其首选项中读取代理主机和端口，HTTP 代理登录会显示为一个自动化无法可靠填写的对话框。同样两种方法都有效：IP 白名单，或将 Firefox 的 HTTP 代理设置为 127.0.0.1 和端口 8899 的本地转发器。如需了解内置代理登录的浏览器自动化工具，请参阅 [Playwright 指南](https://steadyproxy.com/zh/guides/playwright-static-proxy/)。

## 关于 Selenium 和静态代理，人们还问什么？

### 我可以在 --proxy-server 中写 http://user:password@host:port 吗？

它不能可靠工作。Chrome 文档中 --proxy-server 的格式没有登录的位置，因此凭据不会被使用。请求随后会因代理认证错误而失败，或显示登录框。请使用本页所述的 IP 白名单或本地转发器。

### Chrome 扩展是发送代理登录的好方法吗？

它可以工作，但会向你自动化的浏览器添加具有广泛权限的代码，而且扩展规则在不同 Chrome 版本之间会变化。这里的两种方法在 Chrome 内部没有可变部件。如果你使用扩展，请自己编写或审计它，并避免将其用于其他工作的配置文件。

### 本地转发器安全吗？

它只监听 127.0.0.1，因此只有你机器上的程序能使用它。任何能访问你机器的人也能使用它，因为他们可以读取你的环境变量。任务结束后请停止它。默认情况下它不记录任何日志；只有在不包含 Proxy-Authorization 头时才添加日志记录。

### 如何找到要加入允许列表的公网 IP？

在运行 Selenium 的机器上，不通过代理打开 https://api.ipify.org。这就是代理看到的地址。如果你的办公室或服务器有固定 IP，只需将其加入允许列表一次。IP 会变化的家庭网络连接不太适合；请改用带用户名和密码的转发器。

### Selenium Wire 或类似库能解决这个问题吗？

一些库通过运行自己的拦截代理来为 Selenium 添加代理登录，与本页的转发器非常相似。在依赖某个库之前，请确认它仍在维护。本页的转发器是约 60 行标准库 Python 代码，你可以完整阅读。

### 我可以为 Selenium 机器允许列表多少个 IP？

在你的 SteadyProxy 账户上最多允许 10 个源 IP，这涵盖了大多数办公室和服务器集群。我们的登录选项有：用户名和密码，或 IP 白名单（最多 10 个 IP）。如果你在更多机器上运行 Selenium，请通过一台具有固定 IP 的服务器路由它们，或在每台机器上使用带用户名和密码的转发器。

## 本指南使用了哪些来源？

1. [网络设置（--proxy-server 格式）](https://www.chromium.org/developers/design-documents/network-settings/) — The Chromium Projects (2026-10-19)
2. [asyncio 流](https://docs.python.org/3/library/asyncio-stream.html) — Python Software Foundation (2026-10-19)
3. [Selenium WebDriver：Chrome 选项](https://www.selenium.dev/documentation/webdriver/browsers/chrome/) — Selenium (2026-10-19)

---

SteadyProxy: SteadyProxy 是一家静态代理服务商：提供 ISP（静态住宅）和独立数据中心 IP，按 IP 租用 30 天，加密货币支付，无需上传身份证件。
