acceder a paginas amarillas

27 de abril de 2008

Supongamos que somos un fabricante de tornillos y queremos introducir nuestro producto en diferentes tiendas como pueden ser ferreterías, grandes almacenes, centros de bricolaje, etc. Pues bien hay una manera más fácil que ir recorriendo todas las calles de nuestras ciudades buscando estos centros y es consultar directamente sobre paginas amarillas.

El objetivo es tener nuestra propia base de datos con posibles clientes y poder así cruzarla con los clientes que ya tenemos.
Dado que estamos tratando datos de carácter personal, que los estamos almacenando informáticamente en nuestras base datos y que posteriormente realizaremos una comunicación (electrónica o no) con estos posibles clientes, tendremos en primer lugar que registrar nuestra base de datos en la Agencia de protección de datos y luego al iniciar una comunicación con nuestros posibles clientes advertir de donde hemos sacado sus datos y de su derecho a cancelarlos. Recomiento leer esta resolución.

El objetivo de este post es explicar como extraer estos datos. Para ello utilizaremos un software Open llamado Web-Harvest que es un extractor de datos Web programado en Java. En las nuevas versiones creo que ya trae un editor grafico para configurar.

El problema ahora es encontrar la mejor fuente de paginas amarillas para extraer estos datos. Lo lógico es irse directamente a www.paginas-amarillas.es y sacarlos de allí, el problema es que está complicado: primero porque devuelve un numero limitado de registros y hay que acotar la búsqueda, y segundo su código HTML es difícil de manipular (los registros y la posición de los datos personales no siempre están en la misma posición).
Hay que navegar bastante hasta encontrar una pagina Web que se alimente de paginas amarillas, que de todos los registros sin necesidad de acotar y por ultimo el formato de los registros sea constante. Hay muchos portales que tienen contratado con paginas amarillas un buscador, entre ellos y el que mejor me ha resultado es el buscador de paginas amarillas de Ya.com.

Si nos vamos al buscador de paginas amarillas de Ya.com y buscamos todas las ferreterías de españa tenemos que en total hay 11.743 repartidas en 783 paginas y en cada una de ellas se muestran 15 registros siempre con un mismo formato HTML.

Veamos en HTML como se muestra cada resultado. Cada resultado se muestra dentro de una etiqueta Div (resultado) y seguidamente tenemos el nombre de la ferretería, una descripción, una Web y su dirección.

<div class="resultado">
   <h6><a target="_blank" href="http://www.paginasamarillas.es/functions/jump.asp?
site=xpaol&dest=www.comenza.com&c=128462084&t=IL&IPalianza=64.157.2.173
&producto=PAO&a=001&id_busq=xpao262793052024641203737573387486727&posicion=2
&ip_usuario=82.29.132.38">COMENZA</a></h6>
   <p>Productos de alta calidad, fabricados usando las últimas tecnologías.</p>
   <p><a target="_blank" href="http://www.comenza.com">www.comenza.com</a></p>   
   <p><span>Avenida Benigno Rivera, s/n (pol. ind. Ceao) LUGO LUGO 27290</span></p>
</div>
También vemos que la URL de paginas amarillas siempre se mantiene igual:

 http://paginas-amarillas.ya.com/SPagAmarillas/search?actividad=ferreterias&page=XXX
y lo único que varia es el parámetro page. Sabemos que tenemos 783 paginas (serán también el numero de consultas que tendrá que hacer nuestro programa).

Ahora solo nos queda instalar el programa Web-Harvest y lanzarlo para que vaya realizando las 783 peticiones Web y extraiga los datos de estas paginas. Hay que decir que los resultados se dejan en formato XML que posteriormente lo tendremos que cargar en nuestra base de datos o donde sea.

1) Nos instalamos el Java JDK y si ya lo tenemos hacemos una "java version" para ver que versión tenemos.
2) Nos descargamos el Web-Harvest y lo descomprimimos en una carpeta temporal. También necesitaremos estos jars adicionales que deberán copiarse en la misma carpeta.
3) Descomprimir estos archivos XML con la configuración ya hecha para atacar directamente contra Ya.com buscando ferreterias.
4) Lanzar el programa con "java -Xms32m -Xmx1000m -jar webharvest05.jar config=busca_ya.xml workdir=c:\temp debug=yes".

Dado que se procesan muchos registros antes de escribir en disco el XML con el resultado, es necesario aumentar la pila de Java a 1Gb con el parámetro -xmx1000m.

