如何在需要在python中进行身份验证的代理服务器后面运行selenium web驱动程序

时间:2012-10-11 20:51:50

标签: python authentication selenium proxy

目前这是我的代码,但是webDriver正在显示一个输入代理凭据的弹出窗口,我不希望这种烦人的情况,这不是第一次在stackoverflow中出现相同的问题,但没有人回复一个正确的答案。

我试过谷歌找到解决这个问题的方法。我开始了解java中的解决方案,但我不知道我们是如何在python中完成的。

    PROXY_HOST = "65.49.1.59"
    PROXY_PORT = 60099
    fp = webdriver.FirefoxProfile()
    # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5

    print " im in parse_details"

    fp.set_preference("network.proxy.type", 1)
    fp.set_preference('network.http.phishy-userpass-length', 255)

    fp.set_preference("network.proxy.http", PROXY_HOST)
    fp.set_preference("network.proxy.http_port", PROXY_PORT)
    fp.set_preference("network.proxy.ftp", PROXY_HOST)
    fp.set_preference("network.proxy.ftp_port", PROXY_PORT)
    fp.set_preference("network.proxy.ssl", PROXY_HOST)
    fp.set_preference("network.proxy.ssl_port", PROXY_PORT)
    #fp.set_preference("network.proxy.user_name", 'someusername')
    #fp.set_preference("network.proxy.password", 'somepassword')
    fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired

    self.driver = webdriver.Firefox(firefox_profile=fp)
    self.driver.get("http://www.whatismyip.com/")

以下这些陈述是我猜到的,我不确定他们的语法是否正确,即使我试图在selenium文档中找到,但没有帮助。你们会对此有所了解吗?

    #fp.set_preference("network.proxy.user_name", 'someusername')
    #fp.set_preference("network.proxy.password", 'somepassword')

P.S。这里问的问题是Selenium using Python: enter/provide http proxy password for firefox

2 个答案:

答案 0 :(得分:9)

Selenium无法处理基本身份验证,也不适用于弹出窗口。但这个问题是可以解决的。作为一个对我有用的解决方案(我发现它here)是添加一个浏览器扩展,为Selenium进行身份验证。这很简单。以下是Chrome和Python的工作原理:

  1. 创建包含两个文件的 proxy.zip 压缩文件:
  2. <强> background.js

    var config = {
        mode: "fixed_servers",
        rules: {
          singleProxy: {
            scheme: "http",
            host: "YOU_PROXY_ADDRESS",
            port: parseInt(YOUR_PROXY_PORT)
          },
          bypassList: ["foobar.com"]
        }
      };
    
    chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
    
    function callbackFn(details) {
        return {
            authCredentials: {
                username: "YOUR_PROXY_USERNAME",
                password: "YOUR_PROXY_PASSWORD"
            }
        };
    }
    
    chrome.webRequest.onAuthRequired.addListener(
            callbackFn,
            {urls: ["<all_urls>"]},
            ['blocking']
    );
    

    不要忘记将 YOUR_PROXY _ * 替换为您的设置。

    <强>的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"
    }
    
    1. 将创建的proxy.zip添加为扩展名
    2. Python代码:

      from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
      
      chrome_options = Options()
      chrome_options.add_extension("proxy.zip")
      
      driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
      driver.get("http://google.com")
      driver.close()
      

      就是这样。对我而言,就像一个魅力。如果您需要动态创建proxy.zip或需要PHP示例,请转到original post

答案 1 :(得分:3)

我知道它很晚才回复你的问题,但最近我开始使用Python,并且正在尝试做同样的事情并做了类似的事情来处理这种情况。

在代理服务器后面运行selenium web驱动程序

  1. 需要创建一个firefox配置文件,其中应安装“autoauth”插件。
  2. 尝试保存代理服务器用户名&amp;通过手动点击URL来设置密码。
  3. Firefox配置文件将借助autoauth
  4. 保存代理服务器的凭据
  5. 在脚本中调用该特定的Firefox配置文件。
  6. 设置所有首选项以定义代理服务器详细信息。
  7. 将Firefox个人资料分配到浏览器的实例
  8. 点击任意网址,以下是正在运行的示例
  9. <强> P.S。 :从互联网选项中删除所有代理设置,脚本将自动使用它

    所以从技术上讲,你不会发送代理用户名&amp;密码,您将在firefox中保存这些凭据并调用该特定的firefox配置文件。

    希望你早已解决了你的问题,但万一仍然存在,这可能对你有所帮助。 :)