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
- assimiler public à librement réutilisable
- ignorer les conditions et licences
- contourner une protection technique
- collecter des profils sans nécessité
- utiliser un user-agent anonyme
- ne pas prévoir de suppression
- publier le dataset sans provenance
Checklist
- [ ] Finalité et champs définis
- [ ] Sources autorisées documentées
- [ ] robots.txt et CGU examinés
- [ ] Débit et concurrence bornés
- [ ] User-agent identifiable
- [ ] PII et secrets contrôlés
- [ ] Provenance stockée
- [ ] Procédure de retrait testée
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.