<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Albert Gil López</title>
    <description>The latest articles on DEV Community by Albert Gil López (@albertgilopez).</description>
    <link>https://dev.to/albertgilopez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1234664%2F383a5773-94d4-4a3c-b23a-aacc2a5df9c1.jpeg</url>
      <title>DEV Community: Albert Gil López</title>
      <link>https://dev.to/albertgilopez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/albertgilopez"/>
    <language>en</language>
    <item>
      <title>Búqueda en tiempo real automatizada con Google Maps y Selenium</title>
      <dc:creator>Albert Gil López</dc:creator>
      <pubDate>Fri, 29 Dec 2023 09:58:15 +0000</pubDate>
      <link>https://dev.to/albertgilopez/buqueda-en-tiempo-real-automatizada-con-google-maps-y-selenium-21h7</link>
      <guid>https://dev.to/albertgilopez/buqueda-en-tiempo-real-automatizada-con-google-maps-y-selenium-21h7</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;En el mundo en el que vivimos la automatización de procesos se ha convertido en un pilar fundamental para mejorar la eficiencia y reducir costes. En este artículo, voy a explorar contigo cómo automatizar la búsqueda de información en Google Maps y la captura de imágenes de ubicaciones utilizando Python mediante un script que combina las bibliotecas &lt;code&gt;googlemaps&lt;/code&gt; y &lt;code&gt;selenium&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;Python se ha posicionado como un lenguaje líder para la automatización de tareas gracias a su simplicidad y a la amplia gama de bibliotecas disponibles. En nuestro caso, utilizaremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;googlemaps&lt;/strong&gt;: Para interactuar con la API de Google Maps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;selenium&lt;/strong&gt;: Para automatizar acciones en navegadores web.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import googlemaps

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

# otras librerías auxiliares

import re
import time
import logging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google Maps ofrece una API con muchas funcionalidades que permite a los desarrolladores acceder a datos y funcionalidades de mapas. Utilizaremos esta API para buscar comercios por nombre y obtener sus coordenadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands On
&lt;/h2&gt;

&lt;p&gt;El código completo para realizar la búsqueda en Google Maps es el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def buscar_en_google_maps(nombre_comercio, google_maps_key, location, radius=5000):
    gmaps = googlemaps.Client(key=google_maps_key)

    print(f"Voy a buscar este comercio {nombre_comercio}")
    resultados = gmaps.places(query=nombre_comercio, location=location, radius=radius)

    # Extraer la URL del primer resultado
    if resultados['results']:
        place_id = resultados['results'][0]['place_id']
        # Construir la URL de Google Maps
        url = f"https://www.google.com/maps/place/?q=place_id:{place_id}"
        return url
    return None

# Tu clave API de Google Maps
GOOGLE_MAPS_KEY = 'tu-clave-api-key'

# Coordenadas de tu ubicación (latitud, longitud)
LOCATION = (X,Y)  # reemplaza con las coordenadas correctas

# lista de nombres de comercios
nombres_comercios = ['Comercio Local 1, 'Comercio Local 2, 'Comercio Local 3']

# Buscar cada comercio en Google Maps
for nombre in nombres_comercios:
    resultados = buscar_en_google_maps(nombre, GOOGLE_MAPS_KEY, LOCATION)
    # Procesar y almacenar los resultados según sea necesario
    print(resultados)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script se divide en varias secciones funcionales:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Búsqueda en Google Maps:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.Utiliza la API de Google Maps para buscar un comercio por nombre&lt;/strong&gt;. Esta es la definición de la función &lt;code&gt;buscar_en_google_maps&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parámetros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nombre_comercio&lt;/strong&gt;: El nombre del comercio que se quiere buscar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;google_maps_key&lt;/strong&gt;: La clave API para acceder a los servicios de Google Maps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;location&lt;/strong&gt;: Las coordenadas geográficas (latitud y longitud) cerca de donde se realizará la búsqueda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;radius&lt;/strong&gt;: El radio en metros dentro del cual se desea buscar, con un valor predeterminado
