2013-02-05 76 views
24

我想弄清楚如何通過HTTP代理路由我的請求。如何在python webdriver中爲phantomjs/ghostdriver設置代理?

我初始化webdriver的是這樣的:

user_agent = 'my user agent 1.0' 
DesiredCapabilities.PHANTOMJS['phantomjs.page.settings.userAgent'] = user_agent 
driver = webdriver.PhantomJS() 

我已經通過文檔和源消失了,似乎無法找到一種方法,通過webdriver的使用與phantomjs代理服務器。

有什麼建議嗎?

回答

6

我挖了一點,我發現功能在那裏,但它沒有暴露。所以它需要一個方便的猴子扳手來修補它。這個解決方案適用於我,直到這個功能在webdriver調用中完全暴露。

編輯:它似乎service_args現在暴露在外,你不再需要猴子修補程序硒使用代理...請參閱@ alex-czech如何使用的答案。

from selenium import webdriver 
from selenium.webdriver.phantomjs.service import Service as PhantomJSService 

phantomjs_path = '/usr/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs' 
# monkey patch Service temporarily to include desired args 
class NewService(PhantomJSService): 
    def __init__(self, *args, **kwargs): 
     service_args = kwargs.setdefault('service_args', []) 
     service_args += [ 
      '--proxy=localhost:8080', 
      '--proxy-type=http', 
     ] 
     super(NewService, self).__init__(*args, **kwargs) 
webdriver.phantomjs.webdriver.Service = NewService 
# init the webdriver 
self.driver = webdriver.PhantomJS(phantomjs_path) 
# undo monkey patch 
webdriver.phantomjs.webdriver.Service = PhantomJSService 

以下設置也是有用的,特別是在使用可能需要很長時間加載的代理時。

max_wait = 60 
self.driver.set_window_size(1024, 768) 
self.driver.set_page_load_timeout(max_wait) 
self.driver.set_script_timeout(max_wait) 
0

我最終需要通過在兩個service_args &作爲代理身份驗證標頭中的憑據。我不相信phantomjs會正確傳遞代理身份驗證。

service_args = [ 
    "--ignore-ssl-errors=true", 
    "--ssl-protocol=any", 
    "--proxy={}".format(proxy), 
    "--proxy-type=http", 
] 

caps = DesiredCapabilities.PHANTOMJS 

authentication_token = "Basic " + base64.b64encode(b'{}:{}'.format(username, password)) 

caps['phantomjs.page.customHeaders.Proxy-Authorization'] = authentication_token 

self.driver = webdriver.PhantomJS(
     service_args=service_args, 
     desired_capabilities=caps, 
     executable_path="./phantomjs-2.1.1-linux-x86_64/bin/phantomjs") 

,代理的結構被定義爲http://username:[email protected]:port

我大膽猜測第一AUTH-參數不作爲標題來代理過去了,所以你需要手動一舉兩得。

相關問題