Selenium + Chrome Diver使用带用户名密码认证的HTTP代理的方法

默认情况下,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:[email protected]: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:[email protected]: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:[email protected]:port‘)

if __name__ == ‘__main__‘:
    # 测试
    options = webdriver.ChromeOptions()
    # 添加一个自定义的代理插件(配置特定的代理,含用户名密码认证)
    options.add_extension(get_chrome_proxy_extension(proxy=‘username:[email protected]:port‘))
    driver = webdriver.Chrome(chrome_options=options)
    # 访问一个IP回显网站,查看代理配置是否生效了
    driver.get(‘http://httpbin.org/ip‘)
    print driver.page_source
    time.sleep(60)
    driver.quit()

测试截图如下所示:

时间: 2024-10-06 10:59:54

Selenium + Chrome Diver使用带用户名密码认证的HTTP代理的方法的相关文章

OpenVPN使用用户名密码认证

紧接上一篇,OpenVPN使用openldap进行认证,这一次让openvpn读取本地文件中的用户名密码,通过判断用户名密码是否存在文件中进行认证,搭建openvpn环境就不多做说明了,只要把openvpn搭建好,客户端能够连接就可以了. 1.修改openvpn配置文件 vi /etc/server.conf 编辑/etc/server.conf文件,并添加如下内容: auth-user-pass-verify /etc/openvpn/checkpsw.sh via-envclient-cer

编写登录接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定

练习题目: 编写登录接口输入用户名密码认证成功后显示欢迎信息输错三次后锁定 代码: name_actual = "phka"password_actual = "123"name = input("please enter your name")if name == name_actual: count = 0 while count < 3: password = input("please enter your passwor

Geoserver通过ajax跨域访问服务数据的方法(含用户名密码认证的配置方式)

Goeserver数据有两种,一种需进行用户密码的权限认证,一种无须用户密码.对于网上跨域访问Geoserver数据的种种方法,对这2种数据并非通用. 笔者将Geoserver官方下载的Geoserver.war包部署到linux服务器,通过前端 ajax 访问geoserver数据失败,其中包含跨域问题和用户名密码认证问题,查询网上各类方法进行尝试,结果浏览器控制台分别报出了401,403和跨域错误提示.其中: 401错误:ajax未进行用户名密码验证导致: 403错误:用户名密码验证失败导致

Nginx之让用户通过用户名密码认证访问web站点

有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问. 那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客. 一.查看当前系统参数 uname -r //查看系统内核版本号 3.13.0-32-generic cat /etc/lsb-release //查看系统版本号 Ubuntu 14.04.1 LTS 二.通过htpasswd命令生成用户名及对应密码数据库文件    htpasswd命令

WebService带用户名密码验证(复习用)

在项目开发的过程中,WebService是经常要用的,当调用WebService方法时,需要经过服务的验证才可以调用,一般就是用户名/密码验证,还有一个就是证书.下面程序使用的是用户名/密码的方式,很简单的一个程序. 先看服务端的代码(ws_Service) MySoapHeader.cs 这里通过继承SoapHeader实现对用户名/密码的验证 public class MySoapHeader:System.Web.Services.Protocols.SoapHeader { privat

git clone 带用户名密码

git使用用户名密码clone的方式: git clone http://username:[email protected] eg: username:  [email protected], pwd: test, git地址为[email protected]/test.git git clone http://abc%40qq.com:[email protected]@xxx.com/test.git 注意:用户名密码中一定要转义 @符号转码后变成了%40 原文地址:https://ww

函数加上简单用户名密码认证

def renzheng(func):#高阶函数传的是函数名func作为参数 def wrapper(*args,**kwargs): username=input('用户名:').strip() passwd=input('密码:').strip() if username=='qwe' and passwd=='123': res= func(*args,**kwargs) return res else: print('错误') return wrapper @renzheng#装饰器 d

使用powershell通过配置文件config调用wcf(含用户名密码认证)

1.环境设定 工作目录: D:\workspace\  (目录可随意) 需要的应用程序: SvcUtil.exe(解析wcf的url生成cs和config文件的工具)来源:有vs.net的PC的C盘中搜索出来,复制到D:\workspace\中. csc.exe(通过cs文件生成dll的工具)来源:C盘中搜索出来,不复制. 需要的DLL: System.ServiceModel.dll  来源:有framework的PC的C盘中搜索出来(版本号要和SvcUtil.exe生成的cs文件需要的一致)

Python 编写登陆接口,输入用户名密码,认证成功后显示欢迎信息,输入错误三次锁定

file = open('lock.txt').readlines()name = input('username:').strip()lock=[]for i in file:     line = i.strip('\n')     lock.append(line)if name in lock:     print(name,'已经被锁定,请联系开户行.退出!')else:     i = 1     while i <=3:            i = i + 1