问候,我编写了以下脚本,该脚本通过txt文件为我带来了网络状态。我不知道这是否是最快的方法,但是它对我有用,问题是我不太清楚套接字的异常问题。我正在运行超时,但是当没有互联网或套接字的连接排队时,脚本会不断中断。
# pip install termcolor, pip install urllib3, pip install colorama
import urllib.request
import urllib.error
import time
import os
import ssl
import socket
#import httplib #este es para python2
from termcolor import *
#Para colorear en windows
import colorama
colorama.init()
#Para desastivar el check de SSL
ssl._create_default_https_context = ssl._create_unverified_context
__author__ = "Antonio Orozco R"
__copyright__ = "Copyright (C) 2018 Antonio Orozco R. antoniojorz@hotmail.com"
__license__ = "GPL/GNU V3"
__version__ = "1.1"
#abrir archivo
archivo = open("url.txt", "r")
#Contar numeros de lineas
iterlen = lambda it: sum(1 for _ in it)
cant = iterlen(open("url.txt"))
#ENCABEZADOS DE COLUMNAS
title_Fecha = "Fecha"
title_Url = "URL"
title_Estado = "Estado"
title_Razon = "Razon"
title_Tiempo = "Tiempo"
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
cprint("Este script esta bajo licencia: "+__license__+" "+__copyright__+" "+__version__,'white')
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
cprint("%-25s %-80s %-30s %-7s" %(title_Fecha, title_Url, title_Estado, title_Tiempo),'white')
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
while True:
cantT=0
TIMEOUT=8
for site in archivo.readlines():
#Borro los saltos de lineas
if site[-1] == '\n':
site = site[:-1]
try:
#Variables de conexion y estado
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
conn = opener.open(site, timeout=TIMEOUT)
html_contents = conn.read()
st = conn.code
cantT+= 1
#se calcula el tiempo transcurido para el check
inicio = time.time()
elapse_time = str(time.time()-inicio)[0:6]
if conn.code in (200, 401, 301, 302):
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, st,elapse_time),'green')
if conn.code in (408, 501, 503):
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, st,elapse_time),'yellow')
#Reload
if cantT == cant:
#cierro archivo
archivo.close()
#reabro archivo
archivo = open("url.txt", "r")
#Contar numeros de lineas
iterlen = lambda it: sum(1 for _ in it)
cant = iterlen(open("url.txt"))
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
cprint("Este script esta bajo licencia: "+__license__+" "+__copyright__+" "+__version__,'white')
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
cprint("%-25s %-80s %-30s %-7s" %(title_Fecha, title_Url, title_Estado, title_Tiempo),'white')
print ('------------------------------------------------------------------------------------------------------------------------------------------------------')
#Manejo de excepciones para timeout y otros errores
except ssl.SSLError as e:
cantT+= 1
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, e.reason, elapse_time),'yellow')
except socket.timeout as e:
cantT+= 1
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, "Timeout",TIMEOUT),'red')
except urllib.error.URLError as e:
if isinstance(e.reason, socket.timeout):
cantT+= 1
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, "Timeout",TIMEOUT),'red')
else:
cantT+= 1
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, e.reason, elapse_time),'yellow')
except SocketError as e:
conn.close()
cantT+= 1
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, e.reason , elapse_time),'red')
#continue
except ConnectionResetError as e:
conn.close()
cantT+= 1
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, e.reason , elapse_time),'red')
#continue
except urllib.request.HTTPError as e:
cantT+= 1
cprint("%-25s %-80s %-30s %-7s" %(time.strftime("%c"),site, e.reason,elapse_time),'red')
#Cierre de conexion y sleep
time.sleep(2)
#conn.close()