sábado, 17 de enero de 2009

Script para descargar cómics

Bueno, hace algo me interesé por una tira cómica que sale en el Faro de Vigo llamada O Bicheiro. Son chistes bastante locales, pero muy muy buenos.


El caso es que quería tenerlos en disco para poder verlos cuando quisiera.
En la web del periódico están disponibles, pero eran muchísimos, y descargarlos uno por uno iba a ser un suplicio, así que me planteé hacer un programa que se fuese bajando las tiras una a una, generando la dirección y descargando la imagen.

Como todo buen programador que se precie empecé por hacer copy-paste de un script de python llamado image-harvester. De ahí saqué el cómo hacerlo.... aunque al final tuve que reescribir el código prácticamente entero.

Lo que hace el script es generar las direcciones de las tiras (en base a un número o a una fecha), abrir esa página, buscar el enlace a la imagen, descargar esa imagen y guardarla en un fichero.

Bueno, cuando quise darme cuenta, ya tenía 800 Bicheiros en el disco duro... ahora que ya terminé de bajarlos todos, tengo casi 1200.

El caso es que después de ver lo bien que funcionaba no pude evitar hacer lo mismo con otros webcómics que me interesan, y que tienen ya demasiadas tiras como para bajarlas una a una.

Y bueno, ya que me molesté en bajarlas y todo eso, dejo aquí los enlaces para quien quiera descargarse los archivos, y el script, por si quereis utilizarlo para otras tiras o cosas similares.

O Bicheiro
RunTime News
Clickina
Calvin & Hobbes
Eh Tío!
xkcd
Girly
Pearls before swine


#! /usr/bin/env python
# -*- coding: cp1252 -*-

import urllib

def retrieveImage(number):
# Primero obtenemos la direccion, que depende del numero
request1 = "http://girlyyy.com/go/"+str(number)
request2 = ""
nombre = ""
# Buscamos en todas las lineas HTML de la pagina
for line in urllib.urlopen(request1):
# hasta encontrar la que tiene la direccion de la imagen
if line.count("girlyyy.com/comics/girly_")>0:
# Generamos la direccion web de la imagen
request2=line.split("\"")[1].split("\"")[0]
# Y guardamos el nombre y extension de la imagen
nombre=request2.split("http://girlyyy.com/comics/")[1].split("\"")[0]
print(nombre)
break
# Si hemos encontrado algo, lo guardamos
if len(request2)>0:
# Esto baja el archivo de la direccion que le demos
# y lo guarda con el nombre indicado
urllib.urlretrieve(request2, nombre)

# Bucle principal
if __name__ == '__main__':
# Para cada una de las entradas, recogemos la imagen
for numero in range(1,700):
retrieveImage(numero)