J'ai le code suivant qui vérifie si une connexion Internet est présente.
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
Cela testera une connexion Internet, mais quelle est son efficacité?
Je sais qu'Internet varie en qualité d'une personne à l'autre, donc je cherche quelque chose qui est le plus efficace pour le large spectre, et le code ci-dessus semble qu'il pourrait y avoir des lacunes où les gens pourraient trouver des bugs. Par exemple, si quelqu'un vient d'avoir une connexion très lente et met plus de 20 secondes à répondre.
Mon approche serait quelque chose comme ceci:
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
Cela reviendra en moins d'une seconde s'il n'y a pas de connexion (OSX, Python 2.7).
Remarque: ce test peut renvoyer des faux positifs - par exemple la recherche DNS peut renvoyer un serveur au sein du réseau local. Pour être vraiment sûr que vous êtes connecté à Internet et que vous parlez à un hôte valide, assurez-vous d'utiliser des méthodes plus sophistiquées (par exemple SSL).
À partir de Python 2.6 et plus récent (y compris Python 3), une solution plus simple qui est également compatible avec IPv6 serait
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
Il résout le nom et essaie de se connecter à chaque adresse de retour avant de conclure qu'il est hors ligne. Cela inclut également les adresses IPv6.
cela fonctionnera
import urllib
try :
stri = "https://www.google.co.in"
data = urllib.urlopen(stri)
print "Connected"
except e:
print "not connected" ,e
Je voulais tester ma connexion Internet dans une boucle infinie pour surveiller quand mon réseau monte et descend. J'ai remarqué ce qui suit: lorsque mon réseau était en panne et j'ai commencé le script de surveillance comme ça et le réseau est revenu, le script ne l'a pas remarqué. Le réseau était vivant mais le script ne l'a pas vu. Lorsque mon réseau était allumé et que j'ai commencé le script comme ça, il a remarqué les changements. J'ai donc trouvé la solution suivante qui a fonctionné pour moi dans les deux cas:
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
Ici, nous nous appuyons sur un programme externe (ping
) indépendant de notre script.
J'espère que je peux résoudre le problème avec vous.
import urllib
try :
url = "https://www.google.com"
urllib.urlopen(url)
status = "Connected"
except :
status = "Not connect"
print status
Http semble un niveau trop élevé pour vérifier la disponibilité du réseau.
Néanmoins, vous pouvez créer un thread qui vérifie périodiquement la connectivité et stocke l'état de connectivité, ensuite la méthode internet_on pourrait simplement vérifier l'état stocké. Cela devrait être plus rapide que de tester la connectivité à chaque fois.
Bien que la réponse ait été cochée, cela ne pouvait pas m'aider, j'avais une erreur comme
urllib2 n'est pas défini
donc j'avais essayé d'installer rllib2 bibliothèque en utilisant pip mais j'étais impuissant puis j'ai fouillé et heureusement j'ai eu une solution s'il vous plaît vérifier le code suivant, en partageant parce que quelqu'un qui rencontrera un problème que j'avais avant, obtiendra la solution
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())