Pregunta

Así que estoy buscando en urllib3 porque tiene la agrupación de conexiones y es seguro para hilos ( por lo que el rendimiento es mejor, especialmente para el rastreo), pero la documentación es mínima ... por decir lo menos. 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 tiene ningún método build_opener, por lo que la única manera que he descubierto hasta ahora es ponerlo manualmente en la cabecera:

#!/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 estoy esperando que hay una manera mejor y que uno de ustedes me puede decir lo que es. También puede etiquetar este alguien con "urllib3" por favor.

¿Fue útil?

Solución

Tiene razón, no hay inmediatamente mejor manera de hacer esto ahora. Yo estaría más que feliz de aceptar un parche si tiene una mejora congruentes.

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

  • shazow (el autor de urllib3)

Otros consejos

¿No hay un problema con varias cookies?

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

httplib2 tiene un problema similar.

O tal vez no: resulta que el método de la clase readheaders HttpMessage en el paquete httplib - el que tanto urllib3 y httplib2 uso - tiene el siguiente comentario:

  

Si se producen varios campos de cabecera 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 hay cabeceras se pierden.

Hay, sin embargo, un problema si hay comas dentro de un valor de encabezado. Todavía no he descubierto lo que está pasando aquí, pero a partir de espuma RFC 2616 ( "Protocolo de Transferencia de Hipertexto - HTTP / 1.1") y RFC 2965 ( "Mecanismo de HTTP Estado de Gestión") Me da la impresión de que todas las comas dentro de una cabecera valor se supone que debe ser citado.

Es necesario establecer 'Cookie' no 'Set-Cookie', 'Set-Cookie' establecido por el servidor web.

Y cookies son una de las cabeceras, por lo que no es nada malo en hacer de esa manera.

Se debe utilizar la biblioteca de solicitudes. Utiliza urllib3 pero hace cosas como la adición de galletas trivial.

https://github.com/kennethreitz/requests

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

Puede usar un código como el siguiente:

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

Debe reemplazar cookie_name y cookie_value

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top