Una vez lanzado nos toca esperar. Como hemos lanzado la aplicación Java en modo debug iremos viendo como vamos realizando las 783 peticiones (es en este momento cuando loas administradores se llevan las manos a la cabeza y dices “Dios cuantas peticiones de una misma IP!”)

El archivo clave para la configuración es busca_ya.xml. De el sólo nos interesan las siguientes lineas:
<call-param name="pageUrl">http://paginas-amarillas.ya.com/SPagAmarillas/search?
actividad=ferreterias;page=1</call-param>
<call-param name="baseUrl">http://paginas-amarillas.ya.com/SPagAmarillas/search?
actividad=ferreterias&page=</call-param>
<call-param name="itemXPath">//div[@class="resultado"]</call-param>
<call-param name="maxloops">783</call-param>
La primera de ella nos indica cual será la primera pagina que accederemos. La segunda nos indica el formato de la URL para las siguientes peticiones. La tercera nos indica en formato XPath donde se encuentra los registros con los resultados. Por ultimo, la cuarta línea nos indica el numero de peticiones Web que tenemos que hacer.

Web-Harvest es una aplicación muy potente que nos puede dar ideas para muchas cosas. Recomiendo ver su librería de ejemplos y también este manual de XPath para poder realizar búsquedas correctas dentro del HTML.

Si te falta el número de teléfono puedes utilizar este programa para atacar contra Google Map que si te muestra el numero de teléfono.

descargar archivos fuentes del ejemplo

8 comentarios:

Anónimo dijo...

Muy buen manual pero faltan los enlaces para bajar los archivos de configuración para el ejemplo de las ferreterías y también el de Google de los teléfonos.

Si pudiera ser y nos es mucha molestia podrían colgarlos o enviarmelos a mcperezdiaz@telefonica.net

Muchas gracias de antemano.

Anónimo dijo...

Cómo comenta mcperezdiaz, muy bueno el manual pero sigo sin ver los links a los archivos de configuración.

Seria posible colgarlos o enviarlos a xcusi@innova-soft.com? seria de de gran ayuda ver un ejemplo de estas características.

Muchas gracias de antemano.

Anónimo dijo...

Ya tienes colgado los archivos fuentes del ejemplo.

Oskar dijo...

Hola amperis!

Muy bueno tu tutorial. He descargado todo lo necesario, y al ejecutarlo me da una excepción como esta:


