Guide pour l'extraction de données de Google Flights avec Python

Commentaires: 0

Lorsqu'il s'agit de planifier des voyages, d'analyser la concurrence ou d'effectuer des recherches, l'extraction d'informations sur les vols à partir de Google Flights peut fournir des informations importantes. Voici un tutoriel étape par étape sur la façon de récupérer des informations sur les vols en utilisant les bibliothèques Python, Playwright et lxml.

Mise en place de votre environnement

Avant de plonger dans le processus de scraping, assurez-vous d'avoir installé les bibliothèques Python nécessaires :

pip install playwright
Pip install lxml

Pour utiliser Playwright, vous devez également installer les binaires du navigateur :

playwright install chromium

Processus de scraping étape par étape

Nous allons nous concentrer sur l'extraction des données relatives aux vols à partir de la page de résultats de recherche Google Flights.

Étape 1. Comprendre la structure du site web

Pour extraire efficacement des données de Google Flights, vous devez vous familiariser avec la structure HTML du site web. Voici comment vous pouvez utiliser Chrome DevTools pour inspecter les éléments et récupérer les expressions XPath nécessaires au scraping :

  1. Ouvrez Chrome DevTools en faisant un clic droit sur la page Google Flights et en sélectionnant "Inspecter", ou utilisez le raccourci Ctrl+Shift+I (Windows/Linux) ou Cmd+Option+I (Mac).
  2. Inspectez les éléments en survolant différentes parties de la page. Cela mettra en évidence la structure HTML dans les DevTools. Cliquez sur les éléments spécifiques pour afficher leurs attributs, qui sont essentiels pour créer des expressions XPath précises.
  3. Récupérez les expressions XPath en cliquant avec le bouton droit de la souris sur l'élément souhaité dans le panneau Éléments, en sélectionnant "Copier", puis en choisissant "Copier XPath". Cette opération permet de copier l'expression XPath directement dans le presse-papiers, prête à être utilisée dans votre script de scraping.

Liste des expressions XPath utilisées :

From Location: //input[@aria-label="Where from?"]/@value
To Location: //input[@aria-label="Where to?"]/@value
Departure Date: //input[@placeholder="Departure"]/@value
Return Date: //input[@placeholder="Return"]/@value

Note : Ce XPath renvoie plusieurs éléments, chacun correspondant à un vol individuel.

Flight Elements: //li[@class="pIav2d"]
Airway: .//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()
Details: .//span[@class="mv1WYe"]/@aria-label
Departure Time: .//span[@aria-describedby="gEvJbfc1583"]/span/text()
Arrival Time: .//span[@aria-describedby="gEvJbfc1584"]/span/text()
Travel Time: .//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()
Price: .//div[@class="YMlIz FpEdX"]/span/text()

Étape 2. Envoi de requêtes HTTP et extraction du contenu de la page avec Playwright

Nous utilisons Playwright pour interagir avec la page web et en extraire le contenu. Cette approche permet de gérer le contenu dynamique que JavaScript pourrait charger.

L'utilisation de Playwright permet de gérer le contenu dynamique chargé par JavaScript. Il lance un navigateur sans tête, navigue jusqu'à l'URL et extrait le contenu de la page.

from playwright.sync_api import sync_playwright

# URL de la page de recherche Google Flights
url = "https link"

