Web Scraping es un método para extraer información de sitio web. El método consiste en utilizar un programa de computadora para simular un ser humano que navega por un determinado sitio web.
A este programa se le indica qué sitio web debe navegar y en la mayoría de los casos qué sección del sitio web es de interés. El programa navega por el sitio web y a medida que va a avanzando descarga la información en algún dispositio de almacenamiento, generalmente un disco rígido.
Una segunda etapa del web scraping, una vez que se tiene descargada las paǵinas del sitio web, es el parseo o extracción de la información de interés. Para esto se utilizan técnicas para extraer elementos del árbol DOM y/o matchear cadenas alfanuméricas, generalmente utilizando expresiones regulares.
Muchos sitios web modernos requieren que sea un browser el que navega o al menos algo que pueda emularlo. Para esto es necesario hacerse pasar lo más posible como un browser y hacer todo lo que haría un browesr: obtener cookies y enviarlas en cada request, setear correctamente los headers HTTP (Content-Type, User-Agent, etc). En el caso de obtención de datos vía submit de forms, se requiere una inspección manual previa del sitio web para detectar el nombre de los campos del form y cómo están populados, qué varía en cada carga de formulario, si hay un campo SELECT, qué valores puede tomar, etc.
Existen protecciones contra web scraping. La más común es el checkeo de la existencia de una cookie determinada y/o la limitación de la cantidad de requests por IP.
Ambos se puede bypassear utilizando un headless browser (browser a control remoto) y una red de proxies. Algunos sitios requieren directamente la ejecución de Javascript para poder visualizar las páginas web (p.ej aquello que están protegidos por Imperva o Incapsula). Otros sitios introducen un delay a propósito para que el request dé timeout (si está configurado con un timeout corto) y otros, luego de varios requests desde la misma IP, muestran un captcha que hay que resolver para poder seguir con el scraping.
El efecto de tener que utilizar un headless browser es hacer más lento el web scraping y la red de proxies incrementa el costo, ya que es un servicio que hay que contratar. Un headless browser, además de hacer más lento el scraping, incrementa el uso de RAM y CPU, con el consiguiente incremento de costos.
El método más simple pero hoy poco extendido debido a la exigencia de Javascript es utilizar la utilidad wget que puede hacer una copia espejo de un sitio web en nuestro disco rígido.
Cuestiones legales
El web scraping podría ser considerado en algunos sitios web como en desacuerdo con los términos y condiciones de uso razonable del sitio web pero el hecho es que si la información es pública (no se viola ningun login) y se hace un uso razonable de web scraping que no impacte en la performance del sitio web (como sí lo haría por ejemplo lanzar cientos o miles de headless browsers para scrapear un único sitio web), es poco lo que legalmente se puede argumentar en contra.
Vigencia en el tiempo
La programación de un web scraper es ad-hoc para cada sitio web. A grandes rasgos las técnicas de descarga de las páginas web son las mismas pero el parseo es distinto para cada sitio web. Si un sitio web decide modificar el diseño o, sin modificar el diseño, agrega un nuevo bloque HTML (o elimina uno existente), la lógica de parseo podría fallar ya que las instrucciones que se le dan al parser son muy específicas: ubicar tal DIV, dentro de este DIV, ubicar la tercera tabla, dentro de esta tabla, ubicar el table body, dentro del table body, obtener para cada fila las columnas 3 y 4. Es claro que un cambio, por mínimo que sea, podría tener un impacto enorme en el parser y no obtener la información que se necesita.
¿Qué lenguajes son los mejores para web scraping?
Si bien cualquier lenguaje con soporte para requests HTTP y expresiones regulares pueden funcionar, el hecho es que Python y PHP son ideales.
Python sobre todo tiene gran facilidad para manejar headless browsers.
¿Cómo se almacena la información extraída?
Lo más flexible es que la información parseada se guarda en formato JSON ya que permite el anidamiento de información, cosa imposible con una tabla (ya sea en CSV o Excel) que sólo permite 2 dimensiones.
Hoy en día hay bases de datos NoSQL (MongoDB) o incluso RDBMS (MariaDB) que soportan JSON.
En Common Sense utilizamos web scraping white-hat para obtener información de fuentes públicas.
Photo by Sai Kiran Anagani on Unsplash