在Selenium Chromedriver中使用经过身份验证的代理?

搜索许多小时我开始认为这是不可能的。

我需要使用不同的经过身份验证(非公共)代理的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>")

…它运行得很好,并在使用代理时显示网站。

I also tried a variant with http://在用户ID的前面:

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

我已经搜索的事实宽阔,尚未找到解决方案让我相信没有可能存在。

I did find this but I can’t make sense out of it:

Selenium Chromedriver认证代理

肯定是什么browswermob-proxyis或应该在Python中执行或如何实施和测试。除非它们是绝对必要的,否则我讨厌堆积起来的救济解决方案。

我刚刚提交了一个错误报告。bugs.chromium.org/p/chromedriver/issues/detail?id=1605.JComeau_ictx
any更新/解决方案?Toolkit

回答 9

  1. 赞同 16

    在Python Selenium中使用具有Auth的代理您可以使用SeleniumWire..

    FISTLY,安装它pip install selenium-wire

    Then import webdriver from seleniumwire instead 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)
    

    now您可以将浏览器实例与Selenium相同的方式使用与Selenium相同的方式:browser.get('https://api.ipify.org')等等......

    Blackster
    稍后为同一个WebDriver实例进行更新代理选项?Taimur Seeed
    @ taimursaeed,抱歉,但其实我不知道。需要测试它Blackster
    @ Blackster我已测试它,并且在创建实例后,无法更改配置。围绕的工作是使用不同配置创建新的驱动程序实例Taimur Seeed
  2. 赞同 4

    我已经检查了Web上的大多数解决方案,并且没有通过Chrome / Firefox所需的功能进行身份验证工作。检查此链接:https://github.com/webdrivio/webdriverio/issues/324.最后,临时解决方案是用代理提供商用代理提供商白名单。

    Anurag Narra
    如果用户名包含参数,则它不是一个解决方案Toolkit
  3. 赞同 3

    我发现的最佳解决方案是唯一一个工作的解决方案 - 这个问题的所有其他答案都已过时。它基本上为Chrome的Auth Extension for for for for for for for the。只需使用脚本中定义的函数,如下所示:

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

    注意到这不适用于 - Peadless选项。但是,在Linux上,您可以简单地使用X虚拟帧缓冲区来模拟此。它在Python中如此简单:

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

    Muppet
    如何使用xvfbwrapper示例:gist.github.com/cgoldberg/4151516战神牛仔
    Also确保创建一个名为“扩展”的空目录,以防您使用上面链接的Proxy.py文件,这是将存储插件文件proxy_auth_plugin.zip的位置。此外,主机,用户名和密码是字符串,但端口需要作为int传递。战神牛仔
  4. 赞同 2

    after trying many solutions that didn't actually work properly, i finally managed to set the authenticated proxy using the suggested extension from previous answers. what you need to do is to enter this link:

    http://crxextractor.com/此网址粘贴:https://www.crx4chrome.com/crx/1446/

    它将让您将EXTENTION作为.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)
    

    omerinb
    此解决方案需要在运行时手动输入凭证。Nikolay Shindarov
  5. 赞同 2

    I could not find any solution for chrome. We can not add extensions with headlessOption。我正在使用herokuChrome-Buildpack..有以下选项

    1. 使用xvfb无头选项和安装扩展名
    2. 使用本地代理转发器将流量转发到经过身份验证的代理;我们可以用,mitproxy,或类似的东西Proxy-Login-Automator

    在这些解决方法中,我切换到Firefox,其中我能够在代理身份验证弹出窗口上填充用户名和密码。如下给出。以下代码适用于Ruby使用CapyBara。你应该能够在你的平台上做这样的事情

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

    gs Shahid
  6. 赞同 0

    I tryed lot of time to do the same.

    Chrome仅使用安装的操作系统代理。您可以通过进入选项来检查 - >查找:代理 - >更改代理设置

    在没有额外的addons和配置此插件的情况下,您无法执行此操作。

    OR您可以更改操作系统代理设置 - 这更容易。

    您可以使用Phantomjs - 它具有相同的引擎(WebKit)作为Chrome。使用这样的东西:

    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);
    

    ANDREW
    Chrome不使用OS代理,您可以轻松地设置options.AddArguments("--proxy-server=...")Toolkit
    @ toolkit你试试这个代码,它有工作吗?我试图使用这样的代码使用Chrome代理,它对我不起作用。相同的是ff浏览器。ANDREW
    添加代理到Chromedriver是微不足道的,options.AddArguments("--proxy-server=http://proxy.com:111");Toolkit
    我看到了这一点并尝试了2年前。超过8小时尝试使用不同的方式与代理商合作,没有人成功。ANDREW
    i am using it with C#Toolkit
  7. 赞同 0

    THis is a temporary solution might work in initial state: Code is in Python: Download the plugin first from chrome plugin store : 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)
    

    Manoj Sahu
  8. 赞同 0

    我一直在广泛寻找。这就是它适合我的原因

    
    
        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
    
    
    
    
    
    

    朋友屁股
  9. 赞同 0

    如果您没有它们,请安装未检测到的铬胺和SeleniumWire

    硒线4.5.6硒4.1.0未检测到的 - 铬胺2.2.1

    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)
    

    V-现金
    谢谢回复。请阅读我的编辑,以便在无法更长时间处于评估答案的位置。尽管如此,我希望你的答案和其他人可能帮助那些有类似问题的人。如果我曾经回到这个域名,将来可能会非常帮助我。Martin
    That's why I did it.V-现金