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?

War es hilfreich?

Lösung

Sie könnten ein paar Dinge tun:

  1. Erstellen Sie Ihre HTTPRedirectHandler, die jeweils ab umleiten
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top