Сохранение сеанса в python при выполнении HTTP-запросов
Мне нужно написать python script, который делает несколько HTTP-запросов одним и тем же сайтом. Если я не ошибаюсь (и, возможно, очень хорошо), urllib повторно проверяет подлинность для каждого запроса. По причинам, по которым я не буду входить, мне нужно иметь возможность аутентифицироваться один раз, а затем использовать этот сеанс для остальных моих запросов.
Я использую python 2.3.4
Ответы
Ответ 1
Если вы хотите сохранить аутентификацию, вам нужно повторно использовать файл cookie. Я не уверен, что 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)
Ответ 2
Используйте Requests библиотеку. Из http://docs.python-requests.org/en/latest/user/advanced/#session-objects:
Объект Session позволяет вам сохранять определенные параметры в Запросы. Он также сохраняет файлы cookie по всем запросам, сделанным из Экземпляр сеанса.
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"}}'
Ответ 3
Python 2
Если это проверка подлинности на основе файлов cookie, используйте HTTPCookieProcessor:
import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
Если это HTTP-аутентификация, используйте базовый или дайджест 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 соответственно.