25 agosto 2011

Create tu propio Infobel

Hace unos años se vendía "Infobel", un CD con una base de datos que contenía los nombres, apellidos, dirección postal y teléfono fijo de todos los usuarios de telefonía fija de España y otras ediciones para otros paises de Europa. Esta base de datos se solía utilizar para automatizar contestadores con publicidad y otros fines similares de marketing, además se podían hacer búsquedas inversas. Es decir, dado un número de teléfono fijo, averiguar quién te estaba llamando.

Como Infobel ya no existe por distintos problemas con la ley de protección de datos, a Yago se le ocurrió ver si éramos capaces de hacernos nuestra propia base de datos usando la página web de páginas blancas, ya que había visto que no usaban captchas.

En ese momento me acordé del año pasado cuando Ron de SkullSecurity recorría automáticamente el directorio de Facebook y generaba un curioso diccionario de más de 100 millones de nombres únicos. Más tarde, en mayo de este año, un estudiante repetía la jugada con Google, descargando unos 35 millones de perfiles.

Comentada la idea, me puse a mirar la web, eso sí, sin llegar a guardar los datos en ningún sitio, ya que eso requeriría dar de alta el archivo por contener datos de caracter personal.

Lo primero que observé es que paginas blancas requiere que se introduzca como mínimo un nombre, apellido o razón social y una provincia.


Si no se meten esos dos valores, mostrará un error similar al siguiente:


Así que como un buen chico, metí Alejandro como prueba en "A Coruña", a ver los resultados que ofrecia.


Vaya, ya tenía 589 Alejandros localizados en A Coruña, la lastima es que solo deja mostrar los 50 primeros, tal y como informa la propia web:


Y una vez avanzas 5 páginas y obtienes los 50 registros, la web cambia y elimina el botón "Siguiente", evitando que obtengamos todos:


Seguro que los más vivos ya os habréis imaginado por dónde van los tiros. ¡Estos datos los valida en el lado del cliente!, y tanto la provincia como el número de página son parámetros que se ingresan en la URL, es decir, que yo cambio de la URL el parámetro "nomprov" y elimino "A Coruña", buscará todos los Alejandros de España. Tal y como muestro para mayor claridad en la siguiente imagen con Hackbar:


El número cambia de los tristes 589 a 29.952 ¡wow!

De esta misma forma, modificando el parámetro "pg" de la URL puedo avanzar y obtener todos los resultados, ya que lo único que hace el botón de "Siguiente" es incrementar en uno ese valor.

Bien, con estos dos "pequeños" fallos ya solo queda programar un algo que haga el trabajo sucio. Buscar muchos nombres y recorrer las páginas.

Como diccionario de nombres en primera instancia se me ocurrió usar los que ya se habían sacado de Facebook, pero 100 millones de nombres, definitivamente, son DEMASIADOS nombres. Así que me acordé del Instituto Nacional de Estadística, que ofrece datos sobre frecuencia de nombres. Sumando los de hombre y mujer, conseguí 16.101 distintos, parecía mucho más acotado que los 100.000.000 de Ron.



Una vez copiados del INE a un fichero, tocaba hacer el script, que pese a que es horrible, funciona:

#!/bin/bash
# Jun  12 02:41:36 CEST 2011 It's time to scrap!
# $1 = archivo con nombres

BURL="http://blancas.paginasamarillas.es/jsp/resultados.jsp?"

for name in `cat $1`; do
PARAM="no=$name&sec=15&tbus=0&idioma=tml_lang&pg=1&pext=null"
count=`curl -s ${BURL}${PARAM}|grep Encontrados | tail -1 |sed -e 's|.*ng> \(.*\)<.*|\1|'`
if [ -z $count ]; then echo "saltando: $name"; continue; fi
echo "encontrados $count de $name"
get=0
fetch=$(( $count / 10 + 1 ))
while [ "$fetch" -gt "$get" ]; do
get=$(( $get + 1 ))
echo "debug: obteniendo $get de $fetch de $name"
PARAMS="no=$name&sec=15&tbus=0&idioma=tml_lang&pg=$get&pext=null"
curl -s ${BURL}${PARAMS} | grep listatel | tee -a $1.out
done
done

Fueron 10 minutos para hacerlo asi que no quiero oír quejas, el output además es aún peor:

