Scraper un site Web dynamique en utilisant Python et Selenium.

Dec 17 2022
Introduction Il y a quelque temps, on m'a confié une tâche dans laquelle j'avais besoin de collecter des données sur un site Web espagnol pour les réservations d'hôtels. Nous avons quelques options lorsque nous rencontrons ce genre de tâches, Belle soupe, Scrapy et sélénium.

Introduction

Il y a quelque temps, on m'a confié une tâche dans laquelle je devais collecter des données sur un site Web espagnol pour les réservations d'hôtels. Nous avons quelques options lorsque nous rencontrons ce genre de tâches, Belle soupe, Scrapy et sélénium. La belle soupe ne fonctionne pas bien avec les sites Web dynamiques, et je ne préfère pas la façon dont le script scrapy fonctionne. Contrairement à Scrapy et à d'autres méthodes où vous commencez à mettre des liens tout de suite, dans Selenium, vous devez d'abord obtenir un Webdriver pour le navigateur que vous souhaitez utiliser pour la tâche.

Mise en place du système pour le projet

L'étape la plus importante avant de lancer un projet est de préparer votre système pour le projet. Voici les étapes à suivre pour la configuration du projet :

  1. Python - Vous pouvez télécharger python à partir d' ici . Assurez-vous également d'ajouter python au chemin lors de son installation.
  2. Créez un environnement virtuel dans votre répertoire de projet. Vous pouvez créer un environnement virtuel en utilisantpython -m venv [name you want to give to your environment].
  3. Activez votre environnement virtuel. Je suppose que vous êtes maintenant dans le répertoire du projet et [environment name]\Scripts\activateque vous activerez votre environnement virtuel.
  4. Maintenant, dans cet environnement, vous allez installer Selenium. pip install selenium==<required version>installera votre version requise de sélénium. J'ai utilisé la version 3 pour le projet.
  5. Obtenez un pilote chrome en fonction de la version de chrome que vous utilisez. Vous pouvez obtenir votre chauffeur à partir d' ici .
Structure du répertoire du projet.

Les données extraites vont dans le répertoire "Data" et le pilote que nous avons téléchargé va dans le répertoire "driver".

Maintenant, dans le répertoire principal, vous allez créer un fichier python dans lequel vous écrirez le script pour extraire les données du site Web.

Nous allons commencer par importer les bibliothèques nécessaires :

Importation de bibliothèques nécessaire.

Pour lancer le script, nous allons d'abord créer un objet pilote en utilisant selenium.webdriverde la manière suivante :

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

Le site dont nous voulons collecter les données est Rentalia et il peut être trouvé à cette adresse "https://es.rentalia.com/”

nous allons faire en sorte que le pilote accède d'abord au site Web à l'aide de la commandedriver.get('https://es.rentalia.com/')

Désormais, une fois que le pilote est sur le site Web, il peut accéder à tous les éléments html présents sur la page Web sur laquelle il se trouve. Vous pouvez consulter ce lien pour connaître les fonctions que nous pouvons utiliser pour accéder aux éléments présents présents sur la page Web- »https://iqss.github.io/dss-webscrape/finding-web-elements.html”.

Vous devriez être familiarisé avec la fonction de sélection d'éléments dans Selenium WebDriver maintenant et la prochaine étape consiste à obtenir les références des éléments à partir desquels vous souhaitez obtenir vos données. Pour cela, il vous suffit d'ouvrir les options de développement dans votre navigateur, vous pouvez simplement appuyer F12ou cliquer avec le bouton droit sur l'élément que vous souhaitez sélectionner et vous trouverez une option à inspecter en cliquant sur laquelle vous serez dirigé vers le code html correspondant. À partir de ce code, vous pouvez obtenir le nom de la classe, html, id ou le X-path, X-path peut être obtenu dans le menu qui s'affiche en cliquant sur l'élément code html.

Voici comment vous obtiendriez le X-path :

A commencer par le processus :

Le premier et le plus important point est d'ouvrir le site Web sur le navigateur avec lequel vous allez faire fonctionner votre pilote Web et commencer à observer les processus.

Par exemple, il y a un bouton pour accepter les cookies au moment où la page se charge. Vous ne pourrez interagir avec le contenu à l'intérieur que si vous avez cliqué sur ce bouton.

Vous pouvez voir le bloc en bas vous demandant d'accepter les conditions.

Maintenant, une fois que vous avez terminé, vous devrez remplir les entrées pour obtenir les résultats pour la zone pour laquelle vous avez besoin de données. La page de résultats contiendrait une liste d'hôtels avec des informations sur les chambres telles que le prix par nuit, l'emplacement, une brève description, etc. Une chose qui n'est pas là sur cette page est le numéro de contact que vous pouvez utiliser pour vous renseigner sur la chambre. Nous devrons donc nous rendre sur la page de détails de chaque chambre d'hôtel pour obtenir le numéro.

Page d'annonces avec les informations de base sur les chambres.
Vous le trouverez sur la page de détails.

J'ai divisé la formation du script en étapes suivantes :

  • Accéder au bouton pour accepter les termes pour accéder à la page 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
    

    Extraction d'informations.

Pour obtenir les données de chaque site, j'ai inclus une boucle dans une instruction d'écriture pour générer une table avec uniquement des en-têtes par rapport aux variables que nous avons, puis, à mesure que la boucle continue, le code remplirait les lignes avec les données de l'espace réservé que nous avons défini et utilisé pour l'extraction. Il y avait quelques autres choses que j'ai ajoutées pour que cela fonctionne bien et efficacement dans la collecte de données, vous pouvez trouver le code fini ici . Par exemple, j'ai créé le script pour prendre les entrées de l'utilisateur en tant qu'arguments, vous obtiendrez toutes les informations requises dans ce référentiel. Mais avant d'obtenir du code à partir de là, j'aimerais que vous l'implémentiez vous-même.

De plus, il n'y a pas de règle standard pour obtenir les données dans un fichier csv, alors faites ce qui vous semble intéressant.

J'espère que cela a été utile !