如何在selenium chromedriver中使用认证代理?

2cmtqfgy  于 2023-08-01  发布在  Go
关注(0)|答案(9)|浏览(182)

经过几个小时的努力,我开始认为这是不可能的。
我需要通过selenium运行Chrome,每次运行都使用不同的身份验证(非公共)代理。

PROXY_IP = "<some IP address>"
UID = "<the user id>"
PWD = "<the password">

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=%s:%s@%s" % (UID,PWD,PROXY_IP))

driver = webdriver.Chrome(executable_path=".\\driver\\chromedriver.exe",
                          chrome_options=options)
driver.get("<site URL>")

字符串
Chrome将启动并显示错误:

This webpage is not available
ERR_NO_SUPPORTED_PROXIES


如果我使用一个公共代理,不需要像这样的身份验证...

PROXY_IP = "<public proxy IP address>"

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=%s" % PROXY_IP)

driver = webdriver.Chrome(executable_path=".\\driver\\chromedriver.exe",
                          chrome_options=options)
driver.get("<site URL>")


...它运行得很好,并在使用代理时显示站点。
我还尝试了在用户ID前面使用http://的变体:

options.add_argument("--proxy-server=http://%s:%s@%s" % (UID,PWD,PROXY_IP))


事实上,我已经搜索了很远很远,还没有找到一个解决方案,使我相信没有可能存在。
我发现了这个,但我不能理解它:
selenium chromedriver authentication proxy
不确定browswermob-proxy是什么或者应该做什么,或者如何在Python中实现和测试。我讨厌堆积创可贴解决方案,除非它们是绝对必要的。
编辑(21年11月8日):
我已经很多年没有使用Selenium了。正因为如此,我现在缺乏上下文(和时间,对不起)来浏览所提供的较新的答案,并将其中一个标记为这个问题的解决方案。SO是否有一种机制可以用来有效地将此功能委托给可能是该领域专业知识的当前从业者?

jei2mxaa

jei2mxaa1#

要在python selenium中使用授权代理,您可以使用seleniumwire
首先,使用pip install selenium-wire安装它
然后从seleniumwire导入webdriver而不是selenium

from seleniumwire import webdriver
options = {
    'proxy': {
        'http': 'http://username:password@host:port', 
        'https': 'https://username:password@host:port',
        'no_proxy': 'localhost,127.0.0.1' # excludes
    }
}
browser = webdriver.Chrome(path_to_driver, seleniumwire_options=options)

字符串
现在,您可以使用与selenium完全相同的浏览器示例:browser.get('https://api.ipify.org')等等。

brjng4g3

brjng4g32#

我已经检查了网络上的大多数解决方案,没有一个通过chrome/firefox所需的功能进行身份验证。检查此链接:https://github.com/webdriverio/webdriverio/issues/324。最后一个临时解决方案是将您的IP地址列入代理提供商的白名单。

ghhkc1vu

ghhkc1vu3#

我找不到任何关于Chrome的解决方案。我们不能使用headless选项添加扩展。我正在使用Heroku和chrome-buildpack。有以下选项
1.使用xvfb代替无头选项并安装扩展
1.使用本地代理转发器将流量转发到经过身份验证的代理;我们可以使用Squid、mitProxy或类似proxy-login-automator的东西
而不是这些变通办法,我切换到Firefox,在那里我能够填写用户名和密码的代理身份验证弹出窗口。如下面所示。下面的代码是使用Capybara的Ruby。你应该可以在你的平台上做这样的事情

page.driver.browser.switch_to.alert.send_keys('proxy-username' + Selenium::WebDriver::Keys::KEYS[:tab] + 'my-password')
page.driver.browser.switch_to.alert.accept

字符串

rekjcdws

rekjcdws4#

This是我找到的最好的解决方案,也是唯一起作用的--关于这个问题的所有其他答案都已经过时了。它基本上是为Chrome动态生成一个auth扩展。简单地使用脚本中定义的函数,如下所示:

driver = proxy_chrome(host, port, username, password)
driver.get("http://www.icanhazip.com/")
driver.get("https://www.reddit.com/")
print('Terminated without issues.')

字符串
请注意,这不适用于--headless选项。但是,在Linux上,您可以简单地使用x虚拟帧缓冲区来模拟这一点。在Python中就像这样简单:

import xvfbwrapper
x = xvfbwrapper.Xvfb()
x.start()

vulvrdjw

vulvrdjw5#

在尝试了许多实际上不能正常工作的解决方案之后,我终于设法使用前面的答案中建议的扩展来设置身份验证代理。你需要做的就是输入这个链接:
http://crxextractor.com/并粘贴此URL:https://www.crx4chrome.com/crx/1446/
它将允许您下载扩展名为.crx文件,而无需安装它。我使用了这个代码:

