Comment récupérer les données de Booking.com en utilisant Python

Commentaires: 0

Dans cet article, nous allons montrer comment collecter des données à partir du site Booking.com avec Python. Nous obtiendrons des informations incluant, mais sans s'y limiter, les noms des hôtels, les notes, les prix, les adresses et leurs descriptions. Le code fourni vous permet de récupérer des données à partir des pages des hôtels en analysant le contenu HTML et en extrayant les données JSON intégrées.

Installation des bibliothèques requises

Avant d'exécuter le code pour récupérer les données de Booking.com, vous devez installer les bibliothèques Python nécessaires. Voici comment installer les dépendances nécessaires :

  1. Requests Bibliothèque : Elle est utilisée pour envoyer des requêtes HTTP au site web et récupérer le contenu HTML des pages.
  2. LXML Bibliothèque : Elle est utilisée pour analyser le contenu HTML et extraire les données à l'aide de XPath.
  3. JSON: Module Python intégré utilisé pour traiter les données JSON.
  4. CSV: Module Python intégré utilisé pour écrire les données récupérées dans un fichier CSV.

Pour installer les bibliothèques nécessaires, vous pouvez utiliser pip :


pip install requests lxml

Ce sont les seules bibliothèques externes dont vous avez besoin, et les autres (json, csv) sont préinstallées avec Python.

Comprendre l'URL et la structure des données

Lorsque vous récupérez des données sur Booking.com, il est important de comprendre la structure de la page Web et le type de données que vous souhaitez extraire. Chaque page d'hôtel sur Booking.com contient des données structurées intégrées sous la forme de JSON-LD, un format qui permet d'extraire facilement des détails tels que le nom, l'emplacement et le prix. Nous allons extraire ces données.

Processus de raclage étape par étape

Booking.com étant un site dynamique et mettant en œuvre des mesures pour lutter contre les actions automatisées, nous utiliserons des en-têtes HTTP et des proxies appropriés pour garantir un scraping transparent sans risque de blocage.

Envoi de requêtes HTTP avec des en-têtes

Les en-têtes imitent une session utilisateur dans un navigateur et empêchent la détection par les systèmes anti-scraping de Booking.com. Si les en-têtes ne sont pas correctement configurés, le serveur peut facilement identifier les scripts automatisés, ce qui peut conduire à un blocage IP ou à des problèmes de captcha.

Pour éviter d'être bloqués par les mécanismes anti-scraping de Booking.com, nous utiliserons des en-têtes personnalisés pour simuler un utilisateur légitime naviguant sur le site web. Voici comment envoyer une requête HTTP avec les bons en-têtes :


import requests
from lxml.html import fromstring

urls_list = ["https links"]

for url in urls_list:
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'accept-language': 'en-IN,en;q=0.9',
        'cache-control': 'no-cache',
        'dnt': '1',
        'pragma': 'no-cache',
        'priority': 'u=0, i',
        'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Linux"',
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-site': 'none',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    }

    response = requests.get(url, headers=headers)

Importance de proxys

L'utilisation de proxys est nécessaire lorsque l'on scrappe des sites comme Booking.com, qui appliquent des limites strictes en matière de taux de requêtes ou qui tracent les adresses IP. Les proxys permettent de répartir la charge des demandes sur différentes adresses IP, évitant ainsi les blocages. À cette fin, il est possible d'utiliser à la fois des proxys gratuits et des services de proxy payants avec authentification par nom d'utilisateur et mot de passe ou par adresse IP. Dans notre exemple, nous utilisons cette dernière option.


proxies = {
    'http': '',
    'https': ''
}
response = requests.get(url, headers=headers, proxies=proxies)

Analyse du code HTML et extraction des données JSON

Après avoir envoyé la demande, nous analysons le contenu HTML à l'aide de lxml pour localiser les données JSON-LD intégrées qui contiennent les détails de l'hôtel. Cette étape permet d'extraire les données structurées de la page web qui comprennent les noms des hôtels, les prix, les emplacements, etc.


parser = fromstring(response.text)

# Extraire des données JSON intégrées
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])

Extraction d'informations sur les hôtels

