python: urllib2 cómo enviar cookies con solicitud urlopen

82

Estoy tratando de usar urllib2 para abrir la URL y enviar un texto de cookie específico al servidor. Por ejemplo, quiero abrir el sitio Resolver problemas de ajedrez , con una cookie específica, por ejemplo, búsqueda = 1. ¿Cómo lo hago?

Estoy intentando hacer lo siguiente:

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

Gracias por adelantado

Oleg Tarasenko
fuente

Respuestas:

111

Cookie es solo otro encabezado HTTP.

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

Consulte los ejemplos de urllib2 para ver otras formas de agregar encabezados HTTP a su solicitud.

Hay más formas de gestionar las cookies. Algunos módulos como cookielib intentan comportarse como un navegador web: recuerde qué cookies obtuvo anteriormente y envíelas automáticamente de nuevo en las siguientes solicitudes.

Messa
fuente
9
Si tiene varias cookies, debe unirlas en un solo valor de encabezado, separadas por un punto y coma. Por ejemplo, si tiene un diccionario de valores de cookies llamado cookievals, utilice opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items()))).
Greg Glockner
¿Qué pasa si están usando otros parámetros para urlopen?
Andrew
56

Tal vez usar cookielib.CookieJar pueda ayudarte. Por ejemplo, al publicar en 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()

EDITAR:

Después del comentario de Piotr, me extenderé un poco. De los documentos:

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

Entonces, independientemente de las solicitudes que realice con su CookieJarinstancia, todas las cookies se manejarán automáticamente. Un poco como lo hace su navegador :)

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

Morten Jensen
fuente
6
@PiotrDobrogost tiene razón, no envío una cookie específica con este código :) Asumo que recibiré una cuando envíe, y la CookieJarinstancia lo manejará por mí en todos los dominios relevantes a partir de ese momento.
Morten Jensen
2
El OP establece claramente (…) enviar un texto de cookie específico (…) por lo que esta no es una respuesta.
Piotr Dobrogost
13

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

Para enviar sus propias cookies al 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"}}'
Piotr Dobrogost
fuente
1
Se basa en urllib3, admite la agrupación de conexiones como urllib3 y persiste las cookies y los encabezados, consulte Requests Session. ¡Es bonito!
Serge S.
5

Utilice cookielib . La página de documentos vinculada proporciona ejemplos al final. También encontrará un tutorial aquí .

Marcelo Cantos
fuente
En el tutorial están guardando cookies después de recibirlas del servidor, ¿no es así?
Oleg Tarasenko
Ambos guardan las cookies recuperadas del servidor y las devuelven al servidor, ya que normalmente así es como funcionan las cookies. Si desea hacer algo fuera de lo común, tendrá que profundizar un poco más en la biblioteca. Estoy bastante seguro de que apoyará todo lo que quieras hacer.
Marcelo Cantos
1

Esta respuesta no funciona ya que el urllib2módulo se ha dividido en varios módulos en Python 3. Necesita hacer

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