2012-01-16 46 views
14

我想用密碼保護的代理來使用selenium。代理不是固定的,而是一個變量。所以這個必須在代碼中完成(只需在這臺特定的機器上設置firefox來處理代理是不太理想的)。到目前爲止,我有以下代碼:使用Python的Selenium:輸入/提供Firefox的http代理密碼

fp = webdriver.FirefoxProfile() 
# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5 
fp.set_preference("network.proxy.type", 1) 

fp.set_preference("network.proxy.http", PROXY_HOST) 
fp.set_preference("network.proxy.http_port", PROXY_PORT) 

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

在這一點上,彈出對話框,請求代理用戶/通行證。

是否有到任何一個簡單的方法:

  1. 鍵入用戶/對話框通過。
  2. 在早期階段提供用戶/通行證。
+2

嘿隊友,你有沒有找到解決辦法呢? – Shane 2012-03-03 12:47:34

+1

@Shane你找到解決方案了嗎? – 2015-09-11 10:44:57

+2

@ArsenIbragimov你找到解決方案了嗎? – Math 2015-10-29 20:08:24

回答

-4

你試過PROXY_HOST = "http://username:[email protected]"

Also

Starting with Selenium 2.0 beta 1, there is built in support for handling popup dialog boxes.

+2

'PROXY_HOST =「username:[email protected]」'不起作用。至於彈出對話框處理,我如何找到用戶/傳遞元素來輸入? – Shane 2012-03-03 12:33:49

+0

@Shane,你試過'PROXY_HOST =「username:[email protected]」'或'PROXY_HOST =「http:// username:[email protected]」'。第二個應該通過基本身份驗證。關於元素位置:如果你可以切換到對話框,你總是可以瀏覽其發送'tab'鍵信號的元素。 – 2012-03-06 04:21:31

8

硒能不能做到這一點本身。我發現有用的唯一方法是here。簡而言之,您需要添加一個瀏覽器擴展以進行身份​​驗證。這看起來要簡單得多。

下面是它的工作原理爲Chrome(對我來說):

  1. 創建一個zip文件proxy.zip包含兩個文件:

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" 
} 
  • 添加創建proxy.zip作爲擴展

    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

    +0

    真棒!!!!!鍛鍊了魅力!乾杯邁克 – 2016-03-07 11:41:49

    +0

    邁克,它不適用於我 - http://joxi.net/LmG3OVNTRbEMam最後一行說'WebDriverException:消息:未知錯誤:無法處理擴展#1 來自未知錯誤:無法讀取清單 (驅動程序信息:chromedriver = 2.29.461591(62ebf098771772160f391d75e589dc567915b233),platform = Windows NT 10.0.14393 x86_64)' – 2017-10-02 14:26:51

    1

    在獲得硒github repo中的單元測試的啓發後。這對我有效:

    from selenium import webdriver 
    
    PROXY_HOST = "IP_address" 
    PROXY_PORT = 8080 
    USERNAME = "your_user_name" 
    PASSWORD = "YOUR_PASSWORD" 
    
    profile = webdriver.FirefoxProfile() 
    profile.set_preference("network.proxy.type", 1) 
    profile.set_preference("network.proxy.http", PROXY_HOST) 
    profile.set_preference("network.proxy.http_port", PROXY_PORT) 
    profile.set_preference("network.proxy.socks_username", USERNAME) 
    profile.set_preference("network.proxy.socks_password", PASSWORD) 
    
    profile.update_preferences() 
    
    # executable_path = define the path if u don't already have in the PATH system variable. 
    browser = webdriver.Firefox(firefox_profile=profile) 
    browser.get('http://website.com') 
    browser.maximize_window()