Analytics | Data | Transformación Digital | Inteligencia Artificial

Blog

El vago, GPT y #webscraping

Hoy me confieso: soy una #webscraper. Uso mis habilidades para extraer información de las webs. Pero también soy vaga. Y ya sabéis que no me gusta hacer lo mismo dos veces si hay una máquina que lo puede hacer.

La estadística

  • Categoría A: 70% de las webs son juegos de niños. El desarrollo de un Bot a medida es casi un insulto para el vago.
  • Categoría B: 15% de las webs tienen una dificultad algo más alta, requieren renderizado java y ello fuerza a usar algo de tecnología más avanzada. Vale, para un niño no, quizá para adolescentes avispados. Y el desarrollo de un Bot a medida ya es casi entretenido. Casi.
  • Categoría C: 10% de las webs tienen sistemas de protección de ataques DoS (nº de peticiones por IP, frecuencia de peticiones, tokens, detección de cabeceras, cosas así). Hay que ser respetuosos para que no confundan tu Bot con un ataque y sobre todo, tener presente lo que los propietarios te indican desde el robots.txt. Estas webs son más entretenidas. Encontrar la manera adecuada de extraer la información sí es retador. Esto ya es una cosa de mayores.
  • Categoría D: el 5% restante. Las más complicadas. Engloban todas las complejidades de las categorías A, B y C y a veces alguna otra. Con estas desisto. Pero estudiarlas es muy muy entretenido y divertido.

Los bots a medida caducan

Sí. Es un hecho. Las webs cambian y a veces un simple cambio de CSS hace que el Bot hecho a medida deje de ser válido. Imagina un proyecto que recoja información de 100 webs. Mantener operativos 100 bots de categoría A, B y C puede llevarte el resto de la vida. Y sobre todo que, según la estadística, 70 de esos bots son realmente sencillos y la inversión de tiempo parece excesiva.

GPT para extraer datos

¿Qué pasaría si le pido directamente a #GPT4 que me extraiga los datos de una web? Veamos… un prompt un poco largo… un poco de Python para iterar por la web… esto sigue siendo a medida pero ya lo arreglaré luego si GPT me da bien los datos… y ¡¡¡funciona!!! GPT me devuelve los datos que le he pedido en lenguaje humano perfectamente formateados en JSON procesable. Sólo hay dos pegas. Enooooooormes:

  1. El coste de los tokens (millones de tokens a procesar).
  2. El tiempo de proceso. ¡¡¡Es lentísimo!!! casi dos segundos por página. Inasumible para un entorno masivo.

Hay que ir en otra dirección.

La idea

Aquí la idea no es mía. Una web de indexación de IA’s (https://theresanaiforthat.com/) y una de las IA’s descubiertas en dicha web (https://www.kadoa.com/) me ponen tras la pista. #Kadoa usa GPT para generar código Python adaptado a una web que se le solicita. ¡Pues claro! ¡No debería hacer falta perder el tiempo en las webs de categoría A si hay una máquina que lo puede hacer! La única pega de Kadoa es que… tiene un coste. Una es vaga y también tacaña. Pues modo garaje ON.

El desinflado

“Esto lo puedo hacer yo”, me digo mientras hecho mano a la API de GPT. Pero muy pronto constato que la tecnología aún está muy verde. Generar código que procese todo el volumen de HTML de una web usando GPT no es fácil de momento. Una web de tamaño pequeño ya sobrepasa el límite de tokens de la mayoría de modelos actuales. La técnica de particionado hace que el código generado no sea a veces útil. Dicho código generado no incluye las iteraciones necesarias para resolver las paginaciones de las webs, con lo que sólo se procesa la primera página. El código obtenido a veces falla por errores perfectamente controlables… buf.

Afortunadamente, tengo muchas más armas e ideas. ¿Qué pasaría si a GPT le damos sólo el trozo de HTML que contiene la información relevante? ¿Y si la iteración de las páginas se la damos resuelta?

La información relevante

La clave está en pasarle a GPT sólo el pedazo de HTML que contiene la información a extraer. Veamos. Esta información habitualmente está en listas. Las listas son conjuntos de elementos todos iguales cuyo contenido cambia. ¡Ajá! Aquí se puede usar estadística. Pues hala: un poco de #BeautifulSoup, un poco de #Pandas para calcular variables, un etiquetado manual para construir una variable target, un poco de #SpaCy para categorizar palabras, un poco de #Scikit-learn con un modelo GBT de clasificación y ¡voila!. Tengo ya un arma que señala qué trozos del HTML tienen más probabilidades de ser las listas que necesito. ¿Qué hará GPT con esto? Pues un poco de ingenio con el prompt y consigo una pieza de código Python perfecto habiendo usado nada más que unos pocos tokens y cuyo tiempo de ejecución es exactamente el mismo que el de un Bot a medida. Además, esto de hacer que un programa escriba programas para otros programas tiene algo de Matrix que me seduce.

La iteración

Chupado. Si he sido capaz de identificar la lista, elaborar un modelo probabilístico que la identifique y pedirle a GPT que me construya un scraper… iterar en una paginación debe ser un juego de niños… Y lo es. Aquí tengo que usar varios modelos para diferentes tipos de sistemas de paginación porque si no, la precisión disminuye. Pero es sólo echarle un poco más de paciencia.

El programa que ejecuta programas escritos por otro programa

Y ahora sólo queda juntarlo todo. El resultado: un Bot genérico (e inteligente, jeje) que es capaz de procesar páginas de categoría A divinamente. De repente, tengo el 70% del trabajo automatizado. Bueno, algo menos, que mi Bot genérico de momento sólo procesa cosas muy básicas. Pongamos un 40%. Pero igualmente me sirve para ir a tomarme unas cervezas con el tiempo libre. Hala.

Nunca subestimes a un vago.