Comment puis-je empêcher le urllib de Python (2) de suivre une redirection

StackOverflow https://stackoverflow.com/questions/554446

  •  23-08-2019
  •  | 
  •  

Question

Je suis en train d'essayer de se connecter à un site en utilisant Python mais le site semble envoyer un cookie et une déclaration de redirection sur la même page. Python semble suivre redirigeant ainsi me empêcher de lire le cookie envoyé par la page de connexion. Comment puis-je empêcher le urllib de Python (ou urllib2) urlopen de suivre la redirection?

Était-ce utile?

La solution

Vous pouvez faire deux choses:

  1. Créez votre propre HTTPRedirectHandler interceptant redirigent chaque
  2. Créer une instance de HTTPCookieProcessor et d'installer cette ouverture afin que vous ayez accès au cookiejar.

Ceci est une petite chose rapide qui montre à la fois

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

Autres conseils

Si tout ce que vous avez besoin est redirection d'arrêt, alors il est un moyen simple de le faire. Par exemple, je veux seulement obtenir les cookies et pour une meilleure performance que je ne veux pas être redirigé vers une autre page. J'espère aussi que le code est conservé comme 3xx. nous allons utiliser 302 par exemple.

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 cette façon, vous ne même pas besoin d'aller dans urllib2.HTTPRedirectHandler.http_error_302 ()

Pourtant, plus le cas commun est que nous voulons simplement arrêter la redirection (si nécessaire):

class NoRedirection(urllib2.HTTPErrorProcessor):

    def http_response(self, request, response):
        return response

    https_response = http_response

Et utiliser normalement cette façon:

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 appelle build_opener() qui utilise cette liste des classes de gestionnaire:

handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]

Vous pouvez essayer d'appeler vous urllib2.build_opener(handlers) avec une liste qui omet HTTPRedirectHandler, puis appeler la méthode open() sur le résultat pour ouvrir votre URL. Si vous n'aimez pas vraiment réoriente, vous pouvez même appeler urllib2.install_opener(opener) à votre propre ouvre non redirigeant.

Il semble que votre vrai problème est que urllib2 est de ne pas faire les cookies de la façon dont vous le souhaitez. Voir aussi Comment utiliser Python pour vous connecter à une page Web et de récupérer les cookies pour une utilisation ultérieure?

a posé cette question .

EDIT: Si vous avez à traiter avec des applications web originales vous devriez probablement essayer sur mécaniser . Il est une grande bibliothèque qui simule un navigateur Web. Vous pouvez contrôler les cookies, redirection, ... Si la page rafraichit le site ne compte pas [beaucoup] JavaScript, vous obtiendrez le long très bien avec mécaniser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top