ejemplos - urllib2.request python 3
¿Cómo evito que el urllib(2) de Python siga una redirección (4)
Esta pregunta fue hecha antes here .
EDITAR: Si tiene que lidiar con aplicaciones web peculiares, probablemente debería probar mechanize . Es una gran biblioteca que simula un navegador web. Puedes controlar el redireccionamiento, las cookies, las actualizaciones de página ... Si el sitio web no depende [en gran medida] de JavaScript, te llevarás muy bien con mechanize.
Actualmente estoy tratando de iniciar sesión en un sitio usando Python, sin embargo, el sitio parece estar enviando una cookie y una declaración de redirección en la misma página. Python parece estar siguiendo ese redireccionamiento, impidiéndome leer la cookie enviada por la página de inicio de sesión. ¿Cómo evito que urllib (o urllib2) urlopen de Python siga el redireccionamiento?
Si todo lo que necesita es detener la redirección, entonces hay una manera simple de hacerlo. Por ejemplo, solo quiero obtener cookies y, para un mejor rendimiento, no quiero ser redirigido a ninguna otra página. También espero que el código se mantenga como 3xx. usemos 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 forma, ni siquiera necesitas entrar en urllib2.HTTPRedirectHandler.http_error_302 ()
Sin embargo, el caso más común es que simplemente queremos detener la redirección (según se requiera):
class NoRedirection(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
return response
https_response = http_response
Y normalmente lo usa 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 a build_opener()
que usa esta lista de clases de controlador:
handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]
Puede intentar llamar a urllib2.build_opener(handlers)
usted mismo con una lista que omita HTTPRedirectHandler
, luego llame al método open()
en el resultado para abrir su URL. Si realmente no te gustan los redireccionamientos, incluso urllib2.install_opener(opener)
llamar a urllib2.install_opener(opener)
a tu propio abridor sin redireccionamiento.
Parece que tu verdadero problema es que urllib2
no está haciendo las cookies como a ti te gustaría. Consulte también ¿Cómo usar Python para iniciar sesión en una página web y recuperar cookies para usarlas posteriormente?
Puedes hacer un par de cosas:
- Cree su propio HTTPRedirectHandler que intercepte cada redirección
- Cree una instancia de HTTPCookieProcessor e instale ese abridor para que tenga acceso al cookiejar.
Esta es una pequeña cosa rápida que muestra ambos
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