代理IP怎么配Selenium做自动化?Chrome和Firefox的代理设置详解

Chrome启动参数、selenium-wire认证代理、Firefox Profile和undetected-chromedriver四种方案
发布于
2

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和窗口大小。防检测是系统工程,不是换个库就能解决的。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

第一次接触代理IP,看到一堆术语——SOCKS5、HTTP代理、住宅IP、静态IP——不知所云。本文用最直白的语言把代理IP是什么、怎么选类型、到手怎么配置、配置完怎么验证说清楚。零基础也能看懂。 代理IP到底是什么 你在网上做的每一件事—

HTTP代理和SOCKS5代理都能改IP,但它们在数据包里做的事完全不同。用Wireshark抓个包对比一下,你会发现HTTP代理能看到你访问的网页内容(理论上),SOCKS5只是一个透明管道什么都不看。这个区别决定了不同场景下该用哪个。