web-dev-qa-db-fra.com

python: urllib2 comment envoyer un cookie avec une demande urlopen

J'essaie d'utiliser urllib2 pour ouvrir l'URL et envoyer un texte de cookie spécifique au serveur. Par exemple. Je veux ouvrir le site Résoudre des problèmes d’échecs , avec un cookie spécifique, par exemple. search = 1. Comment fait-on ça?

J'essaie de faire ce qui suit:

import urllib2
(need to add cookie to the request somehow)
urllib2.urlopen("http://chess-problems.prg")

Merci d'avance

81
Oleg Tarasenko

Cookie est juste un autre en-tête HTTP.

import urllib2
opener = urllib2.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")

Voir exemples urllib2 pour d'autres moyens d'ajouter des en-têtes HTTP à votre demande.

Il y a plus de façons de gérer les cookies. Certains modules tels que cookielib essaient de se comporter comme un navigateur Web - souvenez-vous des cookies que vous avez obtenus précédemment et les renvoyez automatiquement dans les requêtes suivantes.

110
Messa

Peut-être que l’utilisation de cookielib.CookieJar peut vous aider. Par exemple lors de la publication sur une page contenant un formulaire:

import urllib2
import urllib
from cookielib import CookieJar

cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# input-type values from the html form
formdata = { "username" : username, "password": password, "form-id" : "1234" }
data_encoded = urllib.urlencode(formdata)
response = opener.open("https://page.com/login.php", data_encoded)
content = response.read()

EDIT:

Après le commentaire de Piotr, je vais élaborer un peu. De la docs:

La classe CookieJar stocke les cookies HTTP. Il extrait les cookies des requêtes HTTP et les renvoie dans les réponses HTTP. Les instances CookieJar expirent automatiquement les cookies contenus lorsque cela est nécessaire. Les sous-classes sont également responsables du stockage et de la récupération des cookies d'un fichier ou d'une base de données.

Ainsi, quelles que soient les demandes que vous fassiez avec votre instance CookieJar, tous les cookies seront traités automatiquement. Un peu comme votre navigateur fait :)

Je ne peux parler que de ma propre expérience et mon cas d'utilisation à 99% pour les cookies consiste à recevoir un cookie, puis à l'envoyer avec toutes les demandes ultérieures de cette session. Le code ci-dessus gère cela, et il le fait de manière transparente.

57
Morten Jensen

Vous voudrez peut-être jeter un coup d'œil à l'excellente bibliothèque HTTP Python appelée Requests . Toutes les tâches impliquant HTTP sont un peu plus simples que urllib2. From Cookies section du guide de démarrage rapide:

Pour envoyer vos propres cookies au serveur, vous pouvez utiliser le paramètre cookies:

>>> cookies = dict(cookies_are='working')

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
13
Piotr Dobrogost

Utilisez cookielib . La page de documentation liée fournit des exemples à la fin. Vous trouverez également un tutoriel ici .

5
Marcelo Cantos

Cette réponse ne fonctionne pas depuis le urllib2 module a été divisé en plusieurs modules dans Python 3. Vous devez faire

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
1
Solal