"Selenium + Chrome Diver"使用带用户名密码认证的HTTP代理的方法
2016-08-04 11:11
1016 查看
默认情况下,Chrome的--proxy-server="http://ip:port"参数不支持设置用户名和密码认证。这样就使得"Selenium + Chrome Driver"无法使用HTTP Basic Authentication的HTTP代理。一种变通的方式就是采用IP地址认证,但在国内网络环境下,大多数用户都采用ADSL形式网络接入,IP是变化的,也无法采用IP地址绑定认证。因此迫切需要找到一种让Chrome自动实现HTTP代理用户名密码认证的方案。
Stackoverflow上有人分享了一种利用Chrome插件实现自动代理用户密码认证的方案非常不错,详细地址http://stackoverflow.com/questions/9888323/how-to-override-basic-authentication-in-selenium2-with-java-using-chrome-driver。
鲲之鹏的技术人员在该思路的基础上用Python实现了自动化的Chrome插件创建过程,即根据指定的代理“username:password@ip:port”自动创建一个Chrome代理插件,然后就可以在"Selenium + Chrome Driver"中通过安装该插件实现代理配置功能,具体代码如下。
测试截图如下所示:
Stackoverflow上有人分享了一种利用Chrome插件实现自动代理用户密码认证的方案非常不错,详细地址http://stackoverflow.com/questions/9888323/how-to-override-basic-authentication-in-selenium2-with-java-using-chrome-driver。
鲲之鹏的技术人员在该思路的基础上用Python实现了自动化的Chrome插件创建过程,即根据指定的代理“username:password@ip:port”自动创建一个Chrome代理插件,然后就可以在"Selenium + Chrome Driver"中通过安装该插件实现代理配置功能,具体代码如下。
# coding: utf-8 # test.py # 测试"Selenium + Chrome"使用带用户名密码认证的代理 import os import re import time import zipfile from selenium import webdriver # Chrome代理模板插件(https://github.com/RobinDev/Selenium-Chrome-HTTP-Private-Proxy)目录 CHROME_PROXY_HELPER_DIR = 'Chrome-proxy-helper' # 存储自定义Chrome代理扩展文件的目录 CUSTOM_CHROME_PROXY_EXTENSIONS_DIR = 'chrome-proxy-extensions' def get_chrome_proxy_extension(proxy): """获取一个Chrome代理扩展,里面配置有指定的代理(带用户名密码认证) proxy - 指定的代理,格式: username:password@ip:port """ m = re.compile('([^:]+):([^\@]+)\@([\d\.]+):(\d+)').search(proxy) if m: # 提取代理的各项参数 username = m.groups()[0] password = m.groups()[1] ip = m.groups()[2] port = m.groups()[3] # 创建一个定制Chrome代理扩展(zip文件) if not os.path.exists(CUSTOM_CHROME_PROXY_EXTENSIONS_DIR): os.mkdir(CUSTOM_CHROME_PROXY_EXTENSIONS_DIR) extension_file_path = os.path.join(CUSTOM_CHROME_PROXY_EXTENSIONS_DIR, '{}.zip'.format(proxy.replace(':', '_'))) if not os.path.exists(extension_file_path): # 扩展文件不存在,创建 zf = zipfile.ZipFile(extension_file_path, mode='w') zf.write(os.path.join(CHROME_PROXY_HELPER_DIR, 'manifest.json'), 'manifest.json') # 替换模板中的代理参数 background_content = open(os.path.join(CHROME_PROXY_HELPER_DIR, 'background.js')).read() background_content = background_content.replace('%proxy_host', ip) background_content = background_content.replace('%proxy_port', port) background_content = background_content.replace('%username', username) background_content = background_content.replace('%password', password) zf.writestr('background.js', background_content) zf.close() return extension_file_path else: raise Exception('Invalid proxy format. Should be username:password@ip:port') if __name__ == '__main__': # 测试 options = webdriver.ChromeOptions() # 添加一个自定义的代理插件(配置特定的代理,含用户名密码认证) options.add_extension(get_chrome_proxy_extension(proxy='username:password@ip:port')) driver = webdriver.Chrome(chrome_options=options) # 访问一个IP回显网站,查看代理配置是否生效了 driver.get('http://httpbin.org/ip') print driver.page_source time.sleep(60) driver.quit()
测试截图如下所示:
相关文章推荐
- Python + Selenium + Chrome 使用代理 auth 的用户名密码授权
- Python + Selenium + Firefox 使用代理 auth 的用户名密码授权
- NO.19 HttpConnection、HttpClient使用注意点(附http连接工具:采用HttpClient支持代理Proxy、支持用户名密码、支持域Domain模式)
- WCF消息安全模式之自定义用户名密码:Message CustomUserNamePassword wsHttpBinding 使用Windows Services宿主以及客户端免证书验证
- webservices 安全方法一 HTTP使用BASIC认证的原理及实现方法
- TortoiseGit 使用 HTTP 方式每次 PUSH 无需输入密码的方法
- Nginx中的用户认证配置及阻止用户使用代理访问的方法
- Python3中urllib详细使用方法(header,代理,超时,认证,异常处理)
- Asp.net应用程序使用FPSE发布失败,老提示输用户名和密码解决方法
- git之https或http方式设置记住用户名和密码的方法
- HTTP使用BASIC认证的原理及实现方法
- HTTP使用BASIC认证的原理及实现方法
- 在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)
- Nginx Http认证 实现访问网站或目录密码认证保护 | 使用 HttpAuthBasicModule 模块
- httpclient用户名密码认证示例
- 用ASP.NET做项目,本本上的系统是XP,网上下载了IIS6,安装完后出现HTTP500问题,解决之.接着出现了浏览页面时跳出登陆框让输用户名及密码,GOOGLE了一下,原来是权限不够,解决方法
- HTTP使用BASIC认证的原理及实现方法
- HTTP使用BASIC认证的原理及实现方法 (转载)
- C#中HttpWebrequest使用需要认证的代理
- HTTP使用BASIC认证的原理及实现方法(还有NTLM方法,比较复杂)