18 de Enero, 2010

Nada dura para siempre y linkcheck.pl

Esta bitácora tiene, sin contar esta anotación, 1280 entradas, escritas desde Octubre del 2003. Es normal que algunas hayan cogido algo de polvo, y que ya no sea muy interesante leerlas ;), pero otras siguen teniendo validez (muchas de ellas siguen indexadas en los buscadores, y recibiendo visitas a diario, incluso páginas que ya no existen).

Enlaces rotos

Pero es que además soy un blogger de esos que enlazan a otras páginas. Concretamente lo he hecho 4544 veces, y muchos de esos enlaces ya no apuntan a nada. Concretamente 611 :o (como curiosidad se puede ver en la gráfica qué tipos de errores he encontrado).

Llevaba un tiempo pensando en esto, porque cuando ojeaba la máquina del tiempo, no tardaba en encontrarme algún enlace que ya no era válido, y finalmente le he echado dos ratos y he programado una pequeña herramienta: linkcheck.pl.

El funcionamiento es sencillo:

  • Se conecta a la base de datos de nuestro blog (lo he hecho bastante abierto, usando DBI casi tenemos independencia total del sistema de gestión -aunque solo lo he probado con MySQL-).
  • Busca en la tabla que le indicamos la clave primaria y el campo que guarda el cuerpo de las anotaciones.
  • Analiza esos textos buscando enlaces, visitándolos (con HEAD en un primer intento sin descargar la web, y GET cuando no hay más remedio), y generando un informe con instrucciones SQL que, si lo ejecutamos en nuestra base de datos, actualizará las entradas eliminando los enlaces que ya no funcionan.

He querido hacer la herramienta de forma que sea últil a otros, pero como buscar enlaces no es tarea fácil, no me hago responsable de los destrozos que puede hacer (je, por eso genero la salida SQL, para que se pueda revisar :D).

La idea(tm) es que buscamos con la siguiente expresión regular:

(<a.*?href="((https?:\|ftp:\|/)(.+?))".*?>(.*?)</a>)

De forma que para cada enlace tengamos:

  • El enlace completo: <a href="http://link.dom/index.html">texto del enlace</a>.
  • La URL: http://link.dom/index.html.
  • El texto: texto del enlace.

Así, si al verificar la URL el script obtenemos un error (4xx o 5xx), podemos reemplazar el enlace completo por el texto del enlace, con lo que la anotación queda igual, pero nos hemos desecho del enlace muerto.

Evidentemente esto no es perfecto, porque no podemos saber si la web que responde es aquella que enlazamos, pero en general el resultado me parece bastante aceptable.

Muy de vez en cuando podré ejecutar la herramienta para revisar los enlaces y quitar aquellos que ya no tienen sentido. Aunque claro, esta bitácora tampoco durará para siempre, y entonces dejará enlaces inservibles en otros blogs. Porque ya sabéis eso de que nada dura para siempre, ni mucho menos en Internet ;).

Actualización: tampoco hay que fiarse mucho de esa expresión regular, ya la he cambiado un par de veces en el script. Qué verdad esa que cuando tienes un problema y decides resolverlo con una expresión regular, tienes dos problemas.

Anotación por Juan J. Martínez, clasificada en: perl, blog.

Hay 2 comentarios

Gravatar

Muy buena la idea. Se me ocurre, que quizás para preservar un poco más del espíritu del apunte inicial en lugar de eliminar por completo el enlace se podría añadir al texto [enlace roto] o algo así (al estilo de la wikipedia*). El lector se hace una idea más aproximada de lo que había, es avisado de que es probable que el enlace no funciona pero puede saber a que URL apuntaba y así tiene más información.

Es solo una idea, pero vamos que me parece muy interesante la herramienta para gente que pueda acceder a la BD de su blog :)

* <a href="http://es.wikipedia.org/wiki/Plantilla:Enlace_roto">Plantilla:Enlace roto en la wiki</a> en la que además se enlaza a archive.org. Otra idea, para trabajar más ;)

por Miguel, en 2010-01-19 08:46:26

Gravatar

Era una de las cosas que barajaba: manda a una página intermedia indicando que "puede" (jeje) que el enlace esté roto.

Pero vamos, creo que aporta poco si pones bien los enlace en un contexto (es decir: evitar poner cosas tipo "haz click aquí" y similares), la eliminación del enlace es perfectamente limpia y a fin de cuentas... ¡el contenido enlazado ya no está!

Pero bueno, puedo poner una opción para que en lugar de borrar el enlace, redirija a una página con el link como parámetro. Es sencillo de hacer.

por Juanjo, en 2010-01-19 08:50:25

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: