ITPub博客

首页 > 大数据 > 数据挖掘 > "Selenium + Firefox"如何使用带用户名密码认证的HTTP代理

"Selenium + Firefox"如何使用带用户名密码认证的HTTP代理

原创 数据挖掘 作者:xakzp 时间:2018-08-22 17:23:58 1 删除 编辑
本文原创作者:鲲之鹏(http://www.site-digger.com)
本文原始链接:http://www.site-digger.com/html/articles/20180822/662.html

熟悉Firefox的同学都知道,Firefox在配置HTTP代理时无法设置用户名和密码。而收费的HTTP代理大多都是需要进行用户名和密码认证的(有的也支持IP白名单,但前提是你的IP需要固定不变)。这就使得使用Selenium + Firefox进行自动化操作非常不方便,因为每次启动一个新的浏览器实例就会弹出一个授权验证窗口,被要求输入用户名和密码(如下图所示),打断了自动化操作流程。

另外,Firefox也没有提供设置用户名密码的命令行参数(PS:phantomjs就有--proxy-auth这样的参数)。难道真的没有解决方法了?

鲲之鹏的技术人员通过研究终于找到了一个有效并且稳定的解决方案:

先介绍一个重要的角色,它的主页是 https://addons.mozilla.org/en-US/firefox/addon/close-proxy-authentication/ 。close-proxy-authentication实现了自动完成代理用户名密码认证(Proxy Authentication)的功能,它提供了一个extensions.closeproxyauth.authtoken参数用来设置代理的用户名和密码,其值为经过base64编码后的用户名密码对(如下图所示)。close-proxy-authentication会使用该值构造出"Proxy-Authorization: Basic dGVzdDp0ZXN0"头发给代理服务器,以通过认证,这就是它的工作原理。

我们就是要借助这个插件在Selenium + Firefox时自动完成HTTP代理认证,流程是这样的:

(1)通过Firefox配置选项动态添加close-proxy-authentication这个插件(默认不加载任何插件);

(2)通过配置选项设置HTTP代理的IP和端口参数;

(3)设置extensions.closeproxyauth.authtoken的值为base64encode("用户名:密码");

(4)后续访问网站的时候close-proxy-authentication插件将自动完成代理的授权验证过程,不会再弹出认证窗口;

 

下面是完整的测试代码:

view plain copy to clipboard print ?

  1. # coding: utf-8  

  2. # selenium_firefox_proxy_auto_auth.py  

  3.   

  4. import sys  

  5. import time  

  6. from base64  import b64encode  

  7. from selenium  import webdriver  

  8.   

  9.   

  10. # close-proxy-authentication插件的路径  

  11. # https://addons.mozilla.org/en-US/firefox/addon/close-proxy-authentication/  

  12. PROXY_HELPER_DIR =  'close_proxy_authentication-1.1.xpi'  

  13.   

  14. def test():  

  15.      # HTTP(S)类型代理参数  

  16.     proxy_host =  '221.229.204.91'  

  17.     proxy_port =  8888  

  18.     proxy_username =  '******'  

  19.     proxy_password =  '******'  

  20.       

  21.     fp = webdriver.FirefoxProfile()  

  22.      # 添加代理认证插件  

  23.     fp.add_extension(PROXY_HELPER_DIR)  

  24.      # 设置代理参数  

  25.     fp.set_preference( 'network.proxy.type',  1)  

  26.     fp.set_preference( 'network.proxy.http', proxy_host)  

  27.     fp.set_preference( 'network.proxy.http_port', proxy_port)  

  28.      # 给close-proxy-authentication插件设置authtoken(即代理认证的用户名和密码)  

  29.     credentials =  '{}:{}'.format(proxy_username, proxy_password)  

  30.     credentials = b64encode(credentials)  

  31.     fp.set_preference( 'extensions.closeproxyauth.authtoken', credentials)                  

  32.   

  33.     firefox = webdriver.Firefox(firefox_profile=fp)  

  34.      # 访问http://httpbin.org/ip回显当前IP  

  35.     firefox.get( 'http://httpbin.org/ip')  

  36.     time.sleep( 1000)  

  37.       

  38. if __name__ ==  '__main__':  

  39.     test()  

测试环境:

view plain copy to clipboard print ?

  1. Firefox V53. 0  

  2. geckodriver v0. 18.0  

  3. selenium V3. 8.0  

  4. close-proxy-authentication V1. 1  

上述环境涉及文件打包下载地址: http://pan.webscraping.cn:8000/index.php/s/PMDjc77gbCFJzpO

需要特别注意的是:

(1)close-proxy-authentication的最新版本目前是V1.1,它并不兼容最新版的Firefox,鲲之鹏的技术人员测试发现Firefox V56.0以下版本能够兼容close-proxy-authentication V1.1。

(2)不同geckodriver(Firefox的webdriver程序)版本,支持的Firefox版本也不相同,具体支持哪些版本,在geckodriver的releases页面上有说明。

 

测试结果如下图所示。没有再弹出认证窗口,访问httpbin.org/ip直接回显了HTTP代理的IP:

 

  说明:该文章为 鲲之鹏 (http://www.site-digger.com)原创文章 ,您除了可以发表评论外,还可以转载到别的网站,但是请保留源地址,谢谢!!(尊重他人劳动,我们共同努力)


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30303165/viewspace-2212599/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-06-24

  • 博文量
    42
  • 访问量
    60888