Statuscode von Domains abfragen

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
volli
User
Beiträge: 3
Registriert: Montag 22. August 2011, 12:32

Hallo zusammen,

Vorweg: Ich hoffe diese Frage wird hier keinen nerven oder stören weil es zu basic ist aber ich häng hier gerade etwas fest :(
Zu mir: Ich bin kein Programmierer, neben einigen Grundlagen im Bereich PHP habe ich eigentlich immer nur an HTML und CSS gearbeitet. Ich hoffe aber in Zukunft etwas mehr Richtung Python zu schwenken da ich an sich von der Sprache Überzeugt bin und denke, dass diese mir einiges an Arbeit abnehmen kann wenn ich erstmal den Durchblick habe.
Zur Fragestellung: Ich will unsere 600 Firmendomains überprüfen, es gibt eine Liste in der alle Domains eingetragen sind jedoch sind ~5-10% dieser momentan nicht zu erreichen. Jetzt würde ich gerne diese Liste durch Python jagen und schauen was für Statuscodes mir ausgegben werden. Also 200 -> Found oder 302, 301 oder eben 404.
Ein erster Ansatz für das Ganze sieht bei mir so aus (Funktioniert aber nicht):

Python 2.7.2

Code: Alles auswählen


import httplib
domainliste = open('domainliste.txt', 'r')
for domain in domainliste:
    conn = httplib.HTTPConnection(domain)
    conn.request("HEAD", "/")
    r1 = conn.getresponse()
    print domain, r1.status, r1.reason
    conn.close()

Der Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python27\MyStuff\domainstatuscheck.py", line 5, in <module>
    conn.request("HEAD", "/")
  File "C:\Python27\lib\httplib.py", line 955, in request
    self._send_request(method, url, body, headers)
  File "C:\Python27\lib\httplib.py", line 989, in _send_request
    self.endheaders(body)
  File "C:\Python27\lib\httplib.py", line 951, in endheaders
    self._send_output(message_body)
  File "C:\Python27\lib\httplib.py", line 811, in _send_output
    self.send(msg)
  File "C:\Python27\lib\httplib.py", line 773, in send
    self.connect()
  File "C:\Python27\lib\httplib.py", line 754, in connect
    self.timeout, self.source_address)
  File "C:\Python27\lib\socket.py", line 553, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
gaierror: [Errno 11004] getaddrinfo failed
Meine Vermutung:
Wenn ich mir jetzt in der Python Shell, nach der Fehlermeldung, die Variable domain ausgeben lasse sieht diese wie folgt aus '["www.domain1.de",\n' also denke ich, dass es etwas mit dem Zeilenumbruch durch \n zu tun hat.
Könnt ihr mir Stichwörter liefern wonach ich suchen kann um das Problem zu lösen oder einen Hinweis wie ich das Programm modifizieren kann?
Ich kann natürlich hergehen und das Programm so aufbauen:

Code: Alles auswählen

import httplib
domains = ["www.domain1.de", "www.domain2.de", "www.domain3.de", "etc..."]
for i in domains:
    conn = httplib.HTTPConnection(i)
    conn.request("HEAD", '/')
    r1 = conn.getresponse()
    print i, r1.status, r1.reason
    conn.close()
Aber ich würde es lieber aus der Textdatei auslesen und später (wenn alles soweit klappt) im nächsten Schritt dann den Status hinter die Domain schreiben lassen.

Viele Grüße,

Volli
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Wie sieht denn die Datei mit den Domains aus? Das Ergbnis deines `print`s lässt vermuten, dass sie die Form

Code: Alles auswählen

["www.domain1.de",
"www.domain2.de",
...
]
hat. Das wäre natürlich absoluter Unsinn, da von dir das Format:

Code: Alles auswählen

www.domain1.de
www.domain2.de
...
erwartet wird. Unnötige Whitspaces am Anfang und am Ende von Strings bekommst du mit der `strip`-Methode auf Strings wieder weg.

Sebastian
Das Leben ist wie ein Tennisball.
volli
User
Beiträge: 3
Registriert: Montag 22. August 2011, 12:32

Hallo Sebastian,

Danke für deine Antwort! Du hattest tatsächlich recht, ich hatte die Domains blöder weise so:

Code: Alles auswählen

["www.domain1.de",
"www.domain2.de",
...
]
im Textdokument...man bin ich belämmert :-) (das sind Reste von vorherigen Experimenten)

ich habe jetzt alle " , und [] entfernt und die Datei richtig aufgebaut.

jetzt sieht das ganze so aus:

Code: Alles auswählen

www.domain1.de
www.domain2.de
...
wenn ich die Variable domain ausgebe dann bekommen ich folgendes 'www.domain.de\n'. Wie kann ich dieses \n daraus entfernen? Benötige ich dafür RE oder gibt es da was schmerzfreieres? :o)

Viele Grüße

Volli

E: mit conn = httplib.HTTPConnection (domain.strip()) läuft das ganze schon mal durch! Der Tipp Ging also in die richtige Richtung!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

volli hat geschrieben:Wie kann ich dieses \n daraus entfernen? Benötige ich dafür RE oder gibt es da was schmerzfreieres?
EyDu hat geschrieben:Unnötige Whitspaces am Anfang und am Ende von Strings bekommst du mit der `strip`-Methode auf Strings wieder weg.

Sebastian
Deine Frage wurde also schon beantwortet.
volli
User
Beiträge: 3
Registriert: Montag 22. August 2011, 12:32

Damit ihr noch was zum lachen habt:

Code: Alles auswählen

import httplib
domainliste = open('domainliste.txt', 'r')
for domain in domainliste:
    conn = httplib.HTTPConnection (domain.strip())
    conn.request("HEAD", "/")
    r1 = conn.getresponse()
    #print domain, r1.status, r1.reason
    status = open('domainstatus.csv', 'a')
    status.write(domain.strip())
    status.write(',')
    status.write(str(r1.status))
    status.write(',')
    status.write(str(r1.reason))
    status.write('\n')
    conn.close()
print ("Done!")
Wahrscheinlich nicht die wirklich perfekte Lösung aber Sie läuft :-)

Grüße

Volli
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mit with vergisst man das schliessen nicht mehr:

Code: Alles auswählen

import httplib
with open('domainliste.txt') as domainliste, open('domainstatus.csv', 'w') as status:
    for domain in domainliste:
        domain = domain.strip()
        with httplib.HTTPConnection(domain) as conn:
            conn = httplib.HTTPConnection (domain.strip())
            conn.request("HEAD", "/")
            r1 = conn.getresponse()
            status.write("%s,%s,%s\n" % (domain, r1.status, r1.reason))
print ("Done!")
Der naechste schritt waere das csv-Modul um sicherzustellen, dass auch wirklich gueltiges csv rauskommt.

Eventuell ist bei der connection noch ein `contextlib.closing` noetig, ich bin nicht so fit was die Contextmanager in Python3 angeht ;)

Und wenn das kein Python3 ist, solltest du die Klammern bei print weglassen.
Antworten