Initiation au Web Scraping

chantier

Introduction

Le web scraping consiste à collecter automatiquement les données présentent sur les sites web.

Les objectifs visés sont variés :

  • Une entreprise de commerce électronique peut, par exemple, utiliser le web scraping pour comparer les prix pratiqués chez la concurrence, collecter les avis de clients ou la description de produits pour affiner sa stratégie commerciale

  • une plateforme peut faire appel au web scraping pour faire profiter ses clients des “bons plans” du moment sur le web, des nouvelles tendances, de l’évolution du prix d’articles sur plusieurs périodes …​

  • une entreprise de cybersécurité peut utiliser le web scraping pour surveiller les menaces sur le web

  • …​

Cadre législatif

Le web scrapping n’est techniquement pas illicite. Cependant, la façon dont sont collectées ou utilisées les données peuvent enfreindre certaines lois. Il convient donc de bien se renseigner sur ce qu’il est possible de faire ou de ne pas faire.

Parmi les activités de web scraping susceptibles d’enfreindre des lois ou des règlements, on peut citer :

  • Le téléchargement de données si les conditions générales d’utilisation du site (→ CGU) interdisent spécifiquement la collecte automatisée de données.

  • La collecte de données personnelles ou des informations sensibles sans consentement.

  • Le scraping de contenu protégé par des droits d’auteur ou propriétaire sans consentement explicite.

  • Le scraping des données à partir de zones restreintes ou privées d’un site web.

  • La revente ou distribution des données récupérées.

  • La collecte de données à des fins discriminatoires, contraires à l’éthique, ou malveillantes (spam, phishing)

  • Le scraping non autorisé de sites web ou de bases de données gouvernementales.

(Source : Tester, P. (s.d.). Le web scraping est-il illégal ? DataDome. https://datadome.co/fr/guides-fr/scraping-fr/le-web-scraping-est-il-illegal/)

Parades au web scraping

Pour se prémunir du web scraping différentes techniques existent :

  • Authentification systématique pour accéder au site

  • CAPTCHA

  • Limitation du trafic pour empêcher les requêtes trop rapprochées dans le temps

  • Génération dynamique du contenu via Javascript par exemple

  • Inderdiction explicite dans les CGU (Conditions Générale d’Utilisation) du site

  • …​

Il existe également une sorte de standard qui permet — non pas d’interdire le web scraping — mais d’indiquer ce qu’il est possible de scraper ou pas.

Ce standard repose sur la mise en place d’un fichier robots.txt à la racine du site.
Les scrapers sont alors tenus, mais pas obligés, de suivre les règles contenues dans ce fichier.

Exemple de fichier robots.txt
# Interdit l'accès à Yandex et DuckDuckGo
User-agent: Yandex
Disallow: /
User-agent: DuckDuckGo
Disallow: /
# Autorise tous les autres robots d'indexation à parcourir l'intégralité du site ...
User-agent: *
Allow: /
# ...sauf aux répertoires /private/ et /assets/
Disallow: /private/
Disallow: /assets/

✎ Travail n° 1

🎯 Travail à faire :

  1. Reproduire le fichier robots.txt du site Root Me dans le compte rendu et l’analyser

  2. Expliquer chacune de ses lignes en s’aidant d’internet

Requêtes HTTP avec Python

Pour pouvoir extraire les données de sites Web, il va falloir se rendre dessus grâce à son URL (→ Uniform Resource Locator).

url structure

Python dispose à cet usage du module urllib.request pour ouvrir et lire des URLs.

Cependant, le module tierce requests est souvent considéré comme plus facile à prendre en main ⇒ c’est donc celui que vous utiliserez dans cette partie de l’activité.

💻 Travail n° 2 Récupérer une page web avec requests

🎯 Travail à faire :

  1. Créer et activer un nouvel environnement virtuel Python.

    • Dans un environnement Anaconda/Conda sous Windows :

      • Lancer une console Anaconda (→ saisir Anaconda Prompt ou Anaconda Powershell Prompt dans le menu “Démarrer”)

      • …​puis saisir les commandes :

        conda create -n web-scraping python
        conda activate web-scraping
    • Sous Linux

      python3 -m venv web-scraping
      source ./web-scraping/bin/activate
  2. Installer le module requests dans le nouvel environnement virtuel créé à l’étape précédente :

    • Sous Windows/Anaconda :

      conda install requests
    • Sous Linux :

      pip install requests
  3. Saisir et exécuter le script suivant :

    import requests
    
    # Exécuter une requête HTTP GET sur le site https://httpbin.org
    # ...et stocker le code de statut de réponse HTTP dans `response`
    response = requests.get("https://httpbin.org"
    
    # SI statut == OK ALORS
    if response.status_code == 200:
        # Afficher le statut et le contenu de la page web retournés
        print(f"ℹ️ statut : {response.status_code}\n📖HTML :\n{response.text}")
    # SINON
    else:
        # Afficher le code d'erreur
        print(f"Erreur lors de la requête : {response.status_code}")

Vous êtes maintenant capable de récupérer le contenu HTML d’une page web. Ne reste plus qu’à en extraire les parties intéressantes.

Analyse du contenu avec BeautifulSoup

Le module Python BeautifulSoup va considérablement faciliter l’extraction du contenu d’une page web.

Ce module permet effectivement non seulement d’analyser le contenu d’une page web pour reconstruire sa structure qu’on appelle le DOM (Document Object Model) mais aussi d’en extraire certaines parties à l’aide de sélecteurs.

le DOM est une structure de données arborescente qui est élaborée dans la mémoire du navigateur web lorsqu’il charge une page HTML. Toute modification de ce DOM via du code Javascript par exemple est alors immédiatement reflété à l’écran par le navigateur.

Exemple : changer l’attribut src d’un nœud correspondant à une balise <img> dans le HTML pour le faire pointer sur un autre fichier image affichera cette nouvelle image.

dom

💻 Travail n° 3 Prise en main de BeautifulSoup

🎯 Travail à faire :

  1. Toujours dans le même environnement virtuel Python créé pour l’activité, installer le module BeautifulSoup

    • Sous Windows/Anaconda :

      conda install beautifulsoup4 (1)
      1 ⚠️Ne pas oublier le ‘4’ à la fin du nom de module
    • Sous Linux :

      pip install beautifulsoup4
      1 ⚠️Ne pas oublier le ‘4’ à la fin du nom de module
  2. Prendre connaissance du document Analyser le contenu d’une page web avec BeautifulSoup link

  3. À partir de ce vous avez appris, coder un script qui :

    1. Affiche “proprement” le contenu HTML de la Page d’accueil de ce site link avec la méthode prettify de BeautifulSoup

    2. Affiche d’abord l’intégralité de la balise responsable de l’affichage de la 1ère image de la page web puis uniquement son type et fianlement le contenu de son attribut src.

      Exemple de résultat attendu :
      Balise: <img alt="Logo LAB" class="navbar-image hide-for-print" src="../static/img/logo-lab-round.png"/>
      Type : img
      Attribut `src` : ../static/img/logo-lab-round.png
    3. Affiche tous les liens externes présents sur la page

      La lecture du paragraphe The keyword arguments link dans la documentation de BeautifulSoup peut s’avérer utile pour n’afficher que les liens externes.

      Exemple de résultat attendu :
      Lien : https://www.atrium-sud.fr/web/lpo-lyc-metier-alphonse-benoit-848031/accueil | Texte : lycée Alphonse Benoit de l’Isle-sur-la-Sorgue (84800)
      Lien : https://antora.org/ | Texte : Antora

🞄  🞄  🞄