2012-11-20 13 views
8

Was ich meine ist, wenn ich auf "www.yahoo.com/thispage" gehe, und yahoo hat einen Filter eingerichtet, um/thispage zu/thepageumzuleiten. Wenn jemand auf diese Seite geht, landet er auf der Seite.Wenn ich Python-Anfragen verwende, um eine Site zu überprüfen, werde ich wissen, ob die Site mich auf eine andere Seite weiterleitet?

Wenn ich httplib/requests/urllib verwende, weiß es, dass es eine Umleitung gab? Welche Fehlerseiten? Einige Websites leiten den Benutzer an die/errorpage weiter, wenn die Seite nicht gefunden werden kann.

+2

Was ist das Problem, das Sie versuchen zu lösen? Wie macht dein Code das Richtige? Wenn Sie nur über Fehlermodi informiert werden möchten, testen Sie dieses Verhalten selbst. – Marcin

+1

Prüfen Sie http://StackOverflow.com/Questions/554446/How-do-i-Prevent-pythons-URllib2-from-following-a-redirect – OneOfOne

+0

@Marcin Ich habe eine riesige Liste (1k +) von URLs zu testen, ob sie sind oder nicht. Ich wählte zufällig 40-50 von ihnen aus, um manuell zu testen, ich sehe, dass einige auf eine Fehlerseite umgeleitet werden, wenn eine Seite nicht gefunden werden kann. Auch ich sehe viele URLs umgeleitet worden, weil das URL-Muster geändert wurde, die gleichen Namen nur anders geschrieben. – iCodeLikeImDrunk

Antwort

13

Mit requests erhalten Sie eine Liste aller Weiterleitungen im .history Attribut des Antwortobjekts. Es gibt eine Python-Liste zurück. Siehe die documentation für mehr.

1

Es hängt davon ab, wie sie die Umleitung vornehmen. Der "richtige" Weg besteht darin, einen umgeleiteten HTTP-Statuscode (301/302/303) zurückzugeben. Der "falsche" Weg besteht darin, ein Refresh-Meta-Tag in den HTML-Code einzufügen.

Wenn sie das ehemalige tun, requests wird es transparent behandeln. Beachten Sie, dass bei jeder fehlerhaften Seitenumleitung immer noch ein Fehlerstatuscode (z. B. 404) angezeigt wird, den Sie als response.status_code überprüfen können.

9

Um Anfragen von folgenden Umleitungen zu verhindern verwenden:

r = requests.get('http://www.yahoo.com/thispage', allow_redirects=False)

Wenn es in der Tat eine Umleitung ist, können Sie die Umleitung Zielort in r.headers überprüfen [ ‚Standort‘].

1

Die akzeptierte Antwort ist die korrekte erste Option, aber in einigen Fällen, wenn die Site mit einem Meta-Tag umleitet, wird auch eine kanonische Verbindung angegeben, sobald sie umgeleitet wird. In diesem Beispiel möchte ich versuchen, http://en.wikipedia.org/wiki/Google_Inc_Class_A von Wikipedia anzufordern, die eine URL ist, die umleitet.

>> request = requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A') 

ich überprüfen, und:

>> request.history 
[] 

Eine Alternative ist zu versuchen, und die kanonische URL zu ziehen, die hoffentlich haben sollten, was Sie bisher sind umgeleitet. (Man beachte, ich bin mit BeautifulSoup auch hier)

>> soup = BeautifulSoup(request._content) 
>> canonical = soup.find('link', {'rel': 'canonical'}) 
>> canonical['href'] 
'http://en.wikipedia.org/wiki/Google' 

dem die URL Sie in diesem speziellen Fall erhalten umgeleitet entspricht. Um es klar zu sagen, dies ist eine hässliche zweite Option, aber einen Versuch wert, wenn alles andere fehlschlägt.

+0

Für zukünftige Leser: Ich habe gerade dieses Beispiel überprüft und der Verlauf ist korrekt ausgefüllt: 'requests.get ('http://en.wikipedia.org/wiki/Google_Inc_Class_A', allow_redirects = True)'. Ich weiß nicht, ob es auf "allow_redirects" -Parameter oder auf eine neue Version des Requests-Pakets zurückzuführen ist. – boh