Error on line 1 column 0
XPST0003: XQuery syntax error in ##:
Unexpected token "eof" in path expression
; Line#: 1
net.sf.saxon.trans.StaticError: XQuery syntax error in ##:
Unexpected token "eof" in path expression
CommandLine.main(Unknown Source)
Exception in thread "main" org.webharvest.exception.ScraperXPathException: Error parsing XPath e
at org.webharvest.runtime.processors.XPathProcessor.execute(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.run(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.executeBody(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.getBodyListContent(Unknown Source)
at org.webharvest.runtime.processors.VarDefProcessor.execute(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.run(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.executeBody(Unknown Source)
at org.webharvest.runtime.processors.EmptyProcessor.execute(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.run(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.executeBody(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.getBodyListContent(Unknown Source)
at org.webharvest.runtime.processors.WhileProcessor.execute(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.run(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.executeBody(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.getBodyListContent(Unknown Source)
at org.webharvest.runtime.processors.ReturnProcessor.execute(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.run(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.executeBody(Unknown Source)
at org.webharvest.runtime.processors.CallProcessor.execute(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.run(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.executeBody(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.getBodyListContent(Unknown Source)
at org.webharvest.runtime.processors.VarDefProcessor.execute(Unknown Source)
at org.webharvest.runtime.processors.BaseProcessor.run(Unknown Source)
at org.webharvest.runtime.Scraper.execute(Unknown Source)
at org.webharvest.runtime.Scraper.execute(Unknown Source)
at CommandLine.main(Unknown Source)
Caused by: net.sf.saxon.trans.StaticError: XQuery syntax error in ##:
Unexpected token "eof" in path expression
at net.sf.saxon.query.QueryParser.grumble(QueryParser.java:319)
at net.sf.saxon.expr.ExpressionParser.grumble(ExpressionParser.java:103)
at net.sf.saxon.expr.ExpressionParser.parseBasicStep(ExpressionParser.java:1340)
at net.sf.saxon.expr.ExpressionParser.parseStepExpression(ExpressionParser.java:1166)
at net.sf.saxon.expr.ExpressionParser.parseRelativePath(ExpressionParser.java:1106)
at net.sf.saxon.expr.ExpressionParser.parsePathExpression(ExpressionParser.java:1092)
at net.sf.saxon.expr.ExpressionParser.parseUnaryExpression(ExpressionParser.java:971)
at net.sf.saxon.expr.ExpressionParser.parseCastExpression(ExpressionParser.java:636)
at net.sf.saxon.expr.ExpressionParser.parseCastableExpression(ExpressionParser.java:605)
at net.sf.saxon.expr.ExpressionParser.parseTreatExpression(ExpressionParser.java:586)
at net.sf.saxon.expr.ExpressionParser.parseInstanceOfExpression(ExpressionParser.java:56
at net.sf.saxon.expr.ExpressionParser.parseIntersectExpression(ExpressionParser.java:100
at net.sf.saxon.expr.ExpressionParser.parseUnionExpression(ExpressionParser.java:986)
at net.sf.saxon.expr.ExpressionParser.parseMultiplicativeExpression(ExpressionParser.jav
at net.sf.saxon.expr.ExpressionParser.parseAdditiveExpression(ExpressionParser.java:903)
at net.sf.saxon.expr.ExpressionParser.parseRangeExpression(ExpressionParser.java:819)
at net.sf.saxon.expr.ExpressionParser.parseComparisonExpression(ExpressionParser.java:76
at net.sf.saxon.expr.ExpressionParser.parseAndExpression(ExpressionParser.java:380)
at net.sf.saxon.expr.ExpressionParser.parseOrExpression(ExpressionParser.java:362)
at net.sf.saxon.expr.ExpressionParser.parseExprSingle(ExpressionParser.java:316)
at net.sf.saxon.expr.ExpressionParser.parseExpression(ExpressionParser.java:280)
at net.sf.saxon.query.QueryParser.parseQuery(QueryParser.java:252)
at net.sf.saxon.query.QueryParser.makeXQueryExpression(QueryParser.java:103)
at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:475)
... 27 more


¿Cuál es el problema?

Muchas gracias y un saludo.

Fernando Reich Espinosa dijo...

Buenos días,

Les escribo para pedirles ayuda en relación a la siguiente duda:

¿Como se puede pasar parámetros de query en la URL de una Web aspx?

Intentaré explicarme, yo quiero agregar a la url: "http://evtde.argonautanet.com/Varios/ComprobacionTelefono.aspx" algún parámetro que automáticamente agregue el dato que solicita el formulario en el textbox y que el botón Aceptar se active.

Es decir, no quiero tener que ingresar el dato que solicita la página y hacer click en el botón Aceptar.

Al hacer click en dicho botón, la página no se redirecciona a ninguna otra página por lo que no puedo invocar otro link para realizar el query en cuestión.

Con la respuesta que ustedes me den pienso capturar el contenido de los query con Excel (algo que si se hacer).

Aunque si con Excel se pudiera realizar un query de un valor específico (o personalizado) y que el botón aceptar se haga click solo, también me interesa, así como cualquier otra solución alternativa (como un script).

Estos son los principales parámetros del código aspx:

TAB T=1
URL GOTO=http://evtde.argonautanet.com/Varios/ComprobacionTelefono.aspx
FRAME F=0
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:aspnetForm ATTR=ID:ctl00_Main_txtTelefono CONTENT=12344556
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:IMAGE FORM=ID:aspnetForm ATTR=ID:ctl00_Main_BtnComprobar

Saludos y gracias

Anónimo dijo...

He probado el programa de las Páginas Amarillas Extractor a encontrar aquí:
<a href="http://estrattoredati.com/index-en.html> Estrattoredati.com </a>

Anónimo dijo...

Yo tambien he estado buscando una aplicación similar para poder sacar datos y emails de las paginas amarillas y he encontrado una aplicación que me ha servido para tal proposito.. me permite capturar y extraer los datos que quiero.. pero veo que ahora la han hecho de pago , esta aqui http://www.picadata.com .. espero que les sirva de ayuda!

Saludos,

Lombo

Anónimo dijo...

Alguien que tenga el picadata descargado que me lo pueda pasar??? La web esta en actualización.

Mi mail es pjtorralvo@gmail.com

Gracias