Chcę sprawdzić, czy mogę uzyskać dostęp do internetowego interfejsu API, ale do tego potrzebuję dostępu do Internetu.
Jak mogę sprawdzić, czy jest dostępne i aktywne połączenie przy użyciu Pythona?
python
networking
aF.
źródło
źródło
easy_install system_of_tubes
Odpowiedzi:
Być może przydałoby się coś takiego:
Obecnie 216.58.192.142 to jeden z adresów IP w witrynie google.com. Zmień
http://216.58.192.142
witrynę, w której można oczekiwać szybkiej reakcji .Ten stały adres IP nie będzie na zawsze mapowany na google.com. Więc ten kod nie jest solidny - będzie wymagał ciągłej konserwacji, aby działał.
Powodem, dla którego powyższy kod używa stałego adresu IP zamiast w pełni kwalifikowanej nazwy domeny (FQDN), jest to, że nazwa FQDN wymagałaby wyszukiwania DNS. Gdy komputer nie ma działającego połączenia internetowego, samo wyszukiwanie DNS może blokować wywołanie
urllib_request.urlopen
na dłużej niż sekundę. Dzięki @rzetterberg za wskazanie tego.Jeśli powyższy stały adres IP nie działa, możesz znaleźć aktualny adres IP dla google.com (w systemie unix), uruchamiając
źródło
urlopen
numerem nie zajmie dużo więcej niż 1 sekundę, nawet jeśli Internet nie jest włączony”. - cytat. Nie jest to prawdą, jeśli podany adres URL jest nieprawidłowy, wyszukiwanie DNS zostanie zablokowane. Dotyczy to tylko rzeczywistego połączenia z serwerem WWW. Najprostszym sposobem uniknięcia tego bloku wyszukiwania DNS jest użycie zamiast tego adresu IP, wtedy gwarantowane zajmie tylko 1 sekundę :)http://google.com
a potem rozwiąż wszystkie problemy, o których wszyscy tu mówią. Nie ma potrzeby używania adresu IP ...Jeśli możemy połączyć się z jakimś serwerem internetowym, to rzeczywiście mamy łączność. Jednak aby uzyskać najszybsze i najbardziej niezawodne podejście, wszystkie rozwiązania powinny spełniać co najmniej następujące wymagania:
Aby spełnić te wymagania, jednym z podejść może być sprawdzenie, czy jeden z publicznych serwerów DNS Google jest osiągalny. Adresy IPv4 tych serwerów to
8.8.8.8
i8.8.4.4
. Możemy spróbować połączyć się z dowolnym z nich.Szybki Nmap hosta
8.8.8.8
dał następujący wynik:Jak widać,
53/tcp
jest otwarty i niefiltrowany. Jeśli jesteś użytkownikiem niż root, należy pamiętać, aby używaćsudo
lub-Pn
argumentem dla Nmap wysłać spreparowane pakiety sondy i ustalić, czy komputer jest w górę.Zanim spróbujemy z Pythonem, przetestujmy łączność za pomocą zewnętrznego narzędzia, Netcat:
Netcat potwierdza, że możemy osiągnąć
8.8.8.8
w ciągu53/tcp
. Teraz możemy skonfigurować połączenie przez gniazdo8.8.8.8:53/tcp
w Pythonie, aby sprawdzić połączenie:Innym podejściem może być wysłanie ręcznie spreparowanej sondy DNS na jeden z tych serwerów i oczekiwanie na odpowiedź. Zakładam jednak, że może się to okazać wolniejsze w porównaniu z powodu zrzucania pakietów, błędu rozpoznawania nazw DNS itp. Jeśli myślisz inaczej, skomentuj.
UPDATE # 1: Dzięki komentarzowi @ theamk, timeout jest teraz argumentem i
3s
jest domyślnie inicjowany .AKTUALIZACJA # 2: Zrobiłem szybkie testy, aby zidentyfikować najszybszą i najbardziej ogólną implementację wszystkich prawidłowych odpowiedzi na to pytanie. Oto podsumowanie:
I jeszcze raz:
True
w powyższym wyniku oznacza, że wszystkie te implementacje od poszczególnych autorów poprawnie identyfikują łączność z Internetem. Czas jest wyświetlany z rozdzielczością milisekund.AKTUALIZACJA # 3: Przetestowano ponownie po zmianie obsługi wyjątków:
źródło
close()
do gniazdka?Szybciej będzie po prostu wykonać żądanie HEAD, więc żaden kod HTML nie zostanie pobrany.
Jestem też pewien, że Google polubiłoby to lepiej :)
źródło
Jako alternatywę dla odpowiedzi ubutnu / Kevina C używam tego
requests
pakietu:Bonus: można to rozszerzyć na tę funkcję, która pinguje stronę internetową.
źródło
google.com
znowu będziesz tęsknić , zablokują nasze IP. Więc czy jest jakiś inny sposób.?Wystarczy zaktualizować to, co powiedział unutbu dla nowego kodu w Pythonie 3.2
I, dla przypomnienia, dane wejściowe tutaj (odniesienie) to adres URL, który chcesz sprawdzić: Proponuję wybrać coś, co łączy się szybko w miejscu Twojego zamieszkania - tj. Mieszkam w Korei Południowej, więc prawdopodobnie ustawiłbym odniesienie na http: / /www.naver.com .
źródło
Możesz po prostu spróbować pobrać dane, a jeśli połączenie się nie powiedzie, będziesz wiedział, że coś z połączeniem nie jest w porządku.
Zasadniczo nie możesz sprawdzić, czy komputer jest podłączony do Internetu. Przyczyn niepowodzenia może być wiele, np. Zła konfiguracja DNS, zapory sieciowe, NAT. Więc nawet jeśli wykonasz kilka testów, nie możesz zagwarantować, że będziesz mieć połączenie z interfejsem API, dopóki nie spróbujesz.
źródło
W przypadku Pythona 3 użyj
urllib.request.urlopen(host)
źródło
Spróbuj wykonać operację, którą mimo wszystko próbujesz wykonać. Jeśli to się nie powiedzie, Python powinien zgłosić wyjątek, aby Cię powiadomić.
Aby najpierw wypróbować jakąś trywialną operację w celu wykrycia połączenia, należy wprowadzić stan wyścigu. Co się stanie, jeśli połączenie internetowe jest prawidłowe podczas testu, ale znika, zanim będziesz musiał wykonać rzeczywistą pracę?
źródło
To może nie działać, jeśli localhost został zmieniony z
127.0.0.1
TryO ile nie jest edytowany, adres IP twojego komputera będzie 127.0.0.1, gdy nie jest podłączony do Internetu. Ten kod w zasadzie pobiera adres IP, a następnie pyta, czy jest to adres IP lokalnego hosta. Mam nadzieję, że to pomoże
źródło
źródło
Nowoczesne przenośne rozwiązanie z
requests
:Lub wersja, która zgłasza wyjątek:
źródło
Najlepszym sposobem na to jest sprawdzenie adresu IP, który Python zawsze podaje, jeśli nie może znaleźć witryny. W tym przypadku jest to mój kod:
źródło
mój ulubiony, gdy uruchamiam skrypty w klastrze lub nie
to uruchamia wget cicho, niczego nie pobiera, tylko sprawdza, czy dany plik zdalny istnieje w sieci
źródło
Biorąc odpowiedź unutbu za punkt wyjścia i będąc w przeszłości spalonym przez „statyczną” zmianę adresu IP, stworzyłem prostą klasę, która sprawdza raz za pomocą wyszukiwania DNS (tj. Używając adresu URL „ https: // www .google.com ”), a następnie przechowuje adres IP serwera odpowiadającego do wykorzystania podczas kolejnych kontroli. W ten sposób adres IP jest zawsze aktualny (zakładając, że klasa jest ponownie inicjowana co najmniej raz na kilka lat). Daję również uznanie Gawry'emu za tę odpowiedź , która pokazała mi, jak uzyskać adres IP serwera (po każdym przekierowaniu itp.). Proszę zignorować pozorną hacking tego rozwiązania, posłużę się tutaj minimalnym działającym przykładem. :)
Oto co mam:
źródło
Biorąc odpowiedź Six, myślę, że moglibyśmy w jakiś sposób uprościć, ważna kwestia, ponieważ nowicjusze gubią się w wysoce technicznych sprawach.
Tutaj w końcu będę czekał, aż moje połączenie (3G, wolne) zostanie ustanowione raz dziennie do monitorowania PV.
Działa pod Pyth3 z Raspbian 3.4.2
maksymalny bieg: 5 minut jeśli osiągnę spróbuję za godzinę, ale to kolejny kawałek skryptu!
źródło
Biorąc odpowiedź Ivelina i dodając dodatkowe sprawdzenie, ponieważ mój router dostarcza swój adres IP 192.168.0.1 i zwraca głowę, jeśli nie ma połączenia z Internetem podczas wysyłania zapytania do google.com.
źródło
To działa dla mnie w Pythonie 3.6
źródło
Dodałem kilka do kodu Joela.
źródło
W moich projektach używam zmodyfikowanego skryptu do pingowania publicznego serwera DNS Google 8.8.8.8. Korzystanie z limitu czasu wynoszącego 1 sekundy i podstawowych bibliotek Pythona bez zewnętrznych zależności:
Wybierz wartość limitu czasu wynosi 1, ale może być liczbę zmiennoprzecinkową wyboru niepowodzenie łatwiej niż 1 sekundę w tym przykładzie.
źródło
importuj żądania i wypróbuj ten prosty kod w Pythonie.
źródło