2010-10-28 88 views
7

Tengo una lista de URL (1000+) que se han almacenado durante más de un año. Quiero revisarlos y verificarlos para ver si aún existen. ¿Cuál es la mejor/más rápida forma de verificarlos todos y devolver una lista de los que no devuelven un sitio?Python verificar url va a una página

Respuesta

10

esto es un poco lento, pero se puede usar algo como esto para comprobar si la URL es un vivo

import urllib2 

try: 
    urllib2.urlopen(url) 
    return True   # URL Exist 
except ValueError, ex: 
    return False  # URL not well formatted 
except urllib2.URLError, ex: 
    return False  # URL don't seem to be alive 

más rápida que urllib2 puede utilizar httplib

import httplib 

try: 
    a = httplib.HTTPConnection('google.com') 
    a.connect() 
except httplib.HTTPException as ex: 
    print "not connected" 

también se puede hacer una DNS checkout (no es muy conveniente verificar si un sitio web no existe):

import socket 

try: 
    socket.gethostbyname('www.google.com') 
except socket.gaierror as ex: 
    print "not existe" 
+0

se utiliza la toma rápida que urllib2. Intenté con urllib2 pero me llevó una eternidad así que terminé deteniéndolo – John

+0

Acabo de editar mi pregunta, y agregué una solución más rápida usando httplib, y para usar ping (la otra respuesta) o búsqueda DNS (la tercera solución en mi respuesta) no es muy conveniente, porque muchos sitios web todavía están registrados en el DNS y ya no existen y para el ping es igual que la búsqueda DNS + un ping ICMP que tampoco dice si el sitio web (servidor http) ejecutando "aceptando conexión" o no – mouad

+0

El 'urllib2' me funcionó desde detrás de un proxy en OS X.' httplib' no funcionaría. –

0

Chec k esto:

Ping in python

Fin continuación:

import ping, socket 
try: 
    result = ping.do_one('http://stackoverflow.com/', timeout=2) 
except socket.error, e: 
    # url cannot be reached 
    print "Error:", e 
+0

Tengo más de 1000 URL para verificar. ¿Será esto más rápido que usar la respuesta urllib2 a continuación? – John

+0

Creo que sí. Pruébalo. También depende de la red. En todos los casos, la respuesta del servidor llevará algún tiempo (puede establecer el tiempo de espera en mi solución, como puede ver en el código). – Klark

Cuestiones relacionadas