de 5000 metros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2.Extrae la URL de la ubicación del primer resultado.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se utiliza el método &lt;code&gt;places&lt;/code&gt; del cliente de Google Maps para buscar comercios.&lt;/li&gt;
&lt;li&gt;Se pasan el nombre del comercio, la ubicación y el radio como argumentos para el método places.&lt;/li&gt;
&lt;li&gt;Si hay resultados, se extrae el &lt;code&gt;place_id&lt;/code&gt; del primer comercio encontrado.&lt;/li&gt;
&lt;li&gt;Se construye y devuelve una URL de Google Maps que apunta directamente al comercio utilizando su &lt;code&gt;place_id&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Automatización con Selenium:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El código completo para automatizar la captura de información en el navegador utilizando &lt;code&gt;Selenium&lt;/code&gt; es el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def click_zoom_in(driver, times):
    try:
        zoom_in_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.ID, "widget-zoom-in"))
        )
        for _ in range(times):
            zoom_in_button.click()
            time.sleep(1)  # Espera breve entre cada clic
        time.sleep(5)  # Espera adicional para que el mapa se actualice después del último clic
    except Exception as e:
        logger.warning(f"No se pudo realizar el zoom: {e}")

def accept_cookies(driver):
    try:
        logger.info("Buscando el botón de aceptar cookies")
        accept_cookies_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//span[contains(text(), 'Aceptar todo')]"))
        )
        accept_cookies_button.click()
        logger.info("Cookies aceptadas")
    except Exception as e:
        logger.warning(f"No se encontró el botón de aceptar cookies: {e}")


def format_filename(name):
    # Eliminar caracteres especiales y reemplazar espacios por guiones bajos
    return re.sub(r'[^\w\s-]', '', name).replace(' ', '_')


def capture_webpage_screenshot(url, path_to_save_image):
    try:
        logger.info("Iniciando el servicio de ChromeDriver")
        service = Service(ChromeDriverManager().install())

        logger.info("Creando una instancia del driver de Chrome")
        driver = webdriver.Chrome(service=service)

        logger.info(f"Accediendo a la URL: {url}")
        driver.get(url)

        # Intenta aceptar las cookies
        accept_cookies(driver)

        # Realizar zoom en la página
        click_zoom_in(driver, 1)  # Ajusta este número según sea necesario

        driver.set_window_size(1920, 1080)  # Ajusta según necesites

        logger.info(f"Guardando captura de pantalla en: {path_to_save_image}")
        driver.save_screenshot(path_to_save_image)
    except Exception as e:
        logger.error(f"Se produjo un error: {e}")
    finally:
        logger.info("Cerrando el driver de Chrome")
        driver.quit()

def process_comercios(comercios, google_maps_key, location):
    for comercio in comercios:
        url = buscar_en_google_maps(comercio['info'], google_maps_key, location)
        if url:
            filename = format_filename(comercio['info']) + ".png"
            path_to_save_image = "ruta-para-guardar-la-imagen"
            capture_webpage_screenshot(url, path_to_save_image)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ejemplo de uso

# lista de nombres de comercios
nombres_comercios = ['Comercio Local 1, 'Comercio Local 2, 'Comercio Local 3']

# Tu clave API de Google Maps
GOOGLE_MAPS_KEY = 'tu-clave-api-key'

# Coordenadas de tu ubicación (latitud, longitud)
LOCATION = (X,Y)  # reemplaza con las coordenadas correctas

process_comercios(nombres_comercios, GOOGLE_MAPS_KEY, LOCATION)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selenium inici un navegador automatizado:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Realiza acciones como aceptar cookies y hacer zoom.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Accede a la URL de Google Maps y captura una imagen de la ubicación.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Guarda la imagen en un directorio específico.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Función click_zoom_in:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objetivo: Hacer zoom en la página web un número específico de veces.&lt;/li&gt;
&lt;li&gt;Parámetros: driver (el navegador automatizado de Selenium), times (número de veces para hacer zoom).&lt;/li&gt;
&lt;li&gt;Método: Utiliza WebDriverWait y expected_conditions para esperar hasta que el botón de zoom esté disponible y luego hace clic en él el número de veces especificado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Función accept_cookies:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objetivo: Aceptar las cookies en una página web.&lt;/li&gt;
&lt;li&gt;Parámetro: driver (navegador automatizado).&lt;/li&gt;
&lt;li&gt;Método: Busca y hace clic en el botón para aceptar todas las cookies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Función format_filename:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objetivo: Formatear los nombres para ser usados como nombres de archivos.&lt;/li&gt;
&lt;li&gt;Método: Elimina caracteres especiales y reemplaza espacios por guiones bajos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Función capture_webpage_screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objetivo: Capturar y guardar una captura de pantalla de una URL.&lt;/li&gt;
&lt;li&gt;Parámetros: url (URL de la página a capturar), path_to_save_image (ruta donde guardar la imagen).&lt;/li&gt;
&lt;li&gt;Método: Inicia un navegador Chrome automatizado, accede a la URL, acepta cookies, hace zoom y captura una captura de pantalla de la página.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Función process_comercios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objetivo: Procesar una lista de comercios, obtener sus URLs de Google Maps y capturar capturas de pantalla de sus ubicaciones.&lt;/li&gt;
&lt;li&gt;Método: Itera sobre una lista de comercios, llama a la función buscar_en_google_maps para obtener la URL, y luego llama a capture_webpage_screenshot para capturar y guardar una captura de pantalla.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El script se prueba con una lista de nombres de comercios en una ubicación específica. Cada comercio se busca en Google Maps, y se captura una imagen de su ubicación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Este script es un ejemplo práctico de cómo Python se puede utilizar para automatizar tareas complejas como la búsqueda de información en mapas y la captura de imágenes. La combinación de estas bibliotecas ofrece una solución flexible para cubrir diferentes necesidades de automatización dependiendo de tu sector o proyecto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next, próximos pasos:&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Comparte tu experiencia:&lt;/strong&gt;&lt;br&gt;
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:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/albertgilopez"&gt;https://github.com/albertgilopez&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/albertgilopez/"&gt;https://www.linkedin.com/in/albertgilopez/&lt;/a&gt;&lt;br&gt;
Inteligencia Artificial Generativa en español: &lt;a href="https://www.codigollm.es/"&gt;https://www.codigollm.es/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>googlesearch</category>
      <category>realtime</category>
      <category>selenium</category>
    </item>
    <item>
      <title>Web scraping para extraer información utilizando requests y BeautifulSoup en Python</title>
      <dc:creator>Albert Gil López</dc:creator>
      <pubDate>Fri, 29 Dec 2023 08:20:02 +0000</pubDate>
      <link>https://dev.to/albertgilopez/web-scraping-para-extraer-informacion-utilizando-requests-y-beautifulsoup-en-python-mmm</link>
      <guid>https://dev.to/albertgilopez/web-scraping-para-extraer-informacion-utilizando-requests-y-beautifulsoup-en-python-mmm</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;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 &lt;code&gt;requests&lt;/code&gt; y &lt;code&gt;BeautifulSoup&lt;/code&gt; mediante un caso práctico: extraer datos de un directorio de empresas y comercios del Ayuntamiento de Gelida (Barcelona).&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es el Scraping Web?&lt;/strong&gt;&lt;br&gt;
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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Herramientas Utilizadas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt;: Un lenguaje de programación versátil y fácil de aprender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Requests&lt;/strong&gt;: Una biblioteca de Python para realizar peticiones HTTP de manera sencilla.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BeautifulSoup&lt;/strong&gt;: Una biblioteca que facilita el análisis de documentos HTML y XML, permitiendo extraer datos de manera eficiente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Hands On:
&lt;/h2&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script se divide en varias partes clave:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.Importación de Bibliotecas&lt;/strong&gt;: Se incluyen las bibliotecas necesarias para el proceso de scraping.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.Definición de la Función scrape_directory&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Parámetros: url (URL del directorio), page_number (número de página a analizar).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proceso: Modifica la URL, usa &lt;code&gt;requests&lt;/code&gt; para una petición HTTP, y analiza el contenido HTML para extraer datos utilizando &lt;code&gt;BeautifulSoup&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def scrape_directory(url, page_number):
    page_url = f"{url}?pag={page_number}"
    response = requests.get(page_url)
    soup = BeautifulSoup(response.text, 'html.parser')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.Bucle para Recorrer Páginas&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se define la URL base y el número total de páginas. &lt;/li&gt;
&lt;li&gt;Se itera sobre cada página, extrayendo y acumulando la información de los comercios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmk9839wc2xhugfdhz3oo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmk9839wc2xhugfdhz3oo.png" alt="Web scraping para extraer información utilizando requests y BeautifulSoup en Python - Albert Gil López" width="800" height="409"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Ejecución y Resultados&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 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")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;El ejemplo proporcionado muestra el poder y la flexibilidad de Python para el scraping web. Mediante &lt;code&gt;requests&lt;/code&gt; y &lt;code&gt;BeautifulSoup&lt;/code&gt;, 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next, próximos pasos:&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Comparte tu experiencia:&lt;/strong&gt;&lt;br&gt;
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:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/albertgilopez"&gt;https://github.com/albertgilopez&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/albertgilopez/"&gt;https://www.linkedin.com/in/albertgilopez/&lt;/a&gt;&lt;br&gt;
Inteligencia Artificial Generativa en español: &lt;a href="https://www.codigollm.es/"&gt;https://www.codigollm.es/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>requests</category>
      <category>beautifulsoup</category>
    </item>
  </channel>
</rss>
