Ni siquiera sabía que se llamaban “scrapers” , “crawlers” o “spiders”, pero ya los había utilizado como solución en algunos programas que por alguna que otra razón escribí. Resulta ser que “web scraping” según la Wiki, es…
… una técnica utilizada por softwares de computadora para extraer información de sitios webs. Usualmente, simula la navegación de un humano en la World Wide Web ya sea utilizando el protocolo HTTP manualmente, o incrustando un navegador en una aplicación…”
Típicamente esta técnica de análisis y procesamiento es utilizada en buscadores, aplicaciones para minería de datos, tendencias de mercado, y otras áreas. Para nada soy un experto en ninguno de los temas anteriores, pero como desarrollador que ha utilizado el “scraping” varias veces en cosas sencillas, he escrito este post para comentarles las ventajas que tiene procesar automáticamente la web en nuestras aplicaciones. 🙂
Pero … ¿por qué procesar la web en nuestras aplicaciones?
Precisamente porque en la web existe mucha información que ofrece respuestas y datos valiosos, pero que son sumamente difíciles (si no imposibles 🙁 ) de recopilar siendo un internauta humano. Es por eso que puedes lograr que manipulen y analicen el código de las páginas para:
Ahorrar esfuerzo a los usuarios:si bien la Web nos ofrece muchas ventajas, también es cierto que muchas veces conseguir la información que necesitamos puede costarnos tiempo y trabajo. Un fragmento de código que lea y analice datos de ciertos sitios webs, puede librarte de…
-
Estar visitando constantemente una o varias páginas para verificar si un dato se ha actualizado.
-
Lidiar con sistemas de navegación mal diseñados y dar mil clicks para encontrar algo específico en un sitio.
Esta app que escribí hace bastante, me permite buscar productos en un sitio de ventas mediante expresiones regulares, y dar seguimiento a sus precios cada un tiempo determinado.
Brindar soluciones astutas: ¡No fuerces al usuario a hacer trabajo extra!Muchas de las respuestas ya están en la Web esperando a que las uses. Además esto muchas veces brinda una solución más elegante y libre de parámetros y opciones que suministrar.
Por ejemplo, para una parte de mi tesis escribí un módulo que haciendo “scraping” a una dirección URL, encontrara los repositorios de NOVA y Ubuntu bajo esa dirección. De esa forma el usuario solo debía seleccionar los repositorios y componentes que quería utilizar y no lidiar manualmente con un “sources.list” y otras herramientas de Apt.
Puedes idear muchas soluciones interesantes que sigan por esta línea.
Para mantener actualizado el clima de mi Android, escribí un “scrapper” que busca el tiempo en varias páginas web y engaña a la app “AccurateWeather“ con un XML idéntico al que normalmente el software utiliza. Hoy fue un mediodía soleado… con bastante calor. 😀
Así debes empezar.
Algunos consejos para cuando tengas que usar “scraping” en una aplicación según mi experiencia.
-
Realiza primero un análisis del sitio (o los sitios) que vayas a “scrapear”. Ese es sin dudas el punto de partida: los URL que devuelven la información que necesites. Navega por los sitios y ve mirando cómo cambian las direcciones cuando entras en cada sección o sub-sección, así como el comportamiento de los parámetros y valores.
-
Consíguete un buen “parser” HTML. La humanidad ha avanzado mucho como para que interpretes el código a golpe de funciones de cadenas. Tómate un tiempo para buscar un buen “parser” según el lenguaje que utilices y seguro que encuentras alguno que valga la pena.
En algunos lenguajes es fácil encontrar varios. Por ejemplo en Python te recomiendo BeautifulSoup. En oros no hay muchas opciones :-/ , por ejemplo en C lo más decente que he utilizado es curl.
No uses editores XML, porque muchos sitios no validan ni siquiera que sus páginas estén bien formadas y algunos parsers no saben lidiar con esto. Va a traerte bastantes problemas.
-
Escribe tu lógica de “scraping”. O sea, la parte del software en que defines cómo vas a hacer y procesar las solicitudes, cómo vas a guardar los URL que vayas visitando, etc. Generalmente se comienza por un conjunto y luego recursivamente el conjunto va creciendo. En esta partehay un montón de cosas por definir y en las cuales la teoría de estos temas puede ayudarte mucho.
-
O usa un API especializado, como por ejemplo Scrapy para Python, o Web-Harvest para Java. Son cómodos porque solo tienes que implementar las reglas de extracción y de visita. Algunas veces no se puede hacer TODO con ellos (al menos así me ha pasado con los dos anteriores), pero sí gran parte.
Y nunca olvides que…
-
Si usas una lógica bien fea y que no tiene en cuenta una serie de cosas, el servidor puede vanear tu IP por exceso de solicitudeso porque demoras muy poco entre cada una. Esto cambia en dependencia de la página.
-
Debes tener en cuenta la paginación,porque la mayoría de las veces no todos los datos son visibles en una sola página. Muchas veces puedes resolverlo también con la URL, pero en algunos sitios no.
-
Hay contenidos que no pueden verse sin autenticarse, sin escribir un captcha u otras validaciones. Algunos API tienen maneras de lidiar con la autenticación, de lo contrario asegúrate “a mano” que estás autenticado antes de comenzar la búsqueda.
En cuanto a lo segundo… jaja… bueno si se enteran como pasar un captcha me lo dicen para aprender yo también. 😀
-
Existen páginas con una definición tan pobre y mal estructurada que es casi imposible hacer “scraping” a ellas 🙁 . Es algo sin remedio. La definición de un sitio debe permitir la validación de su contenido a favor de que haya forma de encontrar lo relevante.
Espero que les haya sido de utilidad el post. 🙂 Puedes encontrar más información sobre este tema y sobre cómo utilizarlo en tus proyectos personales en la página de “Web Scraping” de la Wikipedia y otras fuentes de internet.
¡Happy hacking! 😀
Más información
Comentarios ( 12 )
Genial!! O.O
@guille la app de la tienes??
Banear…
Por lo demás un excelente artículo.
mas que genial…. ya tengo cosas para pasar el rato….
Genial el artículo, no le doy a la web pero sí he visto esto(me acabo de enterar como se llama) aquí en la uci he visto algunos addons (cuenta, menu,personas,…) que lo que hacen es esto, pero… hay alguna forma de hacer esto “NO scraping”?. O sea según entendí o entras al sitio web con un browser o haces scapin para poder usar estos datos en otro tipo de aplicacion…? es esto exactamente?
Socio como podemos hacernos de la app que hiciste de Android para el tiempo?????
@ArturoBF
En realidad (como bien aclara el autor) lo que hace es reemplazar el xml de la aplicación por uno actualizado que genera el mismo, esto requiere un estudio de los ficheros que maneja cada aplicación para determinar donde debes reemplazarlo y el formato de datos que debe tener. Muy buena idea ya que estas apps consumen desde internet y por esta vía pueden usarse en la intranet cubana. Personalmente he parseado en apps de Android(casualmente una para el tiempo)y con javascript se hace sencilla la tarea de extraer los nodos con la info que nos interesa simplemente se pide la pagina y se identifica el nodo con la info.
hace un tiempo puse esta extencion para el crhome:
http://humanos.uci.cu/2011/06/redmine-helper-la-extencion-del-ano/
realmente desde las extenciones de chrome, con un poquito de JS el scraping sale chupao…
Estoy hace tiempo por hacer una para pasar asistencia en akademos y otra para la reservacion del pase de fin de año….
Desgraciadamente aqui en la UCI tenemos que hacer scraping por la falta de webservices.
Hola a todos! Mis disculpas por la demora de las respuestas.
@Allan
No entiendí mucho la pregunta. ¿A qué app te refieres? Tengo unas cuantas hechas.
@Alvaro Denis
No. No hay otra manera de hacerlo. Es como preguntar “¿se puede hacer scraping sin hacer scraping?”. jeje. A no ser que resuelvas consumiendo un servicio Web o algún API que ofrecen algunos sitios. Y hasta eso tiene su desventaja: no todos los sitios ofrecen un API, pero todos los sitios pueden ser “scrapeados”
@ArturoBF
En realidad fue un invento que se me ocurrió. La app para android ya estaba hecha. Es la que viene por defecto para el clima en android 4.0.3. “AccurateWeather”. Lo que hice fue la aplicación servidora que genera los XML que utiliza la apk, y ke el teléfono utiliza para actualizarse. No está ni empaquetada, porque es una de esas aplicaciones que empiezas a hacer y cuando está pinchando la dejas cmo está, pero puedo gestionar ponerla en el FTP para descargas cuando le termine algunos detalles.
También aquellos que quieran pudiesen hacer una herramienta completa con una apk nueva de clima para android, pero… ¡¡”AccurateWeather” tiene unos gráficos muy chéveres!! 😛
@JorgeR3
Precisamente fue necesario hacer la ingeniería inversa con un sniffer. Parsear el XML fue fácil. Lo menos complicado en realidad de la aplicación es la parte del “scraping”, pero sí un poco más cambiar la estructura del paquete “request” que manda la apk, para que consulte tu “servidor” en vez del de Internet. 🙂 Deja ver si puedo ponerla “decente” para subirla al FTP y la usen.
Un saludo y gracias por los comentarios. También me ocuparé cuanto antes de arreglar los errores de formato del post.
hola buen dia felicidades me parece fantastico este articulo, perdona el atrevimiento, pero megustaria tener mas informacion sobre el tema no se si me podrias recomendar algun articulo, boy a ser mi tesis de este tema y te agradeceria que me orientaras sobre el. de ante mando gracias
como parser un html en python o mejor como tomar el resultado
No se si ya solucionaste de los capchas, pero he realizado algunos proyectos sobre web scraping , y la forma de saltarse , es buscar a la url donde direcciona los datos y hay estan ya solo algunos parametros en post o get .
Pero te escribo para ver si me pued comunicar con tigo porq veo q manejas la tecnica desde ya algun tiempo y ver si me puedes hechar una mano con algo que estoy haciendo @w2pwinlinux