快速回答
如何在 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 端口。我们的白名单指南解释了白名单的两个方向。
"""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: 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 + 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 指南。
关于 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 的服务器路由它们,或在每台机器上使用带用户名和密码的转发器。
本指南使用了哪些来源? (3)
- 网络设置(--proxy-server 格式) — The Chromium Projects (2026-10-19)
- asyncio 流 — Python Software Foundation (2026-10-19)
- Selenium WebDriver:Chrome 选项 — Selenium (2026-10-19)