Как установить и получить cookie в заголовке HTTP в Python? - PullRequest
11 голосов
/ 09 апреля 2011

Мне нужно получить куки-файлы из HTTP-ответа, отправленного сервером, и поместить их в заголовок следующего запроса.Как я могу это сделать?

Заранее спасибо.

Ответы [ 4 ]

25 голосов
/ 09 апреля 2011

Вы должны использовать модуль 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 при втором запросе).

12 голосов
/ 09 апреля 2011

Посмотрите на модуль 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)

Редактировать:

«http.cookie» («Cookie» для Python 2) может работать для вас лучше:

http://docs.python.org/library/cookie.html

4 голосов
/ 12 декабря 2013

Вы можете использовать в 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)
0 голосов
/ 06 апреля 2018

Текущий ответ - использовать модуль Requests и объект request.Session.

    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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...