Scraping de un sitio web dinámico usando Python y Selenium.

Dec 17 2022
Introducción Hace un tiempo me dieron una tarea en la que necesitaba recopilar datos de un sitio web español para reservas de hoteles. Tenemos algunas opciones cuando nos encontramos con este tipo de tareas, Beautiful Soup, Scrapy y Selenium.

Introducción

Hace un tiempo me dieron una tarea en la que necesitaba recopilar datos de un sitio web español para reservas de hoteles. Tenemos algunas opciones cuando nos encontramos con este tipo de tareas, Beautiful Soup, Scrapy y Selenium. Beautiful Soup no funciona bien con sitios web dinámicos, y no prefiero la forma en que funciona el script scrapy. A diferencia de scrapy y otros métodos en los que comienza a colocar enlaces de inmediato, en Selenium primero debe obtener un controlador web para el navegador que desea usar para la tarea.

Configuración del sistema para el proyecto.

El paso más importante antes de iniciar cualquier proyecto es tener su sistema preparado para el proyecto. Estos son los pasos a seguir para la configuración del proyecto:

  1. Python: puede descargar Python desde aquí . También asegúrese de agregar python a la ruta al instalarlo.
  2. Cree un entorno virtual en el directorio de su proyecto. Puedes crear un entorno virtual usandopython -m venv [name you want to give to your environment].
  3. Activa tu entorno virtual. Supongo que ya está en el directorio del proyecto y [environment name]\Scripts\activateactivará su entorno virtual.
  4. Ahora, en este entorno, instalará Selenium. pip install selenium==<required version>instalará su versión requerida de selenium. He usado la versión 3 para el proyecto.
  5. Obtenga un controlador de Chrome según la versión de Chrome que esté utilizando. Puede obtener su controlador desde aquí .
Estructura del directorio del proyecto.

Los datos extraídos van dentro del directorio "Datos" y el controlador que descargamos va dentro del directorio "controlador".

Ahora, dentro del directorio principal, creará un archivo python donde escribirá el script para extraer los datos del sitio web.

Comenzaremos importando las bibliotecas necesarias:

Importación de bibliotecas necesarias.

Para iniciar el script, primero crearemos un objeto controlador usando selenium.webdriverde la siguiente manera:

driver = webdriver.Chrome(executable_path ='data/chromedriver.exe')

El sitio del que queremos recopilar los datos es Rentalia y se puede encontrar en esta dirección “https://es.rentalia.com/”

haremos que el conductor acceda primero al sitio web usando el comandodriver.get('https://es.rentalia.com/')

Ahora, una vez que el controlador está en el sitio web, puede acceder a todos los elementos html presentes en la página web en la que se encuentra. Puede consultar este enlace para conocer las funciones que podemos usar para acceder a los elementos presentes en la página web-”https://iqss.github.io/dss-webscrape/finding-web-elements.html”.

Ya debería estar más familiarizado con la función de selección de elementos en Selenium webdriver y el siguiente paso es obtener las referencias de los elementos de los que desea obtener sus datos. Para eso, solo tiene que abrir las opciones de desarrollador en su navegador, simplemente puede presionar F12o hacer clic con el botón derecho en el elemento que desea seleccionar y encontrará la opción para inspeccionar al hacer clic en la que se lo dirigirá al código html. A partir de ese código, puede obtener el nombre de la clase, html, id o la ruta X, la ruta X se puede obtener en el menú que se muestra al hacer clic en el elemento html del código.

Así es como obtendría el X-path:

Comenzando con el proceso:

El primer y más importante punto es abrir el sitio web en el navegador con el que hará que su controlador web funcione y comience a observar los procesos.

Por ejemplo, hay un botón para aceptar cookies en el momento en que se carga la página. Solo podrá interactuar con el contenido del interior si ha hecho clic en ese botón.

Puede ver el bloque en la parte inferior que le pide que acepte los términos.

Ahora, una vez que haya terminado, deberá completar las entradas para obtener los resultados del área para la que necesita datos. La página de resultados tendría una lista de hoteles con información sobre las habitaciones como, precio por noche, ubicación, una breve descripción, etc. Una cosa que no está en esa página es el número de contacto que puede usar para preguntar sobre la habitación. Así que tendremos que ir a la página de detalles de cada habitación de hotel para obtener el número.

Página de listados con la información básica de las habitaciones.
Esto lo encontrará en la página de detalles.

He dividido la formación del guión en los siguientes pasos:

  • Accediendo al botón de aceptar las condiciones para acceder a la página web.
  • #clicking the accepting button 
    cookies_btn = driver.find_element('xpath', '//*[@id="didomi-host"]/div/div/div/div//div[2]/button[2]')
    cookies_btn.click()
    # we used xpath to access the element and once we get the object made for the element we can click simply by adding click() method.
    

    # inputing the locations from the given list 
    input_field.send_keys(loc)
    ActionChains(driver).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()
    # we replicated the interaction we make to input and submit the query in the input bar using action chains
    

    Extrayendo información.

Para obtener los datos de cada sitio, incluí un bucle dentro de una declaración de escritura para generar una tabla con solo encabezados con respecto a las variables que tenemos y luego, a medida que el bucle continúa, el código llenaría las filas con datos del marcador de posición que definimos y usamos para la extracción. Hubo algunas cosas más que agregué para que funcione bien y de manera eficiente en la recopilación de datos, puede encontrar el código terminado aquí . Por ejemplo, hice que el script tome las entradas del usuario como argumentos, obtendrá toda la información requerida en ese repositorio. Pero antes de obtener el código de allí, me gustaría que implementaras esto por tu cuenta.

Además, no existe una regla estándar para obtener los datos en un archivo csv, así que haz lo que creas que sería interesante.

¡Espero que esto haya sido útil!