Как установить и получить cookie в заголовке HTTP в Python?
Мне нужно получить cookies из HTTP-ответа, отправленного сервером, и поместить его в заголовок следующего запроса. Как я могу это сделать?
спасибо заранее.
4 ответов
вы должны использовать модуль cookielib С urllib.
Он будет хранить куки между запросами, и вы можете загружать/сохранять их на диск. Вот пример:
import cookielib
import urllib2
cookies = cookielib.LWPCookieJar()
handlers = [
urllib2.HTTPHandler(),
urllib2.HTTPSHandler(),
urllib2.HTTPCookieProcessor(cookies)
]
opener = urllib2.build_opener(*handlers)
def fetch(uri):
req = urllib2.Request(uri)
return opener.open(req)
def dump():
for cookie in cookies:
print cookie.name, cookie.value
uri = 'http://www.google.com/'
res = fetch(uri)
dump()
res = fetch(uri)
dump()
# save cookies to disk. you can load them with cookies.load() as well.
cookies.save('mycookies.txt')
обратите внимание, что значения для NID
и PREF
одинаковы между запросами. Если вы опустили HTTPCookieProcessor
они будут разные (urllib2 не послать Cookie
заголовки по 2-му запросу).
посмотрите на модуль urllib:
(С Python 3.1, в Python 2 Используйте urllib2.urlopen вместо) Для получения куки:
>>> import urllib.request
>>> d = urllib.request.urlopen("http://www.google.co.uk")
>>> d.getheader('Set-Cookie')
'PREF=ID=a45c444aa509cd98:FF=0:TM=14.....'
и для отправки просто отправьте заголовок Cookie с запросом. Вот так:
r=urllib.request.Request("http://www.example.com/",headers={'Cookie':"session_id=1231245546"})
urllib.request.urlopen(r)
Edit:
" http.cookie " ("Cookie" для Python 2) может работать для вас лучше:
Вы можете использовать в Python 2.7
url="http://google.com"
request = urllib2.Request(url)
sock=urllib2.urlopen(request)
cookies=sock.info()['Set-Cookie']
content=sock.read()
sock.close()
print (cookies, content)
и при отправке запроса обратно
def sendResponse(cookies):
import urllib
request = urllib2.Request("http://google.com")
request.add_header("Cookie", cookies)
request.add_data(urllib.urlencode([('arg1','val1'),('arg1','val1')]))
opener=urllib2
opener=urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))
sock=opener.open(request)
content=sock.read()
sock.close()
print len(content)
текущий ответ заключается в использовании модуля запросов и запросов.Объект сеанса.
- Быстрый Старт;http://docs.python-requests.org/en/master/user/quickstart/#json-response-content
- сеансы:http://docs.python-requests.org/en/master/user/advanced/#session-objects
import requests 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"}}' print(s.cookies) # RequestsCookieJar[Cookie(version=0, name='sessioncookie', value='123456789', port=None, port_specified=False, domain='httpbin.org', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)]
вам может понадобиться pip install requests
или pipenv install requests
первый.