Sunday, December 13, 2009

Obteniendo información de la internéssss

Ok, les voy a comentar una hackeada que hice el otro día, y que más o menos funcionó. Tenía una lista de albumes musicales en una planilla de cálculo con una columna con el artista y el nombre. y quería agregarle el año. pero eran 100 discos y aunque más o menos me acordaba el año, no quería googlearlos todos. Entonces a modo de experimento (no sé si ahorré más tiempo la verdad pero fue más entretenido que hacer 100 google searches), se me ocurrió hacer un script que lo googleara por mí.

El primer paso fue googlear "google search cpan". CPAN es el repositorio de librerías Perl y hay para hacer cualquier pelotudez, así que supuse que habría una librería para buscar en google. Había una, pero leyendo un rato descubrí que necesité una clave de Google API que no sé que pija es, pero ya me pareció muy complicado, pero encontré que había una librería para buscar en Yahoo! que no requería nada. Así que eso usé. La librería se llama, sorprendentemente, "Yahoo::Search".

Y acá está la magia de CPAN, para instalar la librería en tu pc escribís

cpan Yahoo::Search


y se conecta a internet y baja la librería y todas las dependencias y las instala todas y ya está lista para usar.

Luego traté de armar una búsqueda que en el resumen de la búsqueda me trajera la fecha de publicación. Por ejemplo si escribo "Metallica Ride the lightning wikipedia released" obtengo un resumen como

Ride the Lightning is the second album by American heavy metal band Metallica, released on July 27, 1984 by Megaforce Records and re-released by Elektra ...

Como verán, ahí está el año en el que salió el disco. Entonces basandome en el código de ejemplo de búsqueda yahoo armé este script:


use Yahoo::Search;

$data_file="discos";
open(DAT, $data_file);
@discos=;
close(DAT);

for my $disco (@discos) {
my @Results = Yahoo::Search->Results(Doc => $disco . " wikipedia Released ",
AppId => "YahooDemo",
Mode => 'all', # all words
Start => 0,
Count => 1,
Type => 'any', # all types
AllowAdult => 0, # no porn, please
AllowSimilar => 0, # no dups, please
Language => undef,
);
warn $@ if $@; # report any errors

for my $Result (@Results)
{
printf "%s\n", $Result->Summary;
}
}


Lo que hice entonces fue por cada búsqueda, imprimir el "summary" que es justamente el resumen que aparece. Luego escribí este otro script en python (en python porque me pareció más simple que hacerlo en perl, porque no estoy totalmente cómodo con perl):


import sys

for line in sys.stdin:
try:
spl = line.upper().replace(":","").replace(",","").replace(".","").split()
i = spl.index('RELEASED') + 1
year = spl[i:i+3]
print max(int(y) for y in year if y.isdigit())
except Exception:
print ""


Que hace este script? lee linea a linea el standard output, lo pone en mayúsculas, remueve todos los ":", ".", y "," y luego busca donde diga "RELEASED" y busca todos los numeros que aparezcan a la derecha de RELEASED y obtiene el máximo de ellos. En general suele ser el año, los otros numeros son el mes y el día o algo así.

Entonces corrí


perl scriptperl.pl | python scriptpython.py > listayears


y obtuve la lista de años. Como cada script leyo una linea y escribió una linea, tengo una linea por disco en el mismo orden, así que pude copiar y pegar la lista de años. Obviamente no me trajo TODOS los años ni me trajo TODOS los años correctos (me trajo varios años de "re releases"), pero hice un par de busquedas similares (en vez de en wikipedia released también busqué en amazon y en rateyourmusic) y obtuve varios años, borré a mano todo lo que no encajaba y obtuve la lista de años. ¿Podría haberlo hecho con más precisión? Sí, pero no quería perder taaaanto tiempo. Pero quería que sirva como un burdo ejemplo de como cualquier boludo puede automatizar búsquedas en internet de info con una librería cualunque de CPAN.

No comments: