2017-07-06 7 views
0

Versuchen, Anfragen zu verwenden, um eine Liste von URLs herunterzuladen und die Ausnahme abzufangen, wenn es eine schlechte URL ist. Hier ist mein Testcode:Python mit Anfragen mit gültigem Hostnamen

import requests 
from requests.exceptions import ConnectionError 

#goodurl 
url = "http://www.google.com" 

#badurl with good host 
#url = "http://www.google.com/thereisnothing.jpg" 

#url with bad host 
#url = "http://somethingpotato.com"  

print url 
try: 
    r = requests.get(url, allow_redirects=True) 
    print "the url is good" 
except ConnectionError,e: 
    print e 
    print "the url is bad" 

Das Problem ist, wenn ich in url pass = „http://www.google.com“ alles funktioniert wie es sollte, und wie zu erwarten, da es eine gute URL ist.

http://www.google.com 
the url is good 

Aber wenn ich in url pass = "http://www.google.com/thereisnothing.jpg"

ich noch bekommen:

http://www.google.com/thereisnothing.jpg 
the url is good 

seine so fast wie seine nicht einmal etwas suchen nach dem "/"

nur um zu sehen, ob die Fehlerprüfung funktioniert überhaupt habe ich einen schlechten Hostnamen übergeben: #url = "http://somethingpotato.com"

, die die Fehlermeldung trat zurück ich erwartet hatte:

http://somethingpotato.com 
HTTPConnectionPool(host='somethingpotato.com', port=80): Max retries exceeded with url:/(Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f1b6cd15b90>: Failed to establish a new connection: [Errno -2] Name or service not known',)) 
the url is bad 

Was ich Anfrage erfassen eine schlechte URL nicht nur ein schlechter Hostnamen fehle zu machen?

Dank

Antwort

2

Anforderungen erstellen keine umwerfbare Ausnahme bei einer 404-Antwort. Stattdessen müssen Sie sie heraus filtern, werden überprüft, ob der Status 'ok' (HTTP-Antwort 200)

import requests 
from requests.exceptions import ConnectionError 

#goodurl 
url = "http://www.google.com/nothing" 

#badurl with good host 
#url = "http://www.google.com/thereisnothing.jpg" 

#url with bad host 
#url = "http://somethingpotato.com"  

print url 
try: 
    r = requests.get(url, allow_redirects=True) 
    if r.status_code == requests.codes.ok: 
     print "the url is good" 
    else: 
     print "the url is bad" 
except ConnectionError,e: 
    print e 
    print "the url is bad" 

EDIT: Importanforderungen von requests.exceptions importieren Connection

def printFailedUrl(url, response): 
    if isinstance(response, ConnectionError): 
     print "The url " + url + " failed to connect with the exception " + str(response) 
    else: 
     print "The url " + url + " produced the failed response code " + str(response.status_code) 

def testUrl(url): 
    try: 
     r = requests.get(url, allow_redirects=True) 
     if r.status_code == requests.codes.ok: 
      print "the url is good" 
     else: 
      printFailedUrl(url, r) 
    except ConnectionError,e: 
     printFailedUrl(url, e) 

def main(): 
    testUrl("http://www.google.com") #'Good' Url 
    testUrl("http://www.google.com/doesnotexist.jpg") #'Bad' Url with 404 response 
    testUrl("http://sdjgb") #'Bad' url with inaccessable url 

main() 

In In diesem Fall kann eine Funktion sowohl eine Ausnahmebedingung als auch eine Anfrageantwort erhalten. Auf diese Weise können Sie getrennte Antworten erhalten, wenn die URL eine nicht 'gute' (nicht 200) Antwort im Vergleich zu einer unbrauchbaren URL zurückgibt, die eine Ausnahme auslöst. Hoffe das hat die Information die du brauchst.

+0

Ich hatte gehofft, den eigentlichen Fehler (e) übergeben, da ich den Fehler in eine Datei schreiben möchte. Vielleicht kann ich anstelle von "url is bad" in der else-Anweisung r.status_code ausgeben (was schlecht sein sollte, wenn es zur else-Anweisung gehört). Würdest du das vorschlagen? – chowpay

+0

@chowpay Das Problem ist, dass es sich nicht wirklich um einen Fehler handelt, so dass Sie keinen Fehler zum Drucken finden können. Ich würde vorschlagen, eine benutzerdefinierte Funktion zu machen, um eine "Fehler" -URL auszudrucken, die die URL und den Statuscode enthalten könnte. Wenn Sie ein Beispiel möchten, könnte ich meine Antwort hinzufügen –

+0

ja bitte. danke – chowpay

0

, was Sie wollen, ist r.status_code zu überprüfen. Getting r.status_code auf "http://www.google.com/thereisnothing.jpg" gibt Ihnen 404. Sie können eine Bedingung für nur 200 Code-URL, um "gut" zu sein.