Python Selenium配置代理后Firefox仍用真实IP,如何访问受限网站?
解决Firefox + Selenium代理IP不生效的问题
先帮你拆解一下问题,再给出针对性的解决方案,顺便分析之前配置失效的可能原因:
为什么之前的配置现在失效了?
大概率是这几个原因:
- 关键参数设置错误:你第一个代码里把
network.proxy.type设成了0(自动检测代理),这本来就不是手动配置代理的正确值!之前可能是Firefox的自动检测逻辑偶然生效,但新版本浏览器严格执行了规则,导致代理不再生效。 - 版本兼容性问题:Firefox或Selenium版本更新后,旧的
FirefoxProfile(Selenium 4+已弃用)、proxy参数的用法被淘汰,API逻辑发生了变化。 - 代理本身或网络环境变化:代理服务器过期、被封禁,或者你的本地网络(比如公司防火墙)拦截了代理请求。
- 残留配置干扰: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