Une fois les données JSON analysées, nous pouvons extraire les champs pertinents tels que le nom de l'hôtel, l'adresse, la note et le prix. Vous trouverez ci-dessous le code permettant d'extraire les informations relatives à l'hôtel à partir des données JSON :


name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")

# Ajouter les données à la liste all_data
all_data.append({
    "Name": name,
    "Location": location,
    "Price Range": priceRange,
    "Rating": ratingValue,
    "Review Count": reviewCount,
    "Type": type_,
    "Postal Code": postalCode,
    "Address Locality": addressLocality,
    "Country": addressCountry,
    "Region": addressRegion,
    "Street Address": streetAddress,
    "URL": url,
    "Image URL": image_url,
    "Room Types": room_types
})

Enregistrement des données au format CSV

Une fois les données extraites, nous pouvons les enregistrer dans un fichier CSV en vue d'une analyse ultérieure :


# Une fois tous les URL traités, écrivez les données dans un fichier CSV.
with open('booking_data.csv', 'w', newline='') as csvfile:
    fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code", 
                  "Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
    
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    # Rédiger l'en-tête
    writer.writeheader()
    
    # Écrire les lignes de données
    writer.writerows(all_data)

Code complet

Voici le code complet combinant toutes les sections :


import requests
from lxml.html import fromstring
import json
import csv

# Liste des URL d'hôtels à récupérer
urls_list = [
    "Https link", 
    "Https link"
]

# Initialiser une liste vide qui contiendra toutes les données extraites.
all_data = []

proxies = {
    'http': ''
}

# Boucle sur chaque URL pour récupérer les données
for url in urls_list:
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'accept-language': 'en-IN,en;q=0.9',
        'cache-control': 'no-cache',
        'dnt': '1',
        'pragma': 'no-cache',
        'priority': 'u=0, i',
        'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Linux"',
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-site': 'none',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    }

    # Envoi de la demande au site web
    response = requests.get(url, headers=headers, proxies=proxies)
    
    # Analyse du contenu HTML
    parser = fromstring(response.text)
    
    # Extraire des données JSON intégrées
    embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
    json_data = json.loads(embeded_jsons[0])

    # Extraire tous les détails de l'hôtel à partir de JSON
    name = json_data['name']
    location = json_data['hasMap']
    priceRange = json_data['priceRange']
    description = json_data['description']
    url = json_data['url']
    ratingValue = json_data['aggregateRating']['ratingValue']
    reviewCount = json_data['aggregateRating']['reviewCount']
    type_ = json_data['@type']
    postalCode = json_data['address']['postalCode']
    addressLocality = json_data['address']['addressLocality']
    addressCountry = json_data['address']['addressCountry']
    addressRegion = json_data['address']['addressRegion']
    streetAddress = json_data['address']['streetAddress']
    image_url = json_data['image']

    room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
    
    # Ajouter les données à la liste all_data
    all_data.append({
        "Name": name,
        "Location": location,
        "Price Range": priceRange,
        "Rating": ratingValue,
        "Review Count": reviewCount,
        "Type": type_,
        "Postal Code": postalCode,
        "Address Locality": addressLocality,
        "Country": addressCountry,
        "Region": addressRegion,
        "Street Address": streetAddress,
        "URL": url,
        "Image URL": image_url,
        "Room Types": room_types
    })

# Une fois tous les URL traités, écrivez les données dans un fichier CSV.
with open('booking_data.csv', 'w', newline='') as csvfile:
    fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code", 
                  "Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
    
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    # Rédiger l'en-tête
    writer.writeheader()
    
    # Écrire les lignes de données
    writer.writerows(all_data)

print("Data successfully saved to booking_data.csv")

Cet article a montré comment récupérer les données d'un hôtel sur Booking.com en utilisant Python. Nous avons souligné l'importance d'utiliser des en-têtes HTTP et des proxies appropriés pour contourner les mesures anti-scraping. Les données extraites peuvent être sauvegardées dans un fichier CSV pour une analyse ultérieure. Lors du scraping de sites web, vérifiez toujours les conditions de service afin d'éviter toute violation.

Commentaires:

0 Commentaires