Использование сессионного куки из селена в urllib2 - PullRequest
12 голосов
/ 21 октября 2011

Я пытаюсь использовать Selenium для входа на сайт, а затем использовать urllib2 для выполнения запросов RESTy. Для того, чтобы он работал, мне нужно, чтобы urllib2 мог использовать тот же сеанс, что и Selenium.

Вход в систему с селеном работал отлично, и я могу позвонить

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...'
}]

Я пробовал несколько разных способов использовать Cooky в 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 () возвращает страницу входа.

Я что-то упустил?

Есть идеи, как искать проблему?

Спасибо.

Ответы [ 2 ]

14 голосов
/ 11 июля 2012

Мне удалось преодолеть эту проблему с помощью библиотеки 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 голосов
/ 06 января 2015

Вы можете попробовать, как показано ниже.

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