Web scraping para extraer información utilizando requests y BeautifulSoup en Python
Tags: python, webscraping, requests, beautifulsoup
Published: 2023-12-29 08:20:02

## Introducción

En el mundo de la programación, el scraping web se ha convertido en una técnica esencial para extraer información útil de sitios web. En esta guía, voy a explorar contigo cómo implementar scraping web utilizando Python, específicamente con las bibliotecas `requests` y `BeautifulSoup` mediante un caso práctico: extraer datos de un directorio de empresas y comercios del Ayuntamiento de Gelida (Barcelona).

## Background

**¿Qué es el Scraping Web?**
El scraping web es el proceso de recopilar datos estructurados de sitios web de manera automatizada. Es ampliamente utilizado en la recopilación de datos, el análisis competitivo, la investigación de mercado, entre otros.

**Herramientas Utilizadas**

- **Python**: Un lenguaje de programación versátil y fácil de aprender.

- **Requests**: Una biblioteca de Python para realizar peticiones HTTP de manera sencilla.

-  **BeautifulSoup**: Una biblioteca que facilita el análisis de documentos HTML y XML, permitiendo extraer datos de manera eficiente.

## Hands On: 

El script de Python realiza scraping del directorio web de comercios y empresas del pueblo de Gelida (Barcelona) y extrae información relevante. Aquí está el código completo:

```
import requests
from bs4 import BeautifulSoup

def scrape_directory(url, page_number):
    # Modificar la URL para incluir el número de página
    page_url = f"{url}?pag={page_number}"
    response = requests.get(page_url)
    soup = BeautifulSoup(response.text, 'html.parser')

    comercios = []

    ul = soup.find("ul", class_="clear articlelist default")
    if ul:
        for li in ul.find_all("li"):
            tpl_default = li.find("div", class_="tplDefault")
            if tpl_default:
                subtitle_element = tpl_default.find("a", class_="subtitle")
                if subtitle_element:
                    comercio_info = subtitle_element.text.strip()
                    comercios.append({
                        "info": comercio_info
                    })

    return comercios

# URL base del directorio
base_url = "https://www.gelida.cat/el-municipi/empreses-i-comercos"

# Número total de páginas a recorrer
total_pages = 7

# Recorrer todas las páginas y extraer la información
all_comercios = []
for page in range(1, total_pages + 1):
    comercios = scrape_directory(base_url, page)
    all_comercios.extend(comercios)

contador = 0

# Imprimir los resultados para verificar
for comercio in all_comercios:
    print(comercio)
    contador += 1

print(f"En total hay {contador} comercios")

```


El script se divide en varias partes clave:

**1.Importación de Bibliotecas**: Se incluyen las bibliotecas necesarias para el proceso de scraping.

```
import requests
from bs4 import BeautifulSoup
```

**2.Definición de la Función scrape_directory**:

- Parámetros: url (URL del directorio), page_number (número de página a analizar).

- Proceso: Modifica la URL, usa `requests` para una petición HTTP, y analiza el contenido HTML para extraer datos utilizando `BeautifulSoup`.

```
def scrape_directory(url, page_number):
    page_url = f"{url}?pag={page_number}"
    response = requests.get(page_url)
    soup = BeautifulSoup(response.text, 'html.parser')
```

**3.Bucle para Recorrer Páginas**: 

- Se define la URL base y el número total de páginas. 
- Se itera sobre cada página, extrayendo y acumulando la información de los comercios.


![Web scraping para extraer información utilizando requests y BeautifulSoup en Python - Albert Gil López](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mk9839wc2xhugfdhz3oo.png)

```
comercios = []

    ul = soup.find("ul", class_="clear articlelist default")
    if ul:
        for li in ul.find_all("li"):
            tpl_default = li.find("div", class_="tplDefault")
            if tpl_default:
                subtitle_element = tpl_default.find("a", class_="subtitle")
                if subtitle_element:
                    comercio_info = subtitle_element.text.strip()
                    comercios.append({
                        "info": comercio_info
                    })

    return comercios
```

En nuestro directorio, si inspeccionamos los elementos de la web tenemos que buscar un `ul` con una clase específica. Luego iteramos sobre cada `li` para extraer datos de los comercios y almacenamos la información en una lista.

**Ejecución y Resultados**

- El script se ejecuta para recorrer el número total de páginas especificadas, recopilando datos de cada comercio.
- Al final, se imprime la información recopilada y se muestra el número total de comercios encontrados.

```
# URL base del directorio
base_url = "https://www.gelida.cat/el-municipi/empreses-i-comercos"

# Número total de páginas a recorrer
total_pages = 7

# Recorrer todas las páginas y extraer la información
all_comercios = []
for page in range(1, total_pages + 1):
    comercios = scrape_directory(base_url, page)
    all_comercios.extend(comercios)

contador = 0

# Imprimir los resultados para verificar
for comercio in all_comercios:
    print(comercio)
    contador += 1

print(f"En total hay {contador} comercios")
```

## Conclusión
El ejemplo proporcionado muestra el poder y la flexibilidad de Python para el scraping web. Mediante `requests` y `BeautifulSoup`, podemos acceder y extraer datos de sitios web de manera eficiente. Este conocimiento abre puertas a numerosas aplicaciones en diversos campos como el análisis de datos, el marketing digital y mucho más. Es importante recordar siempre respetar las políticas de uso de los sitios web y las leyes de protección de datos al realizar scraping.

**What's Next, próximos pasos:**

- [Búqueda en tiempo real automatizada con Google Maps y Selenium](https://dev.to/albertgilopez/buqueda-en-tiempo-real-automatizada-con-google-maps-y-selenium-21h7)
- [Web scraping para extraer información utilizando requests y BeautifulSoup en Python](https://dev.to/albertgilopez/web-scraping-para-extraer-informacion-utilizando-requests-y-beautifulsoup-en-python-mmm)
- [Gemini AI: Extracción de datos estructurados con Gemini Pro Vision y Pydantic
](https://medium.com/@jddam/extracci%C3%B3n-de-datos-estructurados-con-gemini-pro-vision-y-pydantic-345577edb344)
- [Gemini AI: Data mining, extracción de información, topics, keywords y etiquetas](https://medium.com/@jddam/gemini-ai-data-mining-extracci%C3%B3n-de-informaci%C3%B3n-topics-keywords-y-etiquetas-dae2caa698ea)

**Comparte tu experiencia:**
Estoy abierto a colaborar y discutir sobre las posibilidades que ofrece la inteligencia artificial y cómo trabajar juntos para explorar y construir soluciones innovadoras. Si tienes ideas, preguntas o simplemente quieres hablar de ello, escríbeme:

GitHub: [https://github.com/albertgilopez](https://github.com/albertgilopez)
LinkedIn: [https://www.linkedin.com/in/albertgilopez/](https://www.linkedin.com/in/albertgilopez/)
Inteligencia Artificial Generativa en español: [https://www.codigollm.es/](https://www.codigollm.es/)