Guide

Statut éditorial : En attente de relecture

Web scraping éthique pour construire un dataset

Collecter des données web de manière ciblée, traçable et respectueuse des personnes, des sites, des licences et des contraintes techniques.

Classification du contenu

Types

  • Données et Machine Learning
Niveau
Avancé
Publié le
24 août 2026
Dernière relecture
Relecture en attente
Prochaine vérification
24 octobre 2026

Pourquoi ce sujet est important

Une page accessible publiquement n’est pas automatiquement libre à collecter, republier ou utiliser pour entraîner un modèle. Un scraping responsable commence par la finalité, les droits et la minimisation avant d’écrire le crawler.

Définir la finalité et le périmètre

Écrivez ce que le dataset doit permettre, les champs nécessaires, les domaines autorisés, la période et la durée de conservation. Excluez par défaut espaces authentifiés, données sensibles et contenus sans utilité directe. Une collecte “au cas où” augmente risque et coût.

Vérifier les droits et règles

Examinez conditions d’utilisation, licences, droit d’auteur, droit des bases et données personnelles avec les personnes compétentes. robots.txt exprime des règles techniques de crawl mais ne constitue ni une licence ni une autorisation juridique complète. Privilégiez API, export ou accord explicite lorsqu’ils existent.

Concevoir un crawler poli

Identifiez le user-agent et fournissez un contact. Limitez concurrence et débit, respectez Retry-After, mettez en cache et évitez de revisiter inutilement. Planifiez hors pointe lorsque possible. Arrêtez le crawl en cas de hausse d’erreurs ou de charge anormale. Ne contournez pas authentification, CAPTCHA ou protection.

Minimiser les données

Collectez uniquement les champs nécessaires. Évitez profils individuels et commentaires lorsque la finalité ne les exige pas. Détectez PII et secrets avant stockage durable. Séparez URL, contenu et informations permettant une suppression ultérieure.

Conserver la provenance

Pour chaque élément, stockez URL canonique, date, titre, licence ou signal identifié, hash, version du parseur et transformations. La provenance permet de corriger, attribuer, retirer et reconstruire. Gardez aussi le motif des exclusions.

Prévoir opposition et suppression

Publiez un contact ou une procédure lorsque cela s’applique. Une URL ou un document retiré doit pouvoir être localisé dans brut, dérivés, index et jeux publiés. Les modèles entraînés posent des difficultés supplémentaires : évaluez ces impacts avant la collecte.

Valider le dataset

Mesurez couverture, duplications, langues, distributions et erreurs d’extraction. Inspectez des exemples de chaque domaine. Vérifiez que le crawler n’a pas traversé des liens vers un périmètre interdit.

Exemple concret

Une équipe veut un dataset de documentations techniques françaises. Elle établit une liste blanche de domaines et licences, lit robots.txt, limite le débit, conserve URL et hash, n’extrait aucun compte utilisateur et fournit une adresse de contact. Chaque nouvelle source passe par une validation avant ajout.

Les erreurs fréquentes

Checklist

FAQ

robots.txt donne-t-il une autorisation ?

Non. Il donne des règles de crawl ; les droits de réutilisation et le RGPD sont des questions distinctes.

Peut-on scraper avec l’intérêt légitime ?

Parfois, après analyse de nécessité, mise en balance et garanties. Ce n’est pas une permission générale.

Combien de requêtes par seconde ?

Il n’existe pas de valeur universelle. Adaptez-vous au site, à ses indications et à son comportement.

Peut-on entraîner sur tout contenu collecté ?

Non. Collecte, conservation, droits d’auteur, données personnelles et entraînement doivent être analysés séparément.

Collecteur poli avec limites

~~~python import time import requests from urllib.robotparser import RobotFileParser

BASE = "https://example.org" robots = RobotFileParser(f"{BASE}/robots.txt") robots.read()

url = f"{BASE}/documentation/page" if not robots.can_fetch("DatasetResearchBot/1.0", url): raise PermissionError("robots.txt interdit cette collecte")

response = requests.get( url, headers={"User-Agent": "DatasetResearchBot/1.0 contact@example.org"}, timeout=10, ) response.raise_for_status() time.sleep(2) ~~~

Robots.txt n’est pas une autorisation juridique. Vérifiez conditions d’utilisation, droit d’auteur, base légale, données personnelles et licences. Préférez API ou export officiel. Conservez URL, date, licence et hash du document ; implémentez déduplication, reprise et suppression sur demande. Ne contournez jamais authentification, CAPTCHA ou limite technique.

Sources utilisées