Проверьте, существует ли интернет-соединение в python
У меня есть следующий код, который проверяет наличие интернет-соединения.
import urllib2
def internet_on():
try:
response=urllib2.urlopen('http://74.125.228.100',timeout=20)
return True
except urllib2.URLError as err: pass
return False
Это проверит подключение к Интернету, но насколько оно эффективно?
Я знаю, что интернет отличается по качеству от человека к человеку, поэтому я ищу что-то, что наиболее эффективно для широкого спектра, и приведенный выше код кажется, что могут быть лазейки, где люди могут найти ошибки. Например, если у кого-то было очень медленное соединение и потребовалось больше 20 секунд, чтобы ответить.
Ответы
Ответ 1
Мой подход будет примерно таким:
import socket
REMOTE_SERVER = "www.google.com"
def is_connected(hostname):
try:
# see if we can resolve the host name -- tells us if there is
# a DNS listening
host = socket.gethostbyname(hostname)
# connect to the host -- tells us if the host is actually
# reachable
s = socket.create_connection((host, 80), 2)
s.close()
return True
except:
pass
return False
%timeit is_connected(REMOTE_SERVER)
> 10 loops, best of 3: 42.2 ms per loop
Это вернется менее чем за секунду, если нет соединения (OSX, Python 2.7).
Примечание. Этот тест может возвращать ложные срабатывания - например, поиск DNS может вернуть сервер в локальной сети. Чтобы быть уверенным, что вы подключены к Интернету и общаетесь с действительным хостом, используйте более сложные методы (например, SSL).
Ответ 2
Как и в случае с Python 2.6 и более новыми (включая Python 3), более простым решением, которое также совместимо с IPv6, будет
import socket
def is_connected():
try:
# connect to the host -- tells us if the host is actually
# reachable
socket.create_connection(("www.google.com", 80))
return True
except OSError:
pass
return False
Он разрешает имя и пытается подключиться к каждому возврату addres, прежде чем завершить его, в автономном режиме. Это также включает адреса IPv6.
Ответ 3
это будет работать
import urllib
try :
stri = "https://www.google.co.in"
data = urllib.urlopen(stri)
print "Connected"
except e:
print "not connected" ,e
Ответ 4
Я хотел проверить подключение к Интернету в бесконечном цикле, чтобы отслеживать, когда моя сеть идет вверх и вниз. Я заметил следующее: когда моя сеть была отключена, и я начал мониторинг script, и сеть вернулась, script не заметил этого. Сеть была жива, но script этого не видел. Когда моя сеть была включена, и я начал script таким образом, он заметил изменения. Поэтому я придумал следующее решение, которое работало для меня в обоих случаях:
import shlex
from subprocess import call, PIPE, STDOUT
def get_return_code_of_simple_cmd(cmd, stderr=STDOUT):
"""Execute a simple external command and return its exit status."""
args = shlex.split(cmd)
return call(args, stdout=PIPE, stderr=stderr)
def is_network_alive():
cmd = "ping -c 1 www.google.com"
return get_return_code_of_simple_cmd(cmd) == 0
Здесь мы полагаемся на внешнюю программу (ping
), которая не зависит от нашего script.
Ответ 5
Http кажется слишком высоким для проверки доступности сети.
Тем не менее вы можете создать поток, который периодически проверяет подключение и сохраняет состояние подключения, а затем метод internet_on может просто проверять сохраненное состояние. Это будет быстрее, чем тестирование соединения каждый раз.
Ответ 6
Надеюсь, я смогу помочь с вами.
import urllib
try :
url = "https://www.google.com"
urllib.urlopen(url)
status = "Connected"
except :
status = "Not connect"
print status
Ответ 7
Хотя ответ был помечен, это не помогло мне, но я получил ошибку вроде
urllib2 не определено
поэтому я попытался установить библиотеку urllib2 с помощью pip, но был беспомощен, затем я покопался и, к счастью, нашел решение, пожалуйста, проверьте следующий код и поделитесь им, потому что тот, кто столкнется с проблемой, с которой я столкнулся ранее, получит решение
from urllib.request import urlopen
def is_internet_available():
try:
urlopen('http://216.58.192.142', timeout=1)
return True
except:
return False
print(is_internet_available())
Ответ 8
Это то, что я использую:
import subprocess
subprocess.call('ping -t 8.8.8.8')
Ответ 9
Увеличьте время ожидания до 30 секунд? Сделайте несколько попыток? Попробуйте несколько хостов?