Ведение сессии в python при выполнении HTTP-запросов - PullRequest
25 голосов
/ 29 мая 2009

Мне нужно написать скрипт Python, который отправляет несколько HTTP-запросов на один и тот же сайт. Если я не ошибаюсь (и я вполне могу быть), urllib повторно аутентифицируется для каждого запроса. По причинам, в которые я не буду вдаваться, мне нужно иметь возможность один раз пройти аутентификацию, а затем использовать этот сеанс для остальных моих запросов.

Я использую Python 2.3.4

Ответы [ 3 ]

29 голосов
/ 17 мая 2012

Использовать Запросы библиотека. От http://docs.python -requests.org / ru / latest / user / advanced / # session-objects :

Объект Session позволяет сохранять определенные параметры в Запросы. Он также сохраняет куки во всех запросах, сделанных из Экземпляр сеанса.

s = requests.session()

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")

print r.text
# '{"cookies": {"sessioncookie": "123456789"}}'
24 голосов
/ 29 мая 2009

Если вы хотите сохранить аутентификацию, вам необходимо повторно использовать куки. Я не уверен, что urllib2 доступен в Python 2.3.4, но вот пример того, как это сделать:

req1 = urllib2.Request(url1)
response = urllib2.urlopen(req1)
cookie = response.headers.get('Set-Cookie')

# Use the cookie is subsequent requests
req2 = urllib2.Request(url2)
req2.add_header('cookie', cookie)
response = urllib2.urlopen(req2)
16 голосов
/ 29 мая 2009

Python 2

Если это аутентификация на основе файлов cookie, используйте HTTPCookieProcessor :

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

Если это HTTP-аутентификация, используйте basic или digest AuthHandler :

import urllib2
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib2.install_opener(opener)
urllib2.urlopen('http://www.example.com/login.html')

... и использовать один и тот же открыватель для каждого запроса.

Python 3

В Python3 urllib2 и cookielib были перемещены в http.request и http.cookiejar соответственно.

...