Wie verhindere ich, Python urllib (2) im Anschluss an eine Umleitung
Frage
Ich bin derzeit versucht, in eine Website anmelden Python jedoch die Website sendet ein Cookie zu sein scheint und eine Umleitung Anweisung auf der gleichen Seite. Python scheint folgendes zu sein, die so mir-Redirect zu verhindern, indem die Anmeldeseite das Cookie senden aus der Lektüre. Wie verhindere ich, Python urllib (oder urllib2) urlopen aus nach der Umleitung?
Lösung
Sie könnten ein paar Dinge tun:
- Erstellen Sie Ihre HTTPRedirectHandler, die jeweils ab umleiten
- eine Instanz von HTTPCookieProcessor erstellen und diesen Opener installieren, so dass Sie Zugriff auf die cookiejar haben.
Dies ist eine kurze kleine Sache, die zeigt sowohl
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
Andere Tipps
Wenn alles, was Sie brauchen, ist die Umleitung zu stoppen, dann gibt es eine einfache Möglichkeit, es zu tun. Zum Beispiel möchte ich Cookies bekommen nur und für eine bessere Leistung möchte ich nicht auf eine andere Seite umgeleitet werden. Auch ich hoffe, der Code wird als 3xx gehalten. Lassen Sie sich 302 zum Beispiel verwendet werden.
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)
Auf diese Weise brauchen Sie nicht einmal in urllib2.HTTPRedirectHandler.http_error_302 gehen ()
Noch häufiger Fall ist, dass wir einfach stoppen Umleitung wollen (je nach Bedarf):
class NoRedirection(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
return response
https_response = http_response
Und normalerweise es auf diese Weise verwendet werden:
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
nennt build_opener()
, die diese Liste der Handler-Klassen verwendet:
handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]
Sie könnten versuchen, sich mit einer Liste aufrufen urllib2.build_opener(handlers)
die HTTPRedirectHandler
weglässt, dann auf das Ergebnis der open()
Methode rufen Sie Ihre URL zu öffnen. Wenn Sie wirklich Umleitungen nicht mögen, könnten Sie sogar urllib2.install_opener(opener)
Ihre eigene nicht-Ablen Opener nennen.
Es klingt wie Ihr eigentliches Problem, dass urllib2
ist nicht Cookies, um die Art und Weise zu tun, wenn Sie möchten. Siehe auch Wie Python verwenden, um eine Webseite einzuloggen und abrufen von Cookies für eine spätere Verwendung?
Diese Frage wurde gefragt, bevor hier .
EDIT: Wenn Sie mit skurrile Web-Anwendungen zu tun haben, sollten Sie vielleicht versuchen, mechanisieren . Es ist eine große Bibliothek, die einen Web-Browser simuliert. Sie können Umleiten, Cookies steuern, Seite aktualisiert ... Wenn die Website nicht [stark] auf JavaScript angewiesen ist, werden Sie sich sehr gut mit mechanize erhalten.