Ich möchte sehen, ob ich auf eine Online-API zugreifen kann, aber dafür muss ich über einen Internetzugang verfügen.
Wie kann ich feststellen, ob mit Python eine Verbindung verfügbar und aktiv ist?
python
networking
aF.
quelle
quelle
easy_install system_of_tubes
Antworten:
Vielleicht könnten Sie so etwas gebrauchen:
Derzeit ist 216.58.192.142 eine der IP-Adressen für google.com. Wechseln Sie
http://216.58.192.142
zu einer beliebigen Site, von der erwartet werden kann, dass sie schnell reagiert .Diese feste IP wird nicht für immer auf google.com abgebildet. Dieser Code ist also nicht robust - er muss ständig gewartet werden, damit er funktioniert.
Der Grund, warum der obige Code eine feste IP-Adresse anstelle eines vollqualifizierten Domänennamens (FQDN) verwendet, liegt darin, dass ein FQDN eine DNS-Suche erfordern würde. Wenn der Computer keine funktionierende Internetverbindung hat, blockiert die DNS-Suche selbst den Anruf möglicherweise
urllib_request.urlopen
länger als eine Sekunde. Vielen Dank an @rzetterberg für diesen Hinweis.Wenn die oben angegebene feste IP-Adresse nicht funktioniert, können Sie eine aktuelle IP-Adresse für google.com (unter Unix) finden, indem Sie ausführen
quelle
urlopen
dauert nicht viel länger als 1 Sekunde, auch wenn das Internet nicht eingeschaltet ist." - Zitat. Dies ist nicht der Fall, wenn die angegebene URL ungültig ist. Die DNS-Suche wird blockiert. Dies gilt nur für die tatsächliche Verbindung zum Webserver. Der einfachste Weg, um diesen DNS-Suchblock zu vermeiden, besteht darin, stattdessen die IP-Adresse zu verwenden. Dann dauert es garantiert nur 1 Sekunde :)http://google.com
und dann lösen Sie alle Probleme, über die hier immer wieder gesprochen wird. Es ist nicht erforderlich, eine IP-Adresse zu verwenden ...Wenn wir eine Verbindung zu einem Internet-Server herstellen können, haben wir tatsächlich Konnektivität. Für den schnellsten und zuverlässigsten Ansatz sollten jedoch alle Lösungen mindestens die folgenden Anforderungen erfüllen:
Um dies zu erreichen, könnte ein Ansatz darin bestehen, zu überprüfen, ob einer der öffentlichen DNS-Server von Google erreichbar ist. Die IPv4-Adressen für diese Server sind
8.8.8.8
und8.8.4.4
. Wir können versuchen, eine Verbindung zu einem von ihnen herzustellen.Eine kurze Nmap des Hosts
8.8.8.8
ergab das folgende Ergebnis:Wie wir sehen können,
53/tcp
ist offen und nicht gefiltert. Wenn Sie kein Root-Benutzer sind, denken Sie daran,sudo
das-Pn
Argument für Nmap zu verwenden, um gestaltete Testpakete zu senden und festzustellen, ob ein Host aktiv ist.Bevor wir es mit Python versuchen, testen wir die Konnektivität mit einem externen Tool, Netcat:
Netcat bestätigt , dass wir erreichen können
8.8.8.8
über53/tcp
. Jetzt können wir eine Socket-Verbindung zu8.8.8.8:53/tcp
in Python einrichten , um die Verbindung zu überprüfen:Ein anderer Ansatz könnte darin bestehen, einen manuell erstellten DNS-Test an einen dieser Server zu senden und auf eine Antwort zu warten. Ich gehe jedoch davon aus, dass es sich im Vergleich zu Paketverlusten, Fehlern bei der DNS-Auflösung usw. als langsamer erweisen könnte. Bitte kommentieren Sie, wenn Sie etwas anderes denken.
UPDATE 1: Dank des Kommentars von @ theamk ist das Zeitlimit jetzt ein Argument und
3s
wird standardmäßig initialisiert .UPDATE 2: Ich habe schnelle Tests durchgeführt, um die schnellste und allgemeinste Implementierung aller gültigen Antworten auf diese Frage zu ermitteln. Hier ist die Zusammenfassung:
Und noch einmal:
True
In der obigen Ausgabe bedeutet dies, dass alle diese Implementierungen der jeweiligen Autoren die Konnektivität zum Internet korrekt identifizieren. Die Zeit wird mit einer Auflösung von Millisekunden angezeigt.UPDATE 3: Nach der Änderung der Ausnahmebehandlung erneut getestet:
quelle
close()
die Steckdose anrufen ?Es ist schneller, nur eine HEAD-Anfrage zu stellen, damit kein HTML-Code abgerufen wird.
Ich bin mir auch sicher, dass Google es auf diese Weise besser mögen würde :)
quelle
Als Alternative zu den Antworten von ubutnu / Kevin C verwende ich das
requests
Paket wie folgt :Bonus: Dies kann auf diese Funktion erweitert werden, die eine Website pingt.
quelle
google.com
erneut pingen , blockieren sie unsere IP. Gibt es einen anderen Weg?Nur um zu aktualisieren, was unutbu für neuen Code in Python 3.2 gesagt hat
Und um nur zu beachten, die Eingabe hier (Referenz) ist die URL, die Sie überprüfen möchten: Ich schlage vor, etwas zu wählen, das sich schnell mit Ihrem Wohnort verbindet - dh ich lebe in Südkorea, daher würde ich wahrscheinlich auf http: / verweisen. /www.naver.com .
quelle
Sie können einfach versuchen, Daten herunterzuladen, und wenn die Verbindung fehlschlägt, wissen Sie, dass etwas mit der Verbindung nicht in Ordnung ist.
Grundsätzlich können Sie nicht überprüfen, ob der Computer mit dem Internet verbunden ist. Es kann viele Gründe für einen Fehler geben, z. B. falsche DNS-Konfiguration, Firewalls, NAT. Selbst wenn Sie einige Tests durchführen, können Sie nicht garantieren, dass Sie eine Verbindung mit Ihrer API haben, bis Sie es versuchen.
quelle
Verwenden Sie für Python 3
urllib.request.urlopen(host)
quelle
Versuchen Sie die Operation, die Sie trotzdem versucht haben. Wenn es fehlschlägt, sollte Python eine Ausnahme auslösen, um Sie zu informieren.
Wenn Sie zuerst eine triviale Operation versuchen, um eine Verbindung zu erkennen, wird eine Race-Bedingung eingeführt. Was ist, wenn die Internetverbindung beim Testen gültig ist, aber ausfällt, bevor Sie die eigentliche Arbeit erledigen müssen?
quelle
Dies funktioniert möglicherweise nicht, wenn der lokale Host von
127.0.0.1
Try geändert wurdeSofern nicht bearbeitet, lautet die IP-Adresse Ihres Computers 127.0.0.1, wenn keine Verbindung zum Internet besteht. Dieser Code erhält im Grunde die IP-Adresse und fragt dann, ob es sich um die IP-Adresse des lokalen Hosts handelt. hoffentlich hilft das
quelle
quelle
Eine moderne tragbare Lösung mit
requests
:Oder eine Version, die eine Ausnahme auslöst:
quelle
Der beste Weg, dies zu tun, besteht darin, eine IP-Adresse zu überprüfen, die Python immer angibt, wenn die Website nicht gefunden werden kann. In diesem Fall ist dies mein Code:
quelle
Mein Favorit, wenn Skripte in einem Cluster ausgeführt werden oder nicht
Dies läuft leise und lädt nichts herunter, sondern überprüft, ob die angegebene Remote-Datei im Web vorhanden ist
quelle
Unter unutbu Antwort als Ausgangspunkt, und in der Vergangenheit durch eine „statische“ IP - Adresse verbrannt wurde, Ändern, ich eine einfache Klasse gemacht habe , dass die Kontrollen einmal einen DNS - Lookup verwenden (dh unter Verwendung der URL " https: // www .google.com ") und speichert dann die IP-Adresse des antwortenden Servers zur Verwendung bei nachfolgenden Überprüfungen. Auf diese Weise ist die IP-Adresse immer auf dem neuesten Stand (vorausgesetzt, die Klasse wird mindestens alle paar Jahre neu initialisiert). Ich gebe gawry auch Anerkennung für diese Antwort , die mir zeigte, wie ich die IP-Adresse des Servers erhalte (nach jeder Umleitung usw.). Bitte ignorieren Sie die offensichtliche Hackigkeit dieser Lösung. Ich werde hier ein minimales Arbeitsbeispiel anführen. :) :)
Folgendes habe ich:
quelle
Ich nehme an, wir könnten die Antwort von Six irgendwie vereinfachen, ein wichtiges Thema, da Neuankömmlinge in hochtechnischen Angelegenheiten verloren gehen.
Hier werde ich endlich warten, bis meine Verbindung (3G, langsam) einmal täglich für meine PV-Überwachung hergestellt ist.
Funktioniert unter Pyth3 mit Raspbian 3.4.2
Maximaler Lauf: 5 Minuten, wenn erreicht, werde ich es in einer Stunde versuchen, aber es ist ein weiteres Stück Skript!
quelle
Nehmen Sie die Antwort von Ivelin und fügen Sie eine zusätzliche Überprüfung hinzu, da mein Router seine IP-Adresse 192.168.0.1 liefert und einen Kopf zurückgibt, wenn er bei der Abfrage von google.com keine Internetverbindung hat.
quelle
Dies funktioniert bei mir in Python3.6
quelle
Ich habe ein paar zu Joels Code hinzugefügt.
quelle
Für meine Projekte verwende ich ein Skript, das so geändert wurde , dass es den öffentlichen DNS-Server von Google 8.8.8.8 anpingt. Verwenden eines Timeouts von 1 Sekunde und Kernpythonbibliotheken ohne externe Abhängigkeiten:
Der Select - Timeout - Wert ist 1, kann aber eine Gleitkommazahl der Wahl sein , leichter als die 1 Sekunde in diesem Beispiel zu versagen.
quelle
Importieren Sie Anfragen und probieren Sie diesen einfachen Python-Code aus.
quelle