Quiero ver si puedo acceder a una API en línea, pero para eso necesito tener acceso a Internet.
¿Cómo puedo ver si hay una conexión disponible y activa usando Python?
python
networking
aF.
fuente
fuente
easy_install system_of_tubes
Respuestas:
Quizás podrías usar algo como esto:
Actualmente, 216.58.192.142 es una de las direcciones IP de google.com. Cambie
http://216.58.192.142
a cualquier sitio que se pueda esperar que responda rápidamente .Esta IP fija no se asignará a google.com para siempre. Por lo tanto, este código no es robusto: necesitará un mantenimiento constante para que siga funcionando.
La razón por la cual el código anterior usa una dirección IP fija en lugar de un nombre de dominio completo (FQDN) es porque un FQDN requeriría una búsqueda de DNS. Cuando la máquina no tiene una conexión a Internet que funcione, la búsqueda de DNS en sí misma puede bloquear la llamada
urllib_request.urlopen
durante más de un segundo. Gracias a @rzetterberg por señalar esto.Si la dirección IP fija anterior no funciona, puede encontrar una dirección IP actual para google.com (en Unix) ejecutando
fuente
urlopen
no tomará mucho más de 1 segundo, incluso si Internet no está" en "". Esto no es cierto si la url proporcionada no es válida, entonces la búsqueda de DNS se bloqueará. Solo es cierto para la conexión real al servidor web. La forma más sencilla de evitar este bloque de búsqueda de DNS es utilizar la dirección IP en su lugar, luego se garantiza que solo tomará 1 segundo :)http://google.com
y luego resuelve todos los problemas de los que todo el mundo habla aquí. No hay necesidad de usar una dirección IP ...Si podemos conectarnos a algún servidor de Internet, entonces tenemos conectividad. Sin embargo, para el enfoque más rápido y confiable, todas las soluciones deben cumplir con los siguientes requisitos, como mínimo:
Para cumplir con estos, un enfoque podría ser verificar si uno de los servidores DNS públicos de Google es accesible. Las direcciones IPv4 para estos servidores son
8.8.8.8
y8.8.4.4
. Podemos intentar conectarnos con cualquiera de ellos.Un rápido Nmap del host
8.8.8.8
dio el siguiente resultado:Como podemos ver,
53/tcp
está abierto y no filtrado. Si no es un usuario root, recuerde usarsudo
o el-Pn
argumento para que Nmap envíe paquetes de sonda diseñados y determine si un host está activo.Antes de probar con Python, probemos la conectividad utilizando una herramienta externa, Netcat:
NETCAT confirma que pueden alcanzar
8.8.8.8
más53/tcp
. Ahora podemos configurar una conexión de socket8.8.8.8:53/tcp
en Python para verificar la conexión:Otro enfoque podría ser enviar una sonda DNS diseñada manualmente a uno de estos servidores y esperar una respuesta. Pero, supongo, podría ser más lento en comparación debido a la caída de paquetes, fallas en la resolución de DNS, etc. Comente si piensa lo contrario.
ACTUALIZACIÓN # 1: Gracias al comentario de @ theamk, el tiempo de espera ahora es un argumento y se inicializa
3s
de forma predeterminada.ACTUALIZACIÓN # 2: Hice pruebas rápidas para identificar la implementación más rápida y genérica de todas las respuestas válidas a esta pregunta. Aquí está el resumen:
Y una vez más:
True
en el resultado anterior significa que todas estas implementaciones de los respectivos autores identifican correctamente la conectividad a Internet. El tiempo se muestra con una resolución de milisegundos.ACTUALIZACIÓN # 3: Probado nuevamente después del cambio de manejo de excepciones:
fuente
close()
al zócalo?Será más rápido simplemente hacer una solicitud HEAD para que no se obtenga HTML.
También estoy seguro de que a Google le gustaría más de esta manera :)
fuente
Como alternativa a las respuestas de ubutnu / Kevin C, uso el
requests
paquete de esta manera:Bonificación: esto se puede extender a esta función que hace ping a un sitio web.
fuente
google.com
nuevamente, bloquearán nuestra IP. Entonces, ¿hay alguna otra manera?Solo para actualizar lo que dijo unutbu para el nuevo código en Python 3.2
Y, solo para tener en cuenta, la entrada aquí (referencia) es la url que desea verificar: sugiero elegir algo que se conecte rápidamente donde vive, es decir, vivo en Corea del Sur, por lo que probablemente establecería una referencia a http: / /www.naver.com .
fuente
Puede intentar descargar datos y, si falla la conexión, sabrá que algo con la conexión no está bien.
Básicamente no puede verificar si la computadora está conectada a Internet. Puede haber muchas razones para fallar, como una configuración incorrecta de DNS, firewalls, NAT. Entonces, incluso si realiza algunas pruebas, no puede garantizar que tendrá conexión con su API hasta que lo intente.
fuente
Para python 3, use
urllib.request.urlopen(host)
fuente
Intente la operación que intentaba hacer de todos modos. Si falla, Python debería arrojarte una excepción para avisarte.
Intentar una operación trivial primero para detectar una conexión introducirá una condición de carrera. ¿Qué sucede si la conexión a Internet es válida cuando realiza la prueba pero se cae antes de que necesite hacer un trabajo real?
fuente
Esto podría no funcionar si el host local se ha cambiado de
127.0.0.1
ProbarA menos que se edite, la IP de su computadora será 127.0.0.1 cuando no esté conectada a Internet. Este código básicamente obtiene la dirección IP y luego pregunta si es la dirección IP localhost. Espero que ayude
fuente
fuente
Una solución portátil moderna con
requests
:O, una versión que plantea una excepción:
fuente
La mejor manera de hacerlo es hacer que verifique una dirección IP que Python siempre proporciona si no puede encontrar el sitio web. En este caso este es mi código:
fuente
mi favorito, cuando ejecuta scripts en un clúster o no
esto se ejecuta en silencio, sin descargar nada, pero verificando que el archivo remoto dado exista en la web
fuente
Tomando la respuesta de unutbu como punto de partida, y después de haber sido quemado en el pasado por un cambio de dirección IP "estática", hice una clase simple que verifica una vez usando una búsqueda de DNS (es decir, usando la URL " https: // www .google.com "), y luego almacena la dirección IP del servidor que responde para su uso en comprobaciones posteriores. De esa manera, la dirección IP siempre está actualizada (suponiendo que la clase se reinicialice al menos una vez cada pocos años más o menos). También le doy crédito a Gawry por esta respuesta , que me mostró cómo obtener la dirección IP del servidor (después de cualquier redirección, etc.). No tenga en cuenta la aparente hackiness de esta solución, voy por un ejemplo de trabajo mínimo aquí. :)
Esto es lo que tengo:
fuente
Tomando la respuesta de Six, creo que podríamos simplificar de alguna manera, un tema importante ya que los recién llegados se pierden en asuntos altamente técnicos.
Aquí lo que finalmente usaré para esperar a que se establezca mi conexión (3G, lenta) una vez al día para mi monitoreo PV.
Funciona bajo Pyth3 con Raspbian 3.4.2
funcionamiento máximo: 5 minutos si lo alcanzo, lo intentaré dentro de una hora, ¡pero es otro guión!
fuente
Tomando la respuesta de Ivelin y agregando un poco de verificación adicional mientras mi enrutador entrega su dirección IP 192.168.0.1 y devuelve un encabezado si no tiene conexión a Internet cuando consulta google.com.
fuente
Esto funciona para mí en Python3.6
fuente
Agregué algunos al código de Joel.
fuente
Para mis proyectos, uso un script modificado para hacer ping al servidor DNS público de Google 8.8.8.8. Usando un tiempo de espera de 1 segundo y bibliotecas centrales de Python sin dependencias externas:
El valor de tiempo de espera seleccionado es 1, pero puede ser un número de punto flotante de elección para fallar más fácilmente que el 1 segundo en este ejemplo.
fuente
importar solicitudes y probar este código simple de Python.
fuente