python: urllib2 cómo enviar una cookie con urlopen request


Estoy tratando de usar urllib2 para abrir url y enviar texto específico de cookie al servidor. Por ejemplo, Quiero abrir el sitio Resolver problemas de ajedrez, con una cookie específica, por ejemplo, search=1. ¿Cómo lo hago?

Estoy tratando de hacer lo siguiente:

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

Gracias de antemano

Author: Oleg Tarasenko, 2010-07-26

4 answers

Cookie es solo otro encabezado HTTP.

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

Vea urllib2 examples para otras formas de agregar encabezados 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ó anteriormente y envíelas automáticamente de nuevo en las siguientes solicitudes.

 110
Author: Messa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 14:51:38

Tal vez usando cookielib.CookieJar puede ayudarte. Por ejemplo, cuando se publica 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 voy a elaborar un poco. De los documentos:

La clase CookieJar almacena cookies HTTP. Extrae cookies de HTTP solicitudes, y las devuelve en respuestas HTTP. Instancias de CookieJar caducan automáticamente las cookies contenidas cuando sea necesario. Las subclases son también responsable de almacenar y recuperar cookies de un fichero o base.

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

Solo puedo hablar desde 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 exactamente eso, y lo hace de manera transparente.

 56
Author: Morten Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-03 19:38:26

Es posible que desee echar un vistazo a la excelente biblioteca HTTP Python llamada Requests. Hace que cada tarea que involucra 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 cookies:

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

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
 13
Author: Piotr Dobrogost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-02 20:07:32

Use cookielib. La página doc vinculada proporciona ejemplos al final. También encontrarás un tutorial aquí.

 5
Author: Marcelo Cantos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-26 12:39:25