Revolucionando el Web Scraping con IA
Tags: chatgpt, webscraping, python, ai
Published: 2024-01-03 01:03:17

## I. Introducción

Nunca deja de sorprenderme lo bueno que es chatGPT (OpenAI) cada vez ofreciendo diferentes funcionalidades como Dall-e 3 o los GPT's personalizados. Ahora siguiendo poniendo a prueba el nuevo modelo de gpt-4 Turbo veremos como la IA puede scrappear páginas web, específicamente parseando resultados de páginas de libros y resultados de google Maps. 

Todos sabemos lo "tedioso" que es hacer web scrapping, entender la estructura de un sitio web para que nuestro código pueda obtener resultados, estar en constante mantenimiento por si el sitio web cambia su estructura o si agregan funcionalidad con java script para cargar dinámicamente la información. Pero ¿Que pasaría si hubiera una manera de convertir este "tedioso" proceso en uno muy sencillo, adaptable a cualquier estructura? 




## II. Requisitos

Para seguir estos casos de uso, necesitarás:

- 1. Python 3.9+
- 2. Acceso al API de OpenAI



Como objetivo tenemos:

Empezamos scrappeando directamente el contenido HTML raw para una página de venta de libros y locales en GoogleMaps
Retornar resultados orgánicos 
Antes de que ejecuten este código les comento que hay un costo por utilización de token, a continuación les comparto lo que me costó realizar este experimento. 

> 1.21 dólares.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rmweutk80qbcigffiri4.png)

Pueden descargar todo el código clonando el repo de github:

https://github.com/JPierr3/openai-webscrapping/tree/main



## III. Contenido

1. Introducción langchain
2. Scrapper un sitio web estructurado sobre Libros con IA
3. Scrapper resultados orgánicos de Google Maps con IA
4. Notas Finales

## 1. Introducción langchain

Ya he hablado sobre langchain en otros artículos, en resumen es un Framework Open Source que nos permite combinar información externa con modelos de lenguaje natural LLM como ChatGPT. Langchain abre una puerta a un mundo de posibilidades. Y dese la salida de chatgpt 3.5 en marzo del 2023 ha tomado popularidad por su versatilidad en diferentes casos de uso.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nafw1wk5o21lmfo7965v.png)

## 2. Scrapper un sitio web estructurado sobre Libros con IA

Para calentar, utilizaremos el sitio web https://www.buscalibre.pe para scrappear que tiene una estructura interesante.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zrfgx3vv3hwsr1g2l233.png)

Nuestro experimento de IA no hará web scrapping como tal, solo tendrá la tarea de parsear la data HTML.
Empezamos instalando las librerías que necesitaremos:

`pip install requests langchain==0.0.312 pydantic==1.10.8 openai==0.28.1 selenium`

Utilizaremos pydantic para agregar decoradores a las clases y puedan ser interpretados de manera sencilla por OpenAI

Selenium y Requests nos permitirá obtener la data en HTML del sitio web



A continuación es el código base para obtener el HTML crudo:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/387qlsz3s45p6c80m8gm.png)

para fines prácticos definimos en el mismo archivo el token de OpenAI, y la URL del sitio web que vamos a enfocarnos y mediante el método get obtenemos el HTML crudo.

La parte de regex es para limpiar algunas cosas del HTML para no excedernos en los token de OpenAI, recodemos que nos cobran por token enviados y respondidos.

A continuación el código para extraer la información usando OpenAI


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6066u801ouha2wxnb1cl.png)

Empezamos creando las clases 'Libro' y 'LibroScrapper' donde definimos los atributos que necesitaremos y utilizamos Pydantic para definir una descripción de cada atributo y clase, por ejemplo 'Libro' con la descripción """Información acerca de un libro""" , le estamos asignando al modelo que esta clase tendrá ese propósito así mismo los atributos dentro de él.
Utilizamos 'convert_pydantic_to_openai_function(LibroScrapper)' para convertir esa clase a una función que openAI pueda procesar, por eso es que langchain es tan popular, nos ayuda a realizar este tipo de tareas, ya que la alternativa sería definir toda la estructura de la función como lo requiere OpenAI Function Calling OpenAI
Utilizamos el modelo pt-4-1106-preview (gpt4 Turbo)
Utilizamos el prompt "Eres un experto en hacer web scraping y analizar HTML crudo, si no se proporciona explícitamente no supongas" y le pasamos el HTML crudo para que lo analice.
Finalmente creamos la cadena (chain) con nuestros elementos prompt + model + json parser , e imprimimos el resultado de los libros. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c0avthr8b95z0cxikf1b.png)