def get_page_content(url):
    """Récupère le contenu HTML de l'URL donnée à l'aide de Playwright."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)  # Lancer le navigateur en mode sans tête
        context = browser.new_context()  # Créer un nouveau contexte de navigation
        page = context.new_page()  # Ouvrir une nouvelle page
        page.goto(url)  # Naviguer vers l'URL spécifié
        content = page.content()  # Obtenir le contenu de la page
        browser.close()  # Fermer le navigateur
    return content

# Récupérer le contenu de la page
page_content = get_page_content(url)

Étape 3. Extraction de détails communs à l'aide de XPath

Ensuite, nous analysons le contenu HTML de la réponse à l'aide de lxml pour extraire les détails communs du vol, tels que les dates de départ et de retour.

from lxml import html

# Création de l'analyseur syntaxique
tree = html.fromstring(page_content)

# Extraire les détails d'un vol à l'aide de XPath
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]  # Obtenir l'emplacement "de".
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]  # Obtenir le lieu de destination
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]  # Obtenir la date de départ
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]  # Obtenir la date de retour

Etape 4. Extraction de données de vol spécifiques à l'aide de lxml

Nous analysons ensuite le contenu HTML pour extraire des informations spécifiques sur les vols en fonction des expressions XPath identifiées.

# Initialisation d'une liste vide pour stocker les détails du vol
flights = []

# Extraire les éléments de vol du code HTML analysé à l'aide de XPath
flight_elements = tree.xpath('//li[@class="pIav2d"]')

# Passer en revue chaque élément de vol et en extraire les détails
for flight in flight_elements:
    # Extraire le nom de la compagnie aérienne
    airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
    
    # Extraire les détails du vol tels que les escales
    details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
    
    # Extraire l'heure de départ
    departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
    
    # Extraire l'heure d'arrivée
    arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
    
    # Extraire le temps de trajet total
    travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
    
    # Extraire le prix du vol
    price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()

    # Ajouter les détails extraits à la liste des vols sous forme de dictionnaire
    flights.append({
        'Airway': airway,
        'Details': details,
        'Departure': departure,
        'Arrival': arrival,
        'Travel Time': travel_time,
        'Price': price,
        'From': from_location,
        'To': to_location,
        'Departure Date': departure_date,
        'Return Date': return_date
    })

Etape 5. Enregistrement des données au format CSV

Enfin, nous utilisons le module CSV intégré à Python pour enregistrer les données extraites dans un fichier CSV en vue d'une analyse ultérieure.

import csv

# Définir le chemin d'accès au fichier CSV
csv_file = 'google_flights.csv'

# Définir les noms des champs CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# Ecriture de données dans un fichier CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    for flight in flights:
        writer.writerow(flight)

print(f"Data saved to {csv_file}")

Mise en place de l'ensemble

from playwright.sync_api import sync_playwright
from lxml import html
import csv

# URL de la page de recherche Google Flights
url = "https link"

def get_page_content(url):
    """Récupère le contenu HTML de l'URL donnée à l'aide de Playwright."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # Lancer le navigateur en mode plein écran
        context = browser.new_context()  # Créer un nouveau contexte de navigation
        page = context.new_page()  # Ouvrir une nouvelle page
        page.goto(url)  # Naviguer vers l'URL spécifié
        page.wait_for_timeout(10000)  # Attendez 10 secondes pour vous assurer que la page se charge complètement.
        content = page.content()  # Obtenir le contenu de la page
        browser.close()  # Fermer le navigateur
    return content

# Récupérer le contenu de la page
page_content = get_page_content(url)

# Analyse du contenu HTML à l'aide de lxml
tree = html.fromstring(page_content)

# Extraction des détails de la recherche de vols
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]

# Initialiser une liste pour stocker les détails du vol
flights = []

# Extraire les éléments de vol du code HTML analysé
flight_elements = tree.xpath('//li[@class="pIav2d"]')
for flight in flight_elements:
    airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
    details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
    departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
    arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
    travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
    price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()

    # Ajouter les détails du vol à la liste
    flights.append({
        'Airway': airway,
        'Details': details,
        'Departure': departure,
        'Arrival': arrival,
        'Travel Time': travel_time,
        'Price': price,
        'From': from_location,
        'To': to_location,
        'Departure Date': departure_date,
        'Return Date': return_date
    })

# Définir le chemin d'accès au fichier CSV
csv_file = 'google_flights.csv'

# Définir les noms des champs CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# Enregistrement des informations extraites sur les vols dans un fichier CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()  # Écrire la ligne d'en-tête
    for flight in flights:
        writer.writerow(flight)  # Inscrivez les détails de chaque vol

print(f"Data saved to {csv_file}")

Pour réduire le risque de détection lors du scraping de données, il est conseillé d'introduire des délais entre les requêtes et d'utiliser des proxys. La mise en œuvre de délais permet d'imiter l'interaction humaine, ce qui rend plus difficile la détection par les sites web des activités de scraping automatisées. En ce qui concerne la sélection des proxys, il est recommandé d'utiliser des proxys dynamiques résidentiels, car ils offrent un niveau de confiance élevé et sont moins susceptibles d'être bloqués en raison de leur nature dynamique. Vous pouvez également utiliser un groupe de serveurs mandataires statiques de fournisseurs d'accès à Internet, qui assurent une connexion stable et rapide, améliorant ainsi la fiabilité de votre processus d'extraction de données. Ces stratégies permettent d'échapper aux mesures de protection que les sites web utilisent pour identifier et bloquer les robots d'extraction.

Commentaires:

0 Commentaires