Je dois obtenir les cookies d'une réponse HTTP envoyée par un serveur et les mettre dans l'en-tête de la requête suivante. Comment puis-je le faire?
Merci d'avance.
Vous devriez utiliser le module cookielib avec urllib.
Il stockera les cookies entre les demandes et vous pourrez les charger/les sauvegarder sur le disque. Voici un exemple:
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')
Notez que les valeurs pour NID
et PREF
sont les mêmes entre les demandes. Si vous omettiez la variable HTTPCookieProcessor
, elles seraient différentes (urllib2 n'enverrait pas les en-têtes Cookie
lors de la deuxième requête).
Regardez le module urllib:
(avec Python 3.1, en Python 2, utilisez plutôt urllib2.urlopen) Pour récupérer les cookies:
>>> import urllib.request
>>> d = urllib.request.urlopen("http://www.google.co.uk")
>>> d.getheader('Set-Cookie')
'PREF=ID=a45c444aa509cd98:FF=0:TM=14.....'
Et pour l'envoi, il vous suffit d'envoyer un en-tête de cookie avec une requête. Comme ça:
r=urllib.request.Request("http://www.example.com/",headers={'Cookie':"session_id=1231245546"})
urllib.request.urlopen(r)
Modifier:
Le "http.cookie" ("Cookie" pour Python 2) fonctionnera peut-être mieux pour vous:
Vous pouvez utiliser dans 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)
et lors de l'envoi de la demande
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)
La réponse actuelle consiste à utiliser le module Requests et l'objet requests.Session.
demandes d'importation s = demandes.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, nom =' sessioncookie ', valeur =' 123456789 ', port = Aucun, spécifiée par le port = False, domain = 'httpbin.org', domain_specified = False, domain_initial_dot = False, path = '/', path_specified = True, sécurisé = False, expires = Aucun, écart = True, comment = Aucun, comment_url = Aucun, reste = {}, rfc2109 = False)]
Vous devrez peut-être pip install requests
ou pipenv install requests
en premier.