You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python Selenium配置代理后Firefox仍用真实IP,如何访问受限网站?

解决Firefox + Selenium代理IP不生效的问题

先帮你拆解一下问题,再给出针对性的解决方案,顺便分析之前配置失效的可能原因:

为什么之前的配置现在失效了?

大概率是这几个原因:

  1. 关键参数设置错误:你第一个代码里把network.proxy.type设成了0(自动检测代理),这本来就不是手动配置代理的正确值!之前可能是Firefox的自动检测逻辑偶然生效,但新版本浏览器严格执行了规则,导致代理不再生效。
  2. 版本兼容性问题:Firefox或Selenium版本更新后,旧的FirefoxProfile(Selenium 4+已弃用)、proxy参数的用法被淘汰,API逻辑发生了变化。
  3. 代理本身或网络环境变化:代理服务器过期、被封禁,或者你的本地网络(比如公司防火墙)拦截了代理请求。
  4. 残留配置干扰:Selenium复用了旧的临时浏览器缓存,导致新的代理配置没有被正确加载。

可行的解决方案

1. 先确认代理本身可用

在尝试代码之前,先手动验证代理是否正常:

  • 打开Firefox手动设置代理(设置→网络设置→手动配置代理),访问https://api.ipify.org看是否显示代理IP。
  • 或者用命令行测试:
    curl -x http://PROXY_HOST:PROXY_PORT https://api.ipify.org
    

如果这一步都不生效,那问题出在代理服务器本身,先解决代理的可用性。

2. 使用Selenium 4+推荐的FirefoxOptions配置代理

这是当前最稳定的配置方式,替换你之前的代码:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = config['DEFAULT']['PROXY_HOST']
PROXY_PORT = config['DEFAULT']['PROXY_PORT']

# 初始化Firefox配置项
options = Options()

# 核心:设置手动代理模式(type=1,0是自动检测,2是系统代理)
options.set_preference("network.proxy.type", 1)

# 配置各协议的代理
options.set_preference("network.proxy.http", PROXY_HOST)
options.set_preference("network.proxy.http_port", int(PROXY_PORT))
options.set_preference("network.proxy.https", PROXY_HOST)
options.set_preference("network.proxy.https_port", int(PROXY_PORT))
options.set_preference("network.proxy.ssl", PROXY_HOST)
options.set_preference("network.proxy.ssl_port", int(PROXY_PORT))

# 让所有请求都走代理(空字符串表示不排除任何地址)
options.set_preference("network.proxy.no_proxies_on", "")

# 配置UA(可选,保持你之前的设置即可)
options.set_preference("general.useragent.override", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A")

# 启动浏览器
driver = webdriver.Firefox(options=options)

# 测试代理是否生效
driver.get("https://api.ipify.org")
print(driver.page_source)  # 输出应该是代理IP

3. 如果代理需要用户名密码认证

如果你的代理是带账号密码的,需要额外添加认证配置:

# 在options里添加以下配置
PROXY_USER = "your_proxy_username"
PROXY_PWD = "your_proxy_password"

# HTTP/HTTPS代理认证
options.set_preference("network.proxy.http", f"{PROXY_USER}:{PROXY_PWD}@{PROXY_HOST}:{PROXY_PORT}")
options.set_preference("network.proxy.https", f"{PROXY_USER}:{PROXY_PWD}@{PROXY_HOST}:{PROXY_PORT}")

# SOCKS代理认证(如果用的是SOCKS代理)
options.set_preference("network.proxy.socks_username", PROXY_USER)
options.set_preference("network.proxy.socks_password", PROXY_PWD)

4. 清理浏览器缓存干扰

如果Selenium复用了旧的临时profile,可能导致配置不生效,可以强制指定新的临时profile路径:

# 在options里添加
options.add_argument("-profile")
options.add_argument("/tmp/selenium_new_profile")  # 随便一个不存在的路径,会自动创建

另外,每次用完浏览器后用driver.quit()代替driver.close(),确保彻底关闭所有Firefox进程。

5. 检查版本兼容性

确保GeckoDriver的版本和Firefox版本匹配:

  • Firefox 115+ → GeckoDriver 0.33.0+
  • Firefox 102-114 → GeckoDriver 0.32.0+
    可以去Mozilla官方文档确认对应关系,版本不匹配也会导致各种奇怪的配置失效问题。

内容的提问来源于stack exchange,提问作者toing_toing

火山引擎 最新活动