2010-03-11 14 views
7

Así que estoy buscando en urllib3 porque tiene agrupación de conexiones y es seguro para subprocesos (por lo que el rendimiento es mejor, especialmente para rastrear), pero la documentación es ... mínimo, por decir lo menos. urllib2 tiene build_opener así que algo como:Python urllib3 y cómo manejar el soporte de cookies?

#!/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 haya una mejor manera y que uno de ustedes pueda decirme qué es. También alguien puede etiquetar esto con "urllib3" por favor.

+0

@bigredbob, etiquetado como usted pidió. He revisado las fuentes de urllib3 y parece que no tiene ninguno de los ajustes y giros de urllib2, incluidos los objetos 'Opener', así que dudo que haya una varita mágica para ti. Esperemos que madure con el tiempo, ya que es bastante inmaduro a partir de ahora! -) –

Respuesta

9

Está en lo correcto, no hay una manera mejor inmediata de hacerlo ahora. Estaría más que feliz de aceptar un parche si tiene una mejora congruente.

Una cosa a tener en cuenta, el HTTPConnectionPool de urllib3 está destinado a 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 grupo real.

  • shazow (el autor de urllib3)
+0

Si supiera cómo parchar esto, me encantaría, pero no soy tan bueno. Es bueno saber que al menos no lo estoy haciendo mal. – bigredbob

1

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

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

+0

Sí, eso fue un error tipográfico, pero mi pregunta sigue en pie, me gustaría una mejor manera (es decir, el uso de built-ins). – bigredbob

2

¿No hay un problema con varias cookies?

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

httplib2 tiene un problema similar.

O quizá 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 hay varios campos de cabecera con el se producen mismo nombre, que se combinan de acuerdo con las reglas de RFC 2616 seg 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. 

por lo 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á sucediendo aquí, pero desde skimming RFC 2616 ("Hypertext Transfer Protocol - HTTP/1.1") y RFC 2965 ("HTTP State Management Mechanism") tengo la impresión de que cualquier coma dentro de un encabezado el valor se supone que se cotiza.

+0

RFC6265 dice que Set-Cookie debe tener una cubierta especial para manejar esto. httplib no lo está haciendo en python 2 ... ver http://bugs.python.org/issue1660009 – reteptilian

2

Debe utilizar la biblioteca de solicitudes. Utiliza urllib3 pero hace que cosas como agregar cookies sean triviales.

https://github.com/kennethreitz/requests

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

¿Se supone que esto debe agregar una cookie a mi navegador? Si es así, ¿cuáles son algunas de las razones por las que no funcionaría? Probé esto en mi sitio web local corriendo en el servidor apache, Windows 10, Python 2.75. –

1

Se puede utilizar 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

Cuestiones relacionadas