Приветствия. Я сделал следующий скрипт, который выводит меня через Интернет через 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()