【问题标题】:How to use authenticated proxy in selenium chromedriver?如何在 selenium chromedriver 中使用经过身份验证的代理?
【发布时间】:2015-08-07 16:37:57
【问题描述】:

搜索了好几个小时后,我开始认为这是不可能的。

我需要通过 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 是否有一种机制可以用来有效地将这一职能委托给可能是该领域专业知识的当前从业者?

【问题讨论】:

标签: python google-chrome selenium selenium-chromedriver


【解决方案1】:

要在 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') 等等...

【讨论】:

  • 我可以稍后为同一个 webdriver 实例更新代理选项吗?
  • @TaimurSaeed,对不起,但实际上我不知道。需要测试一下
  • @Blackster 我已经测试过了,一旦创建实例就无法更改配置。解决方法是创建一个具有不同配置的新驱动程序实例
【解决方案2】:

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

【讨论】:

  • 如果用户名包含参数,将其列入白名单不是解决方案
【解决方案3】:

This 是我找到的最佳解决方案,也是唯一有效的解决方案 - 关于此问题的所有其他答案都已过时。它基本上会即时为 Chrome 生成一个身份验证扩展。只需使用脚本中定义的函数如下:

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

【讨论】:

  • 关于如何使用 xvfbwrapper 的简单示例:gist.github.com/cgoldberg/4151516
  • 还要确保创建一个名为“extension”的空目录,以防您使用上面链接的 proxy.py 文件,这是存储插件文件 proxy_auth_plugin.zip 的地方。而且host、username和password都是字符串,但是port需要作为int传递。
【解决方案4】:

在尝试了许多实际上无法正常工作的解决方案之后,我终于设法使用先前答案中建议的扩展名设置了经过身份验证的代理。 你需要做的是输入这个链接:

http://crxextractor.com/ 并粘贴此网址: 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)

【讨论】:

  • 此解决方案需要在首次运行时手动输入凭据。
【解决方案5】:

我找不到任何适用于 chrome 的解决方案。我们不能使用headless 选项添加扩展。 我正在使用带有chrome-buildpack 的 Heroku。有以下选项

  1. 使用xvfb 代替无头选项并安装扩展程序
  2. 使用本地代理转发器将流量转发到经过身份验证的代理;我们可以使用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

【讨论】:

    【解决方案6】:

    我尝试了很多时间来做同样的事情。

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

    【讨论】:

    • Chrome 没有使用操作系统代理,你可以通过options.AddArguments("--proxy-server=...")轻松设置
    • @Toolkit 你试过这段代码了吗?我尝试使用此类代码使用 chrome 代理,但它对我不起作用。 FF浏览器也是如此。
    • 是的,向 ChromeDriver 添加代理很简单,options.AddArguments("--proxy-server=http://proxy.com:111");
    • 我在 2 年前看到并尝试过。超过 8 小时尝试了不同的代理方式,但没有人成功。
    • 我用 C# 使用它
    【解决方案7】:

    这是一个临时解决方案,可能在初始状态下有效: 代码在 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)
    

    【讨论】:

      【解决方案8】:

      我一直在广泛搜索。这对我有用

      
      
          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】:

        1º 如果您始终使用相同的 IP,您可以与您的代理提供商交谈以使用您的 IP 访问代理 = 无需用户或密码。根据我的经验,这更容易。

        如果这不可能,其他解决方案是: 如果没有,请安装无法检测到的 chromedriver 和 seleniumwire

        硒线 4.5.6 硒 4.1.0 未检测到的chromedriver 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)
        

        或者您也可以尝试其他解决方案:

        import undetected_chromedriver.v2 as uc
        
        IP = XXXX
        SOCKS5_PORT = XXXX
        HTTPS_PORT = XXXX
        
        options = uc.ChromeOptions()
        options.add_argument(f'--proxy-server=socks5://{IP}:{SOCKS5_PORT}')
        #you can substitue the last line for this one:
        options.add_argument(f'--proxy-server=https://{IP}:{HTTPS_PORT}')
        
        driver = uc.Chrome(executable_path=EXECUTABLE_PATH, options=options)
        

        【讨论】:

        • 感谢您的回复。请阅读我关于不再能够评估答案的编辑。不过,我希望您和其他人的回答可以帮助那些有类似问题的人。如果我将来回到这个领域,它可能会对我很有帮助。
        • 这就是我这样做的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2016-10-13
        • 1970-01-01
        • 2019-08-30
        • 2018-02-14
        • 2023-03-31
        • 1970-01-01
        相关资源
        最近更新 更多