Selenium做网页自动化时配代理IP,不像浏览器里手点两下就能搞定——Chrome和Firefox的代理配置方式不同、有账号密码的SOCKS5代理更麻烦、无头模式下的代理行为还有坑。本文把Python + Selenium四种代理配置方法讲清楚。
方式一:Chrome启动参数加代理(最简单)
适用于无认证的HTTP/SOCKS5代理。在ChromeOptions里直接加启动参数:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://代理IP:端口')
# SOCKS5代理用下面这行:
# chrome_options.add_argument('--proxy-server=socks5://代理IP:端口')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://ipleak.net')优点是一行代码完事。缺点:不支持代理认证(Chrome启动参数没办法传用户名密码)。如果你的代理IP需要账号密码认证(大部分付费代理都需要),这个方法不行。
方式二:selenium-wire拦截请求(支持认证)
selenium-wire 库在Selenium和浏览器之间加了一层代理,可以拦截和修改每个请求,当然也能设代理认证:
pip install selenium-wire
from seleniumwire import webdriver
options = {
'proxy': {
'http': 'http://用户名:密码@代理IP:端口',
'https': 'http://用户名:密码@代理IP:端口',
# SOCKS5写法
# 'http': 'socks5://用户名:密码@代理IP:端口',
}
}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get('https://ipleak.net')天行IP的代理节点都有认证(用户名+密码),用这种方式可以直接传认证信息。天行IP静态代理月付6元起,邀请码 blsj 享折扣。
selenium-wire的局限:比原生Selenium慢一些(多了一层代理处理),有些复杂网站的JavaScript行为可能受影响。简单抓取场景没问题,高频采集场景性能会有损耗。
方式三:Firefox的profile方式(最灵活)
Firefox代理配置比Chrome灵活——支持SOCKS5远程DNS、支持认证。用Firefox Profile预设好代理配置:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
profile = FirefoxProfile()
# SOCKS5代理设置
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.socks', '代理IP')
profile.set_preference('network.proxy.socks_port', 端口号)
profile.set_preference('network.proxy.socks_version', 5)
profile.set_preference('network.proxy.socks_remote_dns', True)
# 加这一行,DNS查询也走代理,防止DNS泄漏
# HTTP代理设置(如果用HTTP代理)
# profile.set_preference('network.proxy.http', '代理IP')
# profile.set_preference('network.proxy.http_port', 端口)
# profile.set_preference('network.proxy.ssl', '代理IP')
# profile.set_preference('network.proxy.ssl_port', 端口)
firefox_options = Options()
firefox_options.profile = profile
driver = webdriver.Firefox(options=firefox_options)Firefox自动弹认证框的问题:有代理认证时Selenium需要自动填用户名密码。用AutoAuth扩展可以自动处理,或者用PyAutoGUI模拟键盘输入——但后者不稳定。更推荐用undetected-chromedriver(见方式四)。
方式四:undetected-chromedriver(防检测+代理)
普通Selenium会被大部分网站检测出来(navigator.webdriver = true)。undetected-chromedriver 能绕过这个检测,同时也能配代理:
pip install undetected-chromedriver
import undetected_chromedriver as uc
options = uc.ChromeOptions()
options.add_argument('--proxy-server=http://用户名:密码@代理IP:端口')
# uc的Chrome支持在代理URL里带认证信息
driver = uc.Chrome(options=options)
driver.get('https://ipleak.net')实测undetected-chromedriver的速度和原生Selenium几乎一样,防检测效果好,代理认证也支持。是目前做自动化采集的首选搭配。
验证代理是否生效
不管用哪种方式,配完后在代码里加一行验证:
driver.get('https://api.ipify.org')
print(driver.page_source) # 应该显示代理IP,不是你本地IP如果返回的是你本机IP,说明代理配置没生效——检查代理地址和端口有没有打错,代理是否认证失败(认证失败时Selenium会静默退回到直连,不报错)。
IP轮换:每次请求换一个新IP
采集场景需要频繁换IP。可以在代理IP平台提取一批IP,然后随机选一个配到每个driver实例:
import random
proxy_list = [
"http://user:pass@ip1:port1",
"http://user:pass@ip2:port2",
# ...更多代理
]
for url in target_urls:
proxy = random.choice(proxy_list)
options = uc.ChromeOptions()
options.add_argument(f'--proxy-server={proxy}')
driver = uc.Chrome(options=options)
try:
driver.get(url)
# 处理页面...
finally:
driver.quit() # 用完就关,释放资源每处理一个URL就启动一个带新IP的浏览器实例——这是最有效但最资源的轮换方式。如果要频繁轮换,用Selenium Grid + 动态代理池更专业,但门槛也更高。
常见问题
加了代理后Selenium打开网页超级慢?
代理IP的延迟+代理认证+页面加载,三重延迟叠加。解决办法:用离目标网站最近的代理节点;加pageLoadStrategy参数设为eager(不等页面完全加载);代理池里预先验证延迟低的IP再用。
Chrome无头模式(headless)代理不生效?
这是Chrome的老bug——某些版本的无头模式忽略–proxy-server参数。升级ChromeDriver和Chrome到最新版通常能解决。实在不行换Firefox无头模式,或者用undetected-chromedriver的无头模式。
网站检测到我用了代理怎么办?
普通代理IP很容易被检测——机房IP段、HTTP头里的代理特征、WebRTC泄漏都是线索。升级方案:用住宅IP代替机房IP(鲸云IP独享住宅代理);用undetected-chromedriver隐藏自动化痕迹;关掉WebRTC;随机化User-Agent和窗口大小。防检测是系统工程,不是换个库就能解决的。






