Selenium Webdriver 以代理proxy方式启动firefox,ie,chrome
1. 题前话
没有发现之前,自己傻不垃圾的自己写了各个浏览器修改代理的方法,结果发现webdriver有现成,悔恨不已,希望其他同仁能够少走弯路。
本文是在Webdriver 2.12.0下面测试得到的结论
2. webdriver的maven配置
Java代码
<repositories> <repository> <id>selenium</id> <name>selenium</name> <url>http://repo1.maven.org/maven2/</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.12.0</version> </dependency> </dependencies>
3. webdriver中firefox以代理方式启动
普通情况下,firefox的代理修改是直接修改其配置文件,即prefs.js,把对应的配置修改掉
Java代码
user_pref("network.proxy.ftp_port", 1000);
user_pref("network.proxy.gopher", "10.0.0.0");
user_pref("network.proxy.gopher_port", 1000);
user_pref("network.proxy.http", "10.0.0.0");
user_pref("network.proxy.http_port", 1000);
user_pref("network.proxy.no_proxies_on", "");
user_pref("network.proxy.share_proxy_settings", true);
user_pref("network.proxy.socks", "10.0.0.0");
user_pref("network.proxy.socks_port", 1000);
user_pref("network.proxy.ssl", "10.0.0.0");
user_pref("network.proxy.ssl_port", 1000);
user_pref("network.proxy.type", 1);
firefoxdriver初始化时,我们可以通过配置FirefoxProfile,来修改上面的配置,特别要注意的是localhost的配置,请看下述例子:
Java代码
String proxyIp = "localhost";
int proxyPort = 8080;
FirefoxProfile profile = new FirefoxProfile();
// 使用代理
profile.setPreference("network.proxy.type", 1);
// http协议代理配置
profile.setPreference("network.proxy.http", proxyIp);
profile.setPreference("network.proxy.http_port", proxyPort);
// 所有协议公用一种代理配置,如果单独配置,这项设置为false,再类似于http的配置
profile.setPreference("network.proxy.share_proxy_settings", true);
// 对于localhost的不用代理,这里必须要配置,否则无法和webdriver通讯
profile.setPreference("network.proxy.no_proxies_on", "localhost");
// 以代理方式启动firefox
FirefoxDriver ff = new FirefoxDriver(profile);
ff.get("www.xxx.com");
ff.quit();
4. webdriver中IE以代理方式启动,chrome类似
方式不同于firefox,这里是利用webdriver提供的Proxy和WindowsProxyManager来处理,这里也要特别注意localhost的处理。
处理步骤为:
1. InternetExplorerDriver初始化时,调用WindowsProxyManager的backupRegistrySettings方法保存老的代理配置
2. 调用WindowsProxyManager的changeRegistrySettings方法类修改代理配置
3. 程序运行结束后,调用WindowsProxyManager的restoreRegistrySettings来恢复到老的配置。
特别需要提醒的是第3条,我认为webdriver这里处理的不好。恢复到默认配置是在程序结束后,如果程序启动了多个InternetExplorerDriver,每个InternetExplorerDriver保存的是该InternetExplorerDriver启动时IE的配置,而程序结束是调用的shutdownhooker,同时恢复,线程的运行快慢不确定,最后是否恢复到初始配置还很难说,所以,如果同个程序只启动一个InternetExplorerDriver,使用webdriver自带的初始InternetExplorerDriver时修改代理是没有问题,如果启动多个,就要采取其他方式,可以参看本文的第5部分。
程序只启动一个InternetExplorerDriver,以代理模式启动的代码如下:
Java代码
String proxyIpAndPort= "localhost:8080";
// 代理配置
DesiredCapabilities cap = new DesiredCapabilities();
org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
// 配置http、ftp、ssl代理(注:当前版本只支持所有的协议公用http协议,下述代码等同于只配置http)
proxy.setHttpProxy(proxyIpAndPort)
.setFtpProxy(proxyIpAndPort)
.setSslProxy(proxyIpAndPort);
// 以下三行是为了避免localhost和selenium driver的也使用代理,务必要加,否则无法与iedriver通讯
cap.setCapability(CapabilityType.ForSeleniumServer.AVOIDING_PROXY, true);
cap.setCapability(CapabilityType.ForSeleniumServer.ONLY_PROXYING_SELENIUM_TRAFFIC, true);
System.setProperty("http.nonProxyHosts", "localhost");
cap.setCapability(CapabilityType.PROXY, proxy);
WebDriver driver = new InternetExplorerDriver(cap);
driver.get("www.baidu.com");
driver.close();
InternetExplorerDriver初始化后,IE对应的代理配置为:
打开上图中的代理配置文件,可以看到下述配置,具体的可以自己查阅资料:
Java代码
function FindProxyForURL(url, host) {
if (shExpMatch(host, 'localhost')) { return 'DIRECT'; }
if (shExpMatch(url, '*/selenium-server/*')) { return 'PROXY localhost:0; DIRECT'; }
return 'PROXY 10.16.16.38:3229';
}
程序结束后,恢复原来配置
5. ie和chrome,手动存储老的代理、修改代理、恢复代理
这里同样使用的是webdriver提供的Proxy和WindowsProxyManager,只不过是我们显示调用而已,不让webdriver帮我们处理。几个接口,我在上面也提起过,这里就直接上代码了。
Java代码
final WindowsProxyManager proxyManager = new WindowsProxyManager(true,
"webdriver-ie", 0, 0);
// 备份老代理配置
proxyManager.backupRegistrySettings();
// 增加hooker,jvm退出时,把代理修改为之前的。当然,这里可以自己决定什么时候恢复,比如,在每次InternetExplorerDriver关闭后掉用
new Thread() {
@Override
public void run() {
proxyManager.restoreRegistrySettings(true);
}
};
// 修改代理
DesiredCapabilities cap = changeProxy("localhost",8080);
proxyManager.changeRegistrySettings(cap);
// 启动ie
WebDriver driver1 = new InternetExplorerDriver(cap);
driver1.get("www.baidu.com");
driver1.close();
// 再次修改代理
DesiredCapabilities cap2 = changeProxy("localhost",80);
proxyManager.changeRegistrySettings(cap);
// 再次启动ie
WebDriver driver2 = new InternetExplorerDriver(cap);
driver2.get("www.google.com");
driver2.close();
设置代理的话,可以使用这种方式,代码是我刚才测试过的,亲测可用
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://171.37.135.94:8123')
chrome = webdriver.Chrome(chrome_options=chrome_options)
chrome.get('https://proxy.mimvp.com/ip.php')
print(chrome.page_source)
chrome.quit()
使用虚拟的Linux界面,运行 Python + Selenium + Xvfb + Chrome
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Selenium + Chrome 支持 http、https (无密和加密两种方式),不支持socks5
#
# 米扑代理示例:
# https://proxy.mimvp.com/demo.php
#
# 米扑代理购买:
# https://proxy.mimvp.com
#
# mimvp.com
# 2017-01-08
# Python + Selenium + Chrome 代理示例,详见米扑博客:
# https://blog.mimvp.com/article/25076.html
#
# 本示例由米扑代理原创,测试代理来自于米扑代理
# 密码授权和白名单ip设置,请见米扑代理 - 会员中心:https://proxy.mimvp.com/usercenter/userinfo.php?p=whiteip
from selenium import webdriver
from selenium.webdriver.common.proxy import *
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from pyvirtualdisplay import Display
# from xvfbwrapper import Xvfb
import bs4, os, re, time, zipfile
from base64 import b64encode
import sys
from posix import unlink
reload(sys)
sys.setdefaultencoding('utf8')
## webdriver + chrome + proxy + whiteip (无密码,或白名单ip授权)
## 米扑代理:https://proxy.mimvp.com
def spider_url_chrome_by_whiteip(url):
browser = None
display = None
## 白名单ip,请见米扑代理会员中心: https://proxy.mimvp.com/usercenter/userinfo.php?p=whiteip
mimvp_proxy = {
'ip' : '140.143.62.84', # ip
'port_https' : 62288, # http, https
'port_socks' : 62287, # socks5
'username' : 'mimvp-user',
'password' : 'mimvp-pass'
}
try:
display = Display(visible=0, size=(800, 600))
display.start()
chrome_options = Options() # ok
chrome_options = webdriver.ChromeOptions() # ok
proxy_https_argument = '--proxy-server=http://{ip}:{port}'.format(ip=mimvp_proxy['ip'], port=mimvp_proxy['port_https']) # http, https (无密码,或白名单ip授权,成功)
chrome_options.add_argument(proxy_https_argument)
# proxy_socks_argument = '--proxy-server=socks5://{ip}:{port}'.format(ip=mimvp_proxy['ip'], port=mimvp_proxy['port_socks']) # socks5 (无密码,或白名单ip授权,失败)
# chrome_options.add_argument(proxy_socks_argument)
chromedriver = '/usr/local/bin/chromedriver'
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=chrome_options) # 打开 Chrome 浏览器
browser.get(url)
content = browser.page_source
print("content: " + str(content))
finally:
if browser: browser.quit()
if display: display.stop()
使用虚拟的Linux界面,运行 Python + Selenium + Xvfb + Firefox
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Selenium + Firefox 支持 http、https (无密和加密两种方式),不支持socks5
#
# 米扑代理示例:
# https://proxy.mimvp.com/demo.php
#
# 米扑代理购买:
# https://proxy.mimvp.com
#
# mimvp.com
# 2017-01-08
# Python + Selenium + Firefox 设置密码时,需要使用到两个插件:
# 插件1: modify_headers-0.7.1.1-fx.xpi
# 下载地址:https://github.com/mimvp/mimvp-proxy-demo
#
# 方式2: close_proxy_authentication-1.1.xpi
# 下载地址:https://github.com/mimvp/mimvp-proxy-demo
#
# Python + Selenium + Firefox 代理示例,详见米扑博客:
# https://blog.mimvp.com/article/25055.html
#
# 本示例由米扑代理原创,测试代理来自于米扑代理
# 密码授权和白名单ip设置,请见米扑代理 - 会员中心:https://proxy.mimvp.com/usercenter/userinfo.php?p=whiteip
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.proxy import *
from pyvirtualdisplay import Display
# from xvfbwrapper import Xvfb
import bs4, os
from base64 import b64encode
import sys
reload(sys)
sys.setdefaultencoding('utf8')
## webdriver + firefox + proxy + whiteip (无密码,或白名单ip授权)
## 米扑代理:https://proxy.mimvp.com
def spider_url_firefox_by_whiteip(url):
browser = None
display = None
## 白名单ip,请见米扑代理会员中心: https://proxy.mimvp.com/usercenter/userinfo.php?p=whiteip
mimvp_proxy = {
'ip' : '140.143.62.84', # ip
'port_https' : 19480, # http, https
'port_socks' : 19481, # socks5
'username' : 'mimvp-guest',
'password' : 'welcome2mimvp'
}
try:
display = Display(visible=0, size=(800, 600))
display.start()
profile = webdriver.FirefoxProfile()
# add proxy
profile.set_preference('network.proxy.type', 1) # ProxyType.MANUAL = 1
if url.startswith("http://"):
profile.set_preference('network.proxy.http', mimvp_proxy['ip'])
profile.set_preference('network.proxy.http_port', mimvp_proxy['port_https']) # 访问http网站
elif url.startswith("https://"):
profile.set_preference('network.proxy.ssl', mimvp_proxy['ip'])
profile.set_preference('network.proxy.ssl_port', mimvp_proxy['port_https']) # 访问https网站
else:
profile.set_preference('network.proxy.socks', mimvp_proxy['ip'])
profile.set_preference('network.proxy.socks_port', mimvp_proxy['port_socks'])
profile.set_preference('network.proxy.ftp', mimvp_proxy['ip'])
profile.set_preference('network.proxy.ftp_port', mimvp_proxy['port_https'])
profile.set_preference('network.proxy.no_proxies_on', 'localhost,127.0.0.1')
## 不存在此用法,不能这么设置用户名密码 (舍弃)
# profile.set_preference("network.proxy.username", 'mimvp-guest')
# profile.set_preference("network.proxy.password", 'welcome2mimvp')
profile.update_preferences()
browser = webdriver.Firefox(profile) # 打开 FireFox 浏览器
browser.get(url)
content = browser.page_source
print("content: " + str(content))
finally:
if browser: browser.quit()
if display: display.stop()
完整的代理示例,请见米扑代理的使用示例:
https://proxy.mimvp.com/demo.php (Selenium Python)
更多的代理示例,请见米扑代理的官方github:
https://github.com/mimvp/mimvp-proxy-demo
本文中,测试的代理ip,全部来自米扑代理:
代理推荐
米扑代理: https://proxy.mimvp.com(米扑代理 - 免费代理IP每日更新)
百度、阿里、小米的技术大牛做的,代理质量高,性价比高
参考推荐:
Selenium Webdriver 以代理proxy方式启动firefox,ie,chrome
Python + Selenium + Firefox 使用代理 auth 的用户名密码授权
Selenium FF WebDriver 加载firebug 和设置代理
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2018-12-13 00:30:05
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: Selenium Webdriver 以代理proxy方式启动firefox,ie,chrome (米扑博客)