proxy = {'address': 'pr.oxylabs.io:7777',
     'username': 'USERNAME',
     'password': 'PASSWORD'}

capabilities = dict(DesiredCapabilities.CHROME)
capabilities['proxy'] = {'proxyType': 'MANUAL',
                         'httpProxy': proxy['address'],
                         'ftpProxy': proxy['address'],
                         'sslProxy': proxy['address'],
                         'noProxy': '',
                         'class': "org.openqa.selenium.Proxy",
                         'autodetect': False,
                         'socksUsername': proxy['username'],
                         'socksPassword': proxy['password']}

options = webdriver.ChromeOptions()
options.add_extension("./extension_2_0_0_0.crx")
driver = webdriver.Chrome(executable_path=CHROME_PATH, desired_capabilities=capabilities, chrome_options=options)

字符串

qgzx9mmu

qgzx9mmu6#

如果您有永久IP地址(例如通过租用云中的机器),您可以联系代理提供商,使用您的IP而不是用户和密码访问代理服务器。根据我的经验,这更容易。
如果这是不可能的,另一个解决方案是:

pip install undetected-chromedriver
pip install selenium-wire

字符串
然后使用传递seleniumwire_options参数的字典的“proxy”键设置代理凭据:

from seleniumwire.undetected_chromedriver.v2 import Chrome

options = {
    'proxy': {
        'http': 'http://user:pass@ip:port',
        'https': 'https://user:pass@ip:port',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

driver = Chrome(seleniumwire_options=options)

tyky79it

tyky79it7#

我花了很多时间去做同样的事情。
Chrome只使用安装它的操作系统的代理。您可以通过选择->查找来检查它:代理->更改代理设置
因此,如果没有额外的插件和配置这个插件,你不能做到这一点。
或者您可以更改操作系统代理设置--这要容易得多。
你也可以使用phantomjs --它和chrome有相同的引擎(WebKit)。使用类似这样的东西:

String PROXY = proxyIP + ":" + proxyPort;
String proxyAuth= proxyUser + ":" + proxyPass;
        OpenQA.Selenium.Proxy proxy = new OpenQA.Selenium.Proxy();
                    proxy.HttpProxy = PROXY;
                    proxy.FtpProxy = PROXY;
                    proxy.SslProxy = PROXY;
                    proxy.SocksProxy = PROXY;

    var serviceJS = PhantomJSDriverService.CreateDefaultService(phantomPath);
    serviceJS.AddArguments("--proxy=" + PROXY, "--proxy-type=http", "--proxy-auth=" + proxyAuth);

字符串

a7qyws3x

a7qyws3x8#

这是一个临时的解决方案,可以在初始状态下工作:Python中的代码:首先从Chrome插件商店下载插件:Proxy-Auto-Auth_v2.0.crx

options = webdriver.ChromeOptions()
        options.add_extension("./Proxy-Auto-Auth_v2.0.crx")) #this will provide you a window to enter user name and proxy 
        driver = webdriver.Remote(command_executor=selenium_server,desired_capabilities=options.to_capabilities())

        or 

        driver = webdriver.Chrome(chrome_options=options)

字符串

pokxtpni

pokxtpni9#

我一直在广泛地寻找。这就是它对我的作用

PROXY_HOST = 'FILL IN'  # rotating proxy or host
    PROXY_PORT = 8080 # port
    PROXY_USER = 'FILL IN' # username
    PROXY_PASS = 'FILL IN' # password
    http_proxies = { 'https' : 'http://' + PROXY_USER + ':' + PROXY_PASS + '@' + PROXY_HOST + ':' + str(PROXY_PORT) }

    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 = """
    var config = {
            mode: "fixed_servers",
            rules: {
            singleProxy: {
                scheme: "http",
                host: "%s",
                port: parseInt(%s)
            },
            bypassList: ["localhost"]
            }
        };

    chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

    function callbackFn(details) {
        return {
            authCredentials: {
                username: "%s",
                password: "%s"
            }
        };
    }

    chrome.webRequest.onAuthRequired.addListener(
                callbackFn,
                {urls: ["<all_urls>"]},
                ['blocking']
    );
    """ % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)



    def get_chromedriver(self, use_proxy=False):

        driver_path = 'FILL IN'
        path = os.path.dirname(os.path.abspath(__file__))
        chrome_options = webdriver.ChromeOptions()
        if use_proxy:
            pluginfile = 'proxy_auth_plugin.zip'

            with zipfile.ZipFile(pluginfile, 'w') as zp:
                zp.writestr("manifest.json", libshared.manifest_json)
                zp.writestr("background.js", libshared.background_js)
            chrome_options.add_extension(pluginfile)

        driver = webdriver.Chrome(
            executable_path=driver_path,
            chrome_options=chrome_options)
        return driver

字符串

相关问题