Logramos obtener el título, puntuación y precio de cada libro exactamente lo que definimos en la clase de 'Libro', con esto podemos asignarle cualquier sitio web y la IA se encargará de extraer la información que necesitemos adaptándose a cualquier estructura 

> Tiempo en finalizar aprox 45s

## 3. Scrapper resultados orgánicos de Google Maps con IA

Ahora vamos a scrapear los datos que se encuentran en google maps, utilizaremos la siguiente URL:

https://www.google.com/maps/search/ceviche/@-8.1090524,-79.0215336,14z?hl=es

Podemos definir palabras de búsqueda luego de 'search/' en este caso buscamos lugares que vendan ceviche y también nos enfocamos en una región en especifico usando coordenadas de latitud y longitud, para este ejemplo la ciudad de Trujillo,Perú.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/16dpd2ebnnnyliijs81a.png)

Como observas, hay mucha información de cada local, como nombre, puntuación, precio, dirección, horario de atención, servicios etc.

Bueno empecemos pero antes, mencionar que google funciona de forma diferente a las páginas web tradicional ya que carga la información utilizando Javascript, por ese motivo ya no utilizaremos la librería de 'requests' en su lugar usaremos 'selenium'
El código base utilizando selenium, reducimos la cantidad de caracteres, ya que mi cuenta tiene un limite de tokens que puedo enviar, ese limite puede aumentar dependiendo del uso que tengas con las API's y lo que hayas consumido hasta la fecha.

Le agregamos el método 'implicity_wait(2)' para que espere 2 segundos en cargar la data y este lista para scrapearlo.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i4spyul3maezf7kuglre.png)

Tuve que recortar la cantidad de caracteres para ahorrar tokens porque eran demasiados los que se enviaban a OpenAI. Quedaría de la siguiente manera: 'html_text_truncado = html_text[800000:]'

Ahora el código utilizando el llamado de funciones de langchain+OpenAI


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l7a1unfccwipnyoiogky.png)

Definimos la clase de Local, que contendrá datos de los restaurantes, como nombre, calificación, dirección entre otros datos.

Usamos el mismo proceso anterior con ayuda a Pydantic y langchain para procesar el HTML crudo y obtener los datos.

definimos el prompt ´Eres un experto en el web scraping de restaurante de Google Maps. Extrae todos los datos de los resultados de restaurantes locales. Si no se proporciona información explícitamente, no supongas´

y finalmente obtenemos los resultados de los restaurantes donde venden ceviche en la ciudad de Trujillo.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9qb3hnzluez0yert76w.png)


Como podemos observar, todos los datos del local fueron capturados exitosamente. Probamos con otro restaurante.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rw0l134ok31r97pxvspy.png)

Cada atributo definido en la clase de local fue extraído del HTML crudo de google maps, con esto podemos utilizarla para tener una base de datos estructurada con datos actualizados de lo que necesitemos buscar.

> Tiempo finalizar aprox. 34 segundos


## 4. Notas Finales

Sin duda OpenAI mejora con el tiempo, con esto podemos recolectar información relevante de sitios web con la seguridad de que extraer la información correcta.

Estas nuevas tecnologías nos facilitan algunas tareas que vienen a ser tediosas como lo es el web scrapping.
Se puede utilizar los custom GPT para lograr esta tarea de openai.
Se logró realizar web scrapping de sitios web para obtener resultados organicos y devolverlos en formato JSON.
Realizamos el caso de uso con data de google maps con ayuda de selenium para cargar el HTML y enviarlo a OpenAI.
Como estamos enviando todo el HTML crudo, conlleva un gasto alto de token por lo que hacerlo de manera frecuente podría llevar a costos elevados, se puede intentar con LLM gratuitas para reducir costos.

Este articulo tiene fines educativo pero espero pueda servir de inspiración para grandes ideas! Si tienen alguna sugerencia o duda con este proyecto me lo comentan!.

Gracias por leer este post, felices fiestas! :)