<a href="#" onclick="return imprimeAnuncio('resultados_imp.jsp?LO1=OURENSE&CALL=Galicia&PR=OURENSE&NUME=&TP=IG&NO=LUIS MANUEL GON&APE1=-&
APE2=&CP=32005&tel=988 242 xxx&sec=28&vez=0&listatel=')" >
<a href="#" onclick="return imprimeAnuncio('resultados_imp.jsp?LO1=LLEIDA&CALL=Castelló Aleu&PR=LLEIDA&NUME=&TP=IG&NO=BORRELL SENA SL&AP
E1=-&APE2=&CP=25005&tel=973 830 xxx&sec=28&vez=0&listatel=')" >
<a href="#" onclick="return imprimeAnuncio('resultados_imp.jsp?LO1=LLEIDA&CALL=Germans Recasens&PR=LLEIDA&NUME=&TP=IG&NO=CONSUELO SANCHE&
APE1=-&APE2=&CP=25005&tel=973 248 xxx&sec=28&vez=0&listatel=')" >

Por lo que luego hubo que hacerse otro para convertir la salida HTML en un CSV, esta vez en perl. Como los machos ;-)

#!/usr/bin/perl
while() {
s/.*jsp?//;
s/\&sec.*//;
#print $_;
($loc) = $_ =~ m/.*LO1=(.*)\&CALL.*/;
($call)= $_ =~ m/.*CALL=(.*)\&PR.*/;
($pr) = $_ =~ m/.*PR=(.*)\&NUME.*/;
($tp) = $_ =~ m/.*TP=(.*)\&NO.*/;
($no) = $_ =~ m/.*NO=(.*)\&APE1.*/;
($ape1) = $_ =~ m/.*APE1=(.*)\&APE2.*/;
($ape2) = $_ =~ m/.*APE2=(.*)\&CP.*/;
($cp) = $_ =~ m/.*CP=(.*)\&tel.*/;
($tel) = $_ =~ m/.*tel=(.*)/;
$tel =~ s/ //g;
print "\"$loc\",\"$call\",\"$pr\",\"$tp\",\"$no\",\"$ape1\",\"$ape2\",\"$cp\",\"$tel\"\n"
}
done

Cuando terminé y me sentía realizado, pensé que lo mismo la lista de nombres no era lo suficiente completa, así que se me ocurrió que cuando terminase (con 8 millones de resultados), podría hacer una lista de Apellidos de todos los datos obtenidos, y consultar nuevamente con ese otro nuevo diccionario.

Sumando los resultados de ambas ejecuciones y eliminado los duplicados, finalmente quedarian (supongo)  unos 9.7 millones de registros.

Una vez reportado y arreglado, esta es la historia.

--

garbanzosf

18 comments :

Invitado dijo...

Brutalmente útil y lamentable a la vez

Invitado dijo...

Creo que ya no funciona el truquillo. Si quitas el nombre de la provincia da error :(

garbanzosf dijo...

Efectivamente, he querido ser responsable y no se ha publicado la entrada hasta que los problemas han sido solucionados.

Un saludo!

Anónimo dijo...

Entoces ya no puedo seguir tu consejo de "crearte tu propio infobel" ;)

Guoezel dijo...

Y nos sorprende recibir tantas llamadas de publicidad... Menos mal que no hay unas páginas blancas móviles (aunque esto a lo mejor nos venia bien para saber quien llama)

Genial el post de hoy :)

fon dijo...

Y ésto no es denunciable a páginas blancas?, amos no me jodas...

Dasmandr dijo...

"podría hacer una lista de Apellidos de todos los datos obtenidos"
Toma:
#!/usr/bin/perluse Modern::Perl;use WWW::Mechanize;use Data::Dumper;use HTML::Entities;use HTML::TreeBuilder 3;my $mech = WWW::Mechanize->new();$mech->agent_alias('Linux Mozilla');my $url = 'http://www.ine.es/apellidos/formGeneralresult.do;apellidos02?vista=1';my $resp = $mech->post($url,                ['sel_3'    => '1',                 'total_3'  => '53',                 'cmb3'     => '00',                 'btnBuscar'=> '++Consultar++']);my $html = $resp->content;my $tb = HTML::TreeBuilder->new();$tb->parse($html);$tb->eof();binmode STDOUT, ':utf8';my @apellido = $tb->look_down('_tag','td','class','tableCellGr');for my $el (@apellido){    print $el->as_text,"\n";}

Kiko dijo...

pues cambiale el titulo, y pones " Mi infobel " y no se para que pones scripts y demas si ya no no se.funciona nada. me parece absurdo. cuenta la historia pero no te olvides de poner que ya esta solucionado el tema.. parece que .. en fin.
 

