¿Python urllib3 y cómo manejar el soporte de cookies?

Por lo tanto, estoy buscando en urllib3 porque tiene agrupación de conexiones y es seguro para subprocesos (por lo que el rendimiento es mejor, especialmente para el rastreo), pero la documentación es … mínima, como mínimo. urllib2 tiene build_opener así que algo como:

#!/usr/bin/python import cookielib, urllib2 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) r = opener.open("http://example.com/") 

Pero urllib3 no tiene un método build_opener, por lo que la única manera que he descubierto hasta ahora es ponerlo manualmente en el encabezado:

 #!/usr/bin/python import urllib3 http_pool = urllib3.connection_from_url("http://example.com") myheaders = {'Cookie':'some cookie data'} r = http_pool.get_url("http://example.org/", headers=myheaders) 

Pero espero que haya una mejor manera y que uno de ustedes pueda decirme cuál es. También puede alguien etiquetar esto con “urllib3” por favor.

Estás en lo cierto, no hay una mejor manera de hacer esto ahora mismo. Estaría más que feliz de aceptar un parche si tiene una mejora congruente.

Una cosa a tener en cuenta, la HTTPConnectionPool de urllib3 pretende ser un “grupo de conexiones” para un host específico, en lugar de un cliente con estado. En ese contexto, tiene sentido mantener el seguimiento de las cookies fuera del conjunto real.

  • shazow (el autor de urllib3)

¿No hay un problema con las cookies múltiples?

Algunos servidores devuelven múltiples encabezados Set-Cookie, pero urllib3 almacena los encabezados en un dict y un dict no permite múltiples entradas con la misma clave.

httplib2 tiene un problema similar.

O tal vez no: resulta que el método de encabezados de lectura de la clase HTTPMessage en el paquete httplib, que utilizan tanto urllib3 como httplib2, tiene el siguiente comentario:

Si aparecen varios campos de encabezado con el mismo nombre, se combinan de acuerdo con las reglas en RFC 2616 sec 4.2:

  Appending each subsequent field-value to the first, each separated by a comma. The order in which header fields with the same field-name are received is significant to the interpretation of the combined field value. 

Así que no se pierden los encabezados.

Sin embargo, existe un problema si hay comas dentro de un valor de encabezado. Todavía no he descubierto lo que está pasando aquí, pero a partir del análisis de RFC 2616 (“Protocolo de transferencia de hipertexto – HTTP / 1.1”) y RFC 2965 (“Mecanismo de administración de estado HTTP”) tengo la impresión de que cualquier coma dentro de un encabezado Se supone que el valor debe ser citado.

Debe configurar 'Cookie' no 'Set-Cookie' , 'Set-Cookie' configurado por el servidor web.

Y las cookies son uno de los encabezados, así que no hay nada de malo en hacer eso.

Debe utilizar la biblioteca de solicitudes. Utiliza urllib3 pero hace que agregar cookies sea algo trivial.

https://github.com/kennethreitz/requests

 import requests r1 = requests.get(url, cookies={'somename':'somevalue'}) print(r1.content) 

Puedes usar un código como este:

 def getHtml(url): http = urllib3.PoolManager() r = http.request('GET', url, headers={'User-agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36','Cookie':'cookie_name=cookie_value'}) return r.data #HTML 

Debes reemplazar cookie_name y cookie_value