Проверьте, существует ли интернет-соединение в 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 секунд? Сделайте несколько попыток? Попробуйте несколько хостов?