Scraping de AirBnb : guide complet

Dans ce guide, nous allons voir comment réaliser le scraping de AirBnb pour récupérer le prix moyen des locations dans une ville.

Publié le par Thibault houdon (mis à jour le )
13 minutes

Les sites web comme AirBnb regorgent d'un nombre incalculable de données pouvant intéresser des particuliers ou des entreprises. Que ce soit pour comparer le prix moyen de location d'une ville ou trouver la destination de vos prochaines vacances, vous pourriez utiliser le web scraping pour récupérer ces informations.

Dans ce tutoriel complet, nous allons voir comment, à l'aide de Python, récupérer les données du site AirBnb grâce au scraping éthique.

Les prérequis

Dans ce tutoriel, nous allons utiliser la version 3.12 de Python. Vous devez avoir des connaissances de base avec le langage Python, notamment concernant les fonctions et les structures conditionnelles.

Vous devez également être à l'aise avec l'installation d'un environnement virtuel et de librairies tierces grâce à l'outil pip.

Préparation d'un scraping éthique

Avant de mettre les mains dans le code et commencer la collecte de données, il est important de s'assurer que nous serons en mesure d'effectuer un scraping dit "éthique". Passons en revue les différentes composantes d'un scraping éthique pour nous assurer de la faisabilité de notre projet :

Si vous avez une API publique qui fournit les données que je recherche, je l'utiliserai et éviterai complètement le scraping.

  • AirBnb possède une API mais son accès n'est pas publique et nécessite de demander une autorisation à la plateforme. Cette API ne concerne que les propriétaires de biens ou les sites tiers qui souhaitent utiliser AirBnb pour proposer des services supplémentaires avec la plateforme. Cette option n'est donc pas possible pour notre projet.

Je fournirai toujours une chaîne d'agent utilisateur qui rend mes intentions claires et offre un moyen de me contacter pour des questions ou des préoccupations.

  • Nous pourrons modifier lors de notre scraping le User-Agent pour indiquer clairement nos intentions et le moyen de nous contacter à la plateforme.

Je demanderai des données à un rythme raisonnable. Je m'efforcerai de ne jamais être confondu avec une attaque DDoS.

  • Nous allons mettre en place des mécanismes pour nous assurer de ne pas surcharger le site de trop de requêtes simultanées. Notamment, nous passerons par une collecte synchrone des données, plutôt que d'essayer d'aller plus vite avec une collecte asynchrone.

Je ne sauvegarderai que les données dont j'ai absolument besoin de votre page. Si tout ce dont j'ai besoin ce sont les métadonnées OpenGraph, c'est tout ce que je conserverai.

Je respecterai tout contenu que je conserve. Je ne le présenterai jamais comme le mien.

Je répondrai en temps opportun à votre prise de contact et travaillerai avec vous pour trouver une résolution.

Je ferai du scraping dans le but de créer une nouvelle valeur à partir des données, et non pour les dupliquer.

Création du projet

Pour commencer, nous allons créer un dossier pour le projet :

mkdir airbnb-scraper
cd airbnb-scraper

À noter

Nous utilisons ici le terminal mais vous pouvez très bien passer par votre gestionnaire de fichiers classique.

Nous allons ensuite installer les bibliothèques nécessaires au projet avec pip :

pip install beautifulsoup4
pip install requests
pip install playwright
playwright install

N'oubliez pas de lancer la commande playwright install. Cette commande va installer les exécutables des navigateurs nécessaires au scraping avec Playwright.

Tentative de scraping simple

Pour commencer, nous allons vérifier si nous pouvons utiliser des bibliothèques simples comme requests pour effectuer le scraping.

Nous allons donc faire une requête vers la page principale de AirBnb et vérifier si nous avons les informations qui nous intéressent :

import requests

url = "https://www.airbnb.fr/s/Rio-de-Janeiro--Rio-de-Janeiro--Br%C3%A9sil/homes?tab_id=home_tab&monthly_start_date=2024-01-01&monthly_length=3&price_filter_input_type=0&channel=EXPLORE&query=Rio%20de%20Janeiro,%20Br%C3%A9sil&date_picker_type=flexible_dates&flexible_trip_dates%5B%5D=january&flexible_trip_lengths%5B%5D=one_month&adults=1&source=structured_search_input_header&search_type=autocomplete_click&price_filter_num_nights=28&place_id=ChIJW6AIkVXemwARTtIvZ2xC3FA"

response = requests.get(url)
with open("airbnb.html", "w") as f:
    f.write(response.text)

Pour avoir un aperçu visuel de notre requête et inspecter plus facilement le HTML dans un navigateur, on sauvegarde le contenu de la réponse dans un fichier airbnb.html.

Si vous ouvrez ce fichier dans un navigateur, vous verrez que la page semble vide.

Des scripts dans le HTML vident en effet la page de son contenu, nous donnant l'impression que la récupération des données n'a pas fonctionné.

Cependant, si vous allez voir directement le fichier HTML, vous verrez que les données des propriétés sont bien affichées.

Vous pouvez chercher par exemple la chaîne de caractères "_tyxjp1" qui correspond à la classe de la balise span contenant le prix des locations.

Récupérer les données de prix

Pour récupérer les données du prix, on va utiliser la bibliothèque BeautifulSoup.

Afin d'éviter de faire une requête inutile, on va commencer par sauvegarder le code HTML de la page dans un fichier qu'on va utiliser pour nos tests.

On va créer une fonction pour récupérer les données de la page :

import requests

def fetch_content(url: str) -> str:
    """Fetch the content of the page"""
    response = requests.get(url)
    return response.text

Dans notre script, on va ensuite créer deux fonctions pour écrire et lire le fichier HTML.

On ajoute aussi un logger pour avoir un meilleur aperçu des opérations qui se déroulent.

import requests
from pathlib import Path
import logging

FILEPATH = Path(__file__).parent / "airbnb.html"
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)


def fetch_content(url: str) -> str:
    """Fetch the content of the page"""
    response = requests.get(url)
    return response.text


def _write_to_file(content: str) -> bool:
    """Write content to file"""
    logger.debug("Writing content to file")
    with open(FILEPATH, "w") as f:
        f.write(content)

    return FILEPATH.exists()


def _read_from_file() -> str:
    """Read content from file"""
    logger.debug("Reading content from file")

    with open(FILEPATH, "r") as f:
        return f.read()

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.