garbanzosf dijo...

Está puesto desde el primer momento en la última línea del artículo. El título me gusta como está, gracias por la recomendación.

La idea es mostrar como se hace con scripts, capturas y todo lo que me parezca bien, no para que venga... yo que se, alguien como tu y lo ejecute sin más :-)

Un saludo y gracias por tu comentario!

garbanzosf dijo...

La idea era pillar los apellidos del propio fichero generado (con 8 millones), pero la idea mola!

Dasmandr dijo...

Es que lo leí mal, pensé que querías tener una lista de apellidos y sólo cuando puse el comentario me dí cuenta de que lo querías sacar del propio fichero :D

Por otro lado: http://www.infobel.com/

http://www.infobel.com/es/spain/people.aspx?QLastname=aranda

Si vamos incrementando el valor de FirstRec=5 podemos sacar todos los números sin límite. IE http://www.infobel.com/es/spain/people.aspx?FirstRec=50&QLastname=aranda

De echo, parseando por ejemplo "Resultado
52-56 / 12433" sacamos el número de resultados y, como cada página muestra 5...

Xenomm dijo...

Realmente, tu script sigue siendo plenamente operativo, ya que solamente han hecho un lavado de cara pero no han solucionado NADA
cogemos la linea 7 de tu script

PARAMS="no=$name&sec=15&tbus=0&idioma=tml_lang&pg=$get&pext=null"

el bug antes consistia en quitar el nombre de la provincia, como bien has indicado, pero si sustituimos la linea por la siguiente:

PARAMS="no=$name&nomprov=tariro&tbus=0&idioma=tml_lang&pg=$get&pext=null"

volvemos a tener el sistema plenamente operativo, ya que ahora el nombre de la provincia es requerido, pero el parametro SEC, que indicaba el numero de la provincia, lo retiramos, poniendo una provincia con nombre falso, y listo. Funcionando otra vez
....un maquinon el programador que haya arreglado el problema si señor

garbanzosf dijo...

Era de esperar, yo apenas prove 2 cosicas más... pues nada, a chupar otra vez :-)))

Abilio Almeida Eiroa dijo...

En el enlace que pasas sobre Infobel, siguen vendiendo en su tienda estos CDs, no? --> http://eshop.infobel.com/es/world/ProductDetails.aspx?ProductID=199
(En la web se pueden consultar los datos también).

Abc dijo...

Pues que alguien se curre el pack y lo subís en algún sitio.

Alberto Ortega dijo...

Vuelve a funcionar a medias (más bien no), ya que ahora si que sólo se puede ir hasta la página 5, si pones algún número superior muestra la 1.

Onjoe dijo...

Lo cachondo es que luego dirán los de paginas blancas que les están hackeando la web. 

Increíble pero cierto, ya veréis como lo dicen.
Mas o menos dirán: " Recientemente hemos recibido ataques de hackers organizados en nuestros servidores, han intentado robar datos de nuestros servidores, pero nuestro "super-equipo técnico a trabajado hasta la extenuación para proteger los servidores, lo hechos han sido denunciados.

Y saldrá por los telediarios de Antena 3 y Tele5, entrevistaran a un seudo-hacker con voz distorsionada y de espaldas a camara, diciendo que entra donde le da la gana, "icluzo a la naza".

Luego los mayores se asustan "del interné", porque todo es malo, muy malo, diciendo que la juventud esta echada a perder, y como mi madre me dice, nada bueno estarás haciendo si estas  con el ordenador.

En fin.......,  saludos.

 

Eric5037 dijo...

si no se saben proteger es porque les da la gana o porque pagan a un pobre programador a 1000 euros al mes. para este precio, demasiado ha hecho. 

digamoslo claramente: no hace falta ser ningun hacker para sacar datos de sitios desprotegidos como las paginas amarillas españolas. yo no soy hacker y hago eso como me da la gana, solo soy un programador de un nivel intermedio.

en fin, es gracioso ver como en teoria es ilegal pero siguen habiendo paginas web que venden datos. ¿de donde viene estos datos?¿millones de datos opt in? lo dudo mucho. 

por cierto,señores de las paginas amarillas, no me metais mas centros comerciales como respuesta a la busqueda "discoteca".

por 4000 euros/mes (8 horas / dia), os protejo. de hecho casi diria que no hay nada que programar. ups, no digo mas.