selenium + chrome 设置代理
设置不需要认证的代理
option = webdriver.ChromeOptions()
option.add_argument(f"--proxy-server=http://{proxy['ip']}:{proxy['port']}")
option.add_argument('headless')# 设置无头模式# # 在Chrome类中,executable_path参数已被弃用,所以使用 Service指定执行路径
s = Service(executable_path='chromedriver.exe')## # 打开chrome浏览器
driver = webdriver.Chrome(service=s, options=option)
driver.get("http://httpbin.org/ip")print(driver.page_source)
设置需要认证的代理
首先,复制下面代码,这是大佬写的加载谷歌插件的代码,不需要修改
defcreate_proxyauth_extension(proxy_host, proxy_port,
proxy_username, proxy_password,
scheme='http', plugin_path=None):"""Proxy Auth Extension
args:
proxy_host (str): domain or ip address, ie proxy.domain.com
proxy_port (int): port
proxy_username (str): auth username
proxy_password (str): auth password
kwargs:
scheme (str): proxy scheme, default http
plugin_path (str): absolute path of the extension
return str -> plugin_path
"""import string
import zipfile
if plugin_path isNone:
plugin_path =r'C:\Users\11058\Desktop\chromedriver_win32\vimm_chrome_proxyauth_plugin.zip'
manifest_json ="""
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
"""
background_js = string.Template("""
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "${scheme}",
host: "${host}",
port: parseInt(${port})
},
bypassList: ["foobar.com"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "${username}",
password: "${password}"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
""").substitute(
host=proxy_host,
port=proxy_port,
username=proxy_username,
password=proxy_password,
scheme=scheme,)with zipfile.ZipFile(plugin_path,'w')as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)return plugin_path
在使用的时候,只需要调用这个方法,然后加载到谷歌里即可,如下
proxyauth_plugin_path = create_proxyauth_extension(
proxy_host=proxy['ip'],
proxy_port=proxy['port'],
proxy_username="",
proxy_password="")
option = webdriver.ChromeOptions()# option.add_argument('--headless')
option.add_argument("--start-maximized")
option.add_extension(proxyauth_plugin_path)## # 在Chrome类中,executable_path参数已被弃用,所以使用 Service指定执行路径
s = Service(executable_path='chromedriver.exe')## # 打开chrome浏览器
driver = webdriver.Chrome(service=s, options=option)
driver.get("http://httpbin.org/ip")
这里说一下,谷歌的无头模式(headless)不支持extension,所以,使用了认证的代理,就无法使用无头模式,暂时无法解决。网上找到有利用虚拟桌面解决的。我是用回头selenium版本,用PhantomJS解决的,至于以后selenium和谷歌是否会修复这个问题,待定。
另外推荐一个宝藏库:undetected_chromedriver.
经常用selenium的小伙伴肯定知道,selenium在反爬严重的网站相当于裸奔,最经典的就是window.navigator.webdriver ,网站可以获取这个的返回值来判断你是不是爬虫,
而selenium如果你在控制台输入window.navigator.webdriver ,返回的是true,
如果上网找,找到的大多是 js注入,比如这种
网站只需要添加一个javascript验证即可,此时也是使用大佬的办法,伪装
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":"""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""})
Page.addScriptToEvaluateOnNewDocument 这是新版谷歌浏览器的内测功能,即在打开浏览器,访问任何网站之前执行js代码 ,source的value部分,则是对应的javascript代码,可以看到,把window.navigator.webdriver 输出成了undefined,此时,则可以避开网站监测。
但要么很繁琐,要么打开一个标签就得执行以下js。今天推荐一个免去这么烦恼的库,undetected_chromedriver ,这个库也是基于selenium的,所以使用上和普通的selenium几乎没有不同,模块里封装了该有的js,也就是说,网站常用的比如window.navigator.webdriver 检测,根本检测不出来,上述代码,根本不需要你来操心,模块里全部替你解决,demo如下
import undetected_chromedriver as uc
option = uc.ChromeOptions()
driver = uc.Chrome(executable_path=executable_path, options=option)
driver.get(url)
driver.quit()
看吧,和selenium一模一样,还解决了辣么多烦恼。人生苦短,我用uc
补充:uc有一个问题,无法设置需要验证的代理,目前还没找到解决办法
版权归原作者 不吃天鹅肉 所有, 如有侵权,请联系我们删除。