¿Cómo evito que urllib de Python (2) de seguir una redirección
Pregunta
Actualmente estoy tratando de iniciar sesión en un sitio usando Python sin embargo, el sitio parece estar enviando una galleta y una declaración de redirección en la misma página. Python parece ser que redirigen siguiente evitando así que me de la lectura de la cookie de enviar por la página de inicio de sesión. ¿Cómo evito que urllib de Python (o urllib2) urlopen de seguir el redireccionamiento?
Solución
Se podría hacer un par de cosas:
- Construir su propia HTTPRedirectHandler que intercepta cada redireccionamiento
- Crea una instancia de HTTPCookieProcessor e instalar que el abridor para que tenga acceso a la CookieJar.
Esta es una pequeña cosa rápida que muestra tanto
import urllib2
#redirect_handler = urllib2.HTTPRedirectHandler()
class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
print "Cookie Manip Right Here"
return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
http_error_301 = http_error_303 = http_error_307 = http_error_302
cookieprocessor = urllib2.HTTPCookieProcessor()
opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor)
urllib2.install_opener(opener)
response =urllib2.urlopen("WHEREEVER")
print response.read()
print cookieprocessor.cookiejar
Otros consejos
Si todo lo que necesita es detener la redirección, entonces hay una forma sencilla de hacerlo. Por ejemplo yo sólo quiero conseguir las cookies y para un mejor rendimiento que no quiero ser redirigido a cualquier otra página. También espero que el código se mantiene como 3xx. vamos a utilizar 302 por ejemplo.
class MyHTTPErrorProcessor(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
code, msg, hdrs = response.code, response.msg, response.info()
# only add this line to stop 302 redirection.
if code == 302: return response
if not (200 <= code < 300):
response = self.parent.error(
'http', request, response, code, msg, hdrs)
return response
https_response = http_response
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MyHTTPErrorProcessor)
De esta manera, usted ni siquiera necesita para entrar en urllib2.HTTPRedirectHandler.http_error_302 ()
Sin embargo, el caso más común es que simplemente queremos dejar de redirección (según sea necesario):
class NoRedirection(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
return response
https_response = http_response
Y normalmente usarlo de esta manera:
cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoRedirection, urllib2.HTTPCookieProcessor(cj))
data = {}
response = opener.open('http://www.example.com', urllib.urlencode(data))
if response.code == 302:
redirection_target = response.headers['Location']
urllib2.urlopen
llama build_opener()
que utiliza esta lista de clases de controlador:
handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]
Se podría intentar llamar urllib2.build_opener(handlers)
a sí mismo con una lista que omite HTTPRedirectHandler
, a continuación, llamar al método open()
en el resultado de abrir su dirección URL. Si realmente desagrada redirecciones, incluso se podría llamar urllib2.install_opener(opener)
a su propio abridor no redireccionamiento.
Parece que su verdadero problema es que urllib2
no está haciendo galletas de la forma en que desea. Ver también Cómo utilizar Python para acceder a una página web y recuperar las cookies para un uso posterior?
Esta pregunta se hizo antes de aquí .
editar Si usted tiene que hacer frente a las aplicaciones web extravagantes probablemente debería probar mecanizar . Es una gran biblioteca que simula un navegador web. Puede controlar redireccionamiento, galletas, página se actualiza ... Si la página web no se basa [en gran medida] en JavaScript, que obtendrá a lo largo muy bien con mecanizar.