小编给大家分享一下Selenium + Firefox怎么用带用户名密码认证的HTTP代理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
熟悉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 ?
# coding: utf-8
# selenium_firefox_proxy_auto_auth.py
import sys
import time
from base64 import b64encode
from selenium import webdriver
# close-proxy-authentication插件的路径
# https://addons.mozilla.org/en-US/firefox/addon/close-proxy-authentication/
PROXY_HELPER_DIR = 'close_proxy_authentication-1.1.xpi'
def test():
# HTTP(S)类型代理参数
proxy_host = '221.229.204.91'
proxy_port = 8888
proxy_username = '******'
proxy_password = '******'
fp = webdriver.FirefoxProfile()
# 添加代理认证插件
fp.add_extension(PROXY_HELPER_DIR)
# 设置代理参数
fp.set_preference('network.proxy.type', 1)
fp.set_preference('network.proxy.http', proxy_host)
fp.set_preference('network.proxy.http_port', proxy_port)
# 给close-proxy-authentication插件设置authtoken(即代理认证的用户名和密码)
credentials = '{}:{}'.format(proxy_username, proxy_password)
credentials = b64encode(credentials)
fp.set_preference('extensions.closeproxyauth.authtoken', credentials)
firefox = webdriver.Firefox(firefox_profile=fp)
# 访问http://httpbin.org/ip回显当前IP
firefox.get('http://httpbin.org/ip')
time.sleep(1000)
if __name__ == '__main__':
test()
测试环境:
view plain copy to clipboard print ?
Firefox V53.0
geckodriver v0.18.0
selenium V3.8.0
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:
以上是“Selenium + Firefox怎么用带用户名密码认证的HTTP代理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。