2011-10-21 23 views
10

我試圖使用Selenium登錄網站,然後使用urllib2來發出RESTy請求。爲了使它工作,我需要urllib2能夠使用Selenium使用的同一個會話。在urllib2中使用selenium中的會話cookie

與硒的記錄偉大的工作,我可以叫

self.driver.get_cookies() 

和我都硒知道的Cookie名單,並最終看起來有點像這樣:

[{u'domain': u'my.awesome.web.app.local', 
    u'expiry': 1319230106, 
    u'name': u'ci_session', 
    u'path': u'/', 
    u'secure': False, 
    u'value': u'9YEz6Qs9rNlONzXbZPZ5i9jm2Nn4HNrbaCJj2c%2B...' 
}] 

我試圖用在對的urllib2點心幾種不同的方式,我覺得這個看起來最好的:

# self.driver is my selenium driver 
all_cookies = self.driver.get_cookies() 
cp = urllib2.HTTPCookieProcessor() 
cj = cp.cookiejar 
for s_cookie in all_cookies: 
    cj.set_cookie(
     cookielib.Cookie(
      version=0 
      , name=s_cookie['name'] 
      , value=s_cookie['value'] 
      , port='80' 
      , port_specified=False 
      , domain=s_cookie['domain'] 
      , domain_specified=True 
      , domain_initial_dot=False 
      , path=s_cookie['path'] 
      , path_specified=True 
      , secure=s_cookie['secure'] 
      , expires=None 
      , discard=False 
      , comment=None 
      , comment_url=None 
      , rest=None 
      , rfc2109=False 
     ) 
    ) 
opener = urllib2.build_opener(cp) 
response = opener.open(url_that_requires_a_logged_in_user) 
response.geturl() 

雖然不起作用。

最後一次調用response.geturl()返回登錄頁面。

我錯過了什麼嗎?

任何想法應該如何去尋找問題?

謝謝。

回答

13

我能夠通過改用requests庫來解決這個問題。我重複了硒的cookie,然後通過一個簡單的字典與name:value對。

all_cookies = self.driver.get_cookies() 

cookies = {} 
for s_cookie in all_cookies: 
    cookies[s_cookie["name"]]=s_cookie["value"] 

r = requests.get(my_url,cookies=cookies) 
0

您可以嘗試如下。

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
urllib2.install_opener(opener) 
f_opener = opener.open(url_that_requires_a_logged_in_user) 
content = f_opener.read() 
+0

什麼是來自opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))的「cj」? –

+0

'cj = cp.cookiejar'。它在原始問題的代碼中。 – ronnefeldt