Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Sugerencia] scraper

import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, WebDriverException
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

def scrape_restaurantes_info(url):
    if not url:
        print("Error: URL vacía.")
        return None

    driver = None
    try:
        service = Service(ChromeDriverManager().install())
        options = webdriver.ChromeOptions()
        
        #  CAMBIO CLAVE: Comentamos el modo Headless para que la ventana se abra.
        # Esto permite que Cloudflare valide tu entorno como un "Humano Real" con monitor.
        # options.add_argument("--headless") 
        
        options.add_argument("--no-sandbox")
        options.add_argument("--disable-dev-shm-usage")
        
        # Cambiamos a un User Agent común y corriente de una máquina Windows estándar
        options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
        
        # Parámetros para mitigar la bandera de automatización
        options.add_argument("--disable-blink-features=AutomationControlled")
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option("useAutomationExtension", False)
        
        # Evita conflictos de puertos locales de depuración
        options.add_argument("--remote-debugging-port=9222")

        driver = webdriver.Chrome(service=service, options=options)
        
        # Borramos el rastro del objeto webdriver en el navegador
        driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
        })
        
        # Maximizamos la ventana para simular un comportamiento de navegación típico
        driver.maximize_window()
        driver.set_page_load_timeout(45)

    except Exception as e:
        print(f"Error al inicializar el driver: {e}")
        if driver: driver.quit()
        return None

    try:
        print(f"Tratando de cargar la página con Selenium (Modo Visible): {url}")
        driver.get(url)
        
        #  Esperamos 8 segundos completos en pantalla para que la página renderice todo
        print("Esperando la carga de componentes asincrónicos...")
        time.sleep(8)
        
        response_text = driver.page_source
        soup = BeautifulSoup(response_text, "html.parser")
        return soup

    except Exception as e:
        print(f"Error durante el raspado: {e}")
        return None
    finally:
        if driver:
            print("Cerrando el navegador de forma segura...")
            driver.quit()

# ---  EJECUCIÓN CON LA URL DE LISTADO GENERAL ---
tripadvisor_url_listado = "https://www.tripadvisor.com/Restaurants-g150813-zfp10955-Tulum_Yucatan_Peninsula.html"

soup_tripadvisor = scrape_restaurantes_info(tripadvisor_url_listado)

if soup_tripadvisor:
    print("\n ¡HTML obtenido con éxito!")
    page_title_tag = soup_tripadvisor.find("title")
    if page_title_tag:
        print(f" Título Real Obtenido: {page_title_tag.get_text(strip=True)}")
    else:
        print("No se encontró la etiqueta <title>.")
else:
    print("Falla al raspar la página.")

print("-" * 50)
1 respuesta

Hola Christian, espero que estés bien

¡Espero que estés bien! Veo que estás trabajando en un script para hacer web scraping de información de restaurantes en TripAdvisor utilizando Selenium y BeautifulSoup. Aquí hay algunas sugerencias que podrían ayudarte a mejorar o solucionar problemas en tu script:

  1. Modo Headless: Has comentado la opción --headless para evitar problemas con Cloudflare. Esto es útil, pero ten en cuenta que ejecutar el navegador en modo visible puede consumir más recursos de tu sistema. Si decides volver a usar el modo headless, asegúrate de que tu script maneje adecuadamente los posibles bloqueos de Cloudflare.

  2. Tiempo de Espera: Estás usando time.sleep(8) para esperar que la página cargue completamente. Esto puede ser ineficiente si la página carga más rápido o si tarda más de lo esperado. Considera usar WebDriverWait de Selenium para esperar de manera más dinámica a que ciertos elementos estén presentes en la página antes de continuar.

    Ejemplo:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "selector_del_elemento"))
    )
    
  3. Manejo de Errores: Estás manejando excepciones generales con except Exception as e. Podrías considerar manejar excepciones más específicas para obtener un diagnóstico más claro de los errores que puedan ocurrir.

  4. Extracción de Datos: Asegúrate de que los selectores CSS que estás utilizando para extraer información (como el nombre del restaurante, calificación, etc.) sean correctos y estén actualizados. Las páginas web pueden cambiar su estructura, lo que puede requerir ajustes en tu código.

  5. Cerrar el Navegador: Siempre es una buena práctica asegurarse de que el navegador se cierra correctamente utilizando driver.quit() en un bloque finally, como ya lo estás haciendo.

Espero que estas sugerencias te sean útiles. ¡Bons estudios y suerte con tu proyecto de scraping!