Datei im Internet auf Existenz prüfen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Hallo zusammen,

ich lade Fondsdaten von der Comdirekt:

Code: Alles auswählen

for i in range (50):   
   urllib.urlretrieve("http://www.comdirect.de/"\
   + "inf/kursdaten/historic.csv?DATETIME_TZ_START_RANGE_FORMATED=1.1.1990"\
   + "&ID_NOTATION=3230170&INTERVALL=16&OFFSET=" + str(i)\
   + "&DATETIME_TZ_END_RANGE_FORMATED=" + heute + "&WITH_EARNINGS=true"\
   , str(id) + "/offset%03i.csv" %i)
Jetzt weiss ich nicht im Voraus, wieviele Dateien das sind. Ich würde gerne eine while-Schleife verwenden und die Datei nur laden, wenn es eine csv ist. In diesem Beispiel sind es 31 Dateien, die Dateien 32 aufwärts sind eine html-Datei. Wie könnte ich vorher prüfen, ob die Datei exisitert? Danke.

Grüße Bastian
deets

Kannst du nicht. Aber je nach request koenntest du auf den zurueckgegebenen Content-type gucken, ob's noch CSV ist oder HTML.
lunar

@BasiL: An dieser Stelle ist vielleicht auch der Hinweis angebracht, dass so etwas wie „Dateien“ in HTTP nicht existiert. HTTP kennt nur Anfragen an Adressen, und Antworten mit Daten. Versuche nicht, HTTP-Ressourcen so zu verarbeiten, wie man Dateien verarbeiten.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

deets hat geschrieben:Aber je nach request koenntest du auf den zurueckgegebenen Content-type gucken, ob's noch CSV ist oder HTML.
Danke, das wäre ja auch ok. Wie müsste ich das machen?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Eine Möglichkeit wäre es zu schauen ob man einen 404-Error erwischt hat (wie ihn die meisten Seiten zurückgeben wenn man auf etwas nicht vorhandenes zugreift). Wenn ich requests nutze, vergleiche ich dafür das Attribut status_code der Anfrage mit einem Zahlenwert:

Code: Alles auswählen

>>> import requests
>>> r = requests.get("http://www.google.de/images/srpr/logo3w.png")
>>> r.status_code
200
>>> r = requests.get("http://www.google.de/images/not_available.png")
>>> r.status_code
404
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

webspider hat geschrieben:Wenn ich requests nutze [...]
Falls das jemand, so wie ich, nicht auf Anhieb verstanden hat -> requests.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Da hab ich wohl tatsächlich vergessen darauf zu verlinken, aber nun gut. Ich bin mir sicher, dass man die Vorgehensweise ebenfalls auf die mitgelieferten Module anwenden kann und finde sie eher zugänglich als die Abfrage des Content-type (welche bei dem Beispielcode des verlinkten Moduls auch demonstriert wird).
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

webspider hat geschrieben:Ich bin mir sicher, dass man die Vorgehensweise ebenfalls auf die mitgelieferten Module anwenden kann
Ja, und solche trivialen Abfragen sind jetzt auch nicht übelst kompliziert:

Code: Alles auswählen

>>> from urllib import urlopen
>>> conn = urlopen("http://www.google.de/")
>>> conn.getcode()
200
>>> conn.info()["Content-Type"]
'text/html; charset=ISO-8859-1'
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

DAnke,

waren tole Tipps. Ich habe es jetzt über den Dateityp umgesetzt.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Übrigens sollte ein HEAD-Request anstelle eines GET-Requests reichen, um zu schauen, ob eine Ressource zu einer URL existiert. Das überträgt weniger Daten und ist damit für Client und Server effizienter.

Stefan
Antworten