Comment puis-je empêcher le urllib de Python (2) de suivre une redirection
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?
La solution
Vous pouvez faire deux choses:
- Créez votre propre HTTPRedirectHandler interceptant redirigent chaque
- 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?
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.