2010-07-26 15 views

Respuesta

102

Cookie es simplemente otro encabezado HTTP.

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

Ver urllib2 examples otras maneras de cómo añadir cabeceras HTTP a su solicitud.

Hay más formas de manejar las cookies. Algunos módulos como cookielib intentan comportarse como un navegador web: recuerde qué cookies recibió previamente y vuelva a enviarlas automáticamente en las siguientes solicitudes.

+0

¡Esta es la solución simple y fácil, lo suficientemente exacta para muchos usos! –

+8

Si tiene varias cookies, debe unirlas en un único valor de encabezado, separado por un punto y coma. Por ejemplo, si tiene un diccionario de valores de cookie llamado 'cookievals', entonces use' opening.addheaders.append (('Cookie', ";" .join ('% s =% s'% (k, v) para k, v en cookievals.items()))) '. –

+0

¿Qué pasa si están usando otros parámetros para abrir? – Andrew

5

Uso cookielib. La página de documento vinculada proporciona ejemplos al final. También encontrarás un tutorial here.

+0

En el tutorial que están ahorrando galletas después de recibirla de ISN del servidor no es así? –

+0

Ambos guardan las cookies recuperadas del servidor y las devuelven al servidor, ya que normalmente estas funcionan. Si quieres hacer algo fuera de lo común, entonces tendrás que profundizar un poco más en la biblioteca.Estoy bastante seguro de que será compatible con lo que quieras hacer. –

55

Quizás usar cookielib.CookieJar puede ayudarlo. Por ejemplo, cuando la publicación de una página que contiene un formulario:

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:

Después del comentario de Piotr voy a elaborar un poco. De los documentos:

La clase CookieJar almacena cookies HTTP. Extrae las cookies de las solicitudes HTTP y las devuelve en respuestas HTTP. Las instancias de CookieJar expiran automáticamente las cookies contenidas cuando es necesario. Las subclases son también son responsables de almacenar y recuperar cookies de un archivo o de la base de datos .

Por lo que cualquier solicitud que realice con su instancia CookieJar, todas las cookies se manejarán de forma automática. Un poco como su navegador :)

Solo puedo hablar desde mi propia experiencia y mi 99% de uso de cookies es para recibir una cookie y luego enviarla con todas las solicitudes posteriores en esa sesión. El código anterior maneja solo eso, y lo hace de manera transparente.

+1

Este código de ejemplo ni siquiera muestra cómo enviar una cookie :) –

+6

@PiotrDobrogost tienes razón, no envío una cookie específica con este código :) Supongo que recibiré una cuando publique, y el 'CookieJar' instancia lo manejaré para mí en todos los dominios relevantes a partir de ese momento. –

+0

El OP indica claramente * (...) para enviar texto de cookie específico (...) * por lo que esta no es una respuesta. –

13

Es posible que desee echar un vistazo a la excelente biblioteca HTTP Python llamada Requests. Hace que cada tarea que involucre HTTP sea un poco más fácil que urllib2. De Cookies sección de guía de inicio rápido:

Para enviar sus propias cookies en el servidor, puede utilizar el parámetro de cookies:

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

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

Se basa en 'urllib3', admite la agrupación de conexiones como urllib3 y persiste cookies, encabezados; consulte [' Solicitudes de sesión'] (http://docs.python-requests.org/en/latest/user/advanced/ # session-objects). ¡Es bonito! –

Cuestiones relacionadas