Les marques veulent savoir ce que l’on dit d’elles, de leurs produits et de leurs concurrents, et une grande partie de cette conversation se déroule publiquement : forums, sites d’avis, forums communautaires et profils sociaux publics. La collecter est la base de l’écoute sociale, et c’est plus difficile qu’il n’y paraît. Chaque plateforme structure ses pages différemment, beaucoup affichent le contenu via JavaScript, et presque tout ce que vous collectez concerne des personnes.
Ce guide explique comment les équipes collectent aujourd’hui des données sociales publiques avec des web scraping API : quelles sources utiliser et quand les API officielles constituent la meilleure option, comment transformer des plateformes très différentes en un seul jeu de données, et comment en exclure les données personnelles dès la conception.
Commencez par ce que vous cherchez à apprendre
Les projets de données sociales échouent lorsqu’on collecte tout et qu’on décide ensuite. Déterminez d’abord à quelle question vous répondez :
- Volume : à quelle fréquence la marque est-elle mentionnée, et cela évolue-t-il ?
- Sujets : que disent les gens, à propos de quels produits ou problèmes ?
- Comparaison : comment les mentions de la marque se comparent-elles à celles des concurrents ?
- Incidents : une plainte ou une annonce de contrefaçon est-elle en train de se propager ?
Chaque question ne nécessite que quelques champs : le lien du post, l’heure, le texte et la source. Peu de projets ont besoin de davantage d’informations sur les personnes qui ont publié.
Choisissez la bonne source
| Source | Meilleure voie |
|---|---|
| Plateformes avec une API officielle qui couvre votre besoin | L’API officielle, dans le respect de ses conditions |
| Forums publics, forums communautaires et sites d’avis | Collecte de pages publiques |
| Pages qui s’affichent via JavaScript | Une web scraping API avec rendu |
| Tout ce qui se trouve derrière une connexion | Ne pas le collecter |
Les API officielles sont généralement la voie la plus fiable et la plus clairement autorisée lorsqu’elles existent et correspondent à votre volume et à votre budget. Pour les pages publiques qui n’en disposent pas, une web scraping API gère les aspects qui rendent les sites sociaux délicats : rendu du JavaScript, attente du chargement du contenu, et récupération des pages telles qu’elles apparaissent dans un pays donné. Les règles d’extraction renvoient les champs dont vous avez besoin au format JSON plutôt qu’en HTML brut.
Restez du côté public de chaque site. Le contenu derrière une connexion, les groupes privés et les messages directs sont hors limites, à la fois parce qu’y accéder implique généralement d’accepter des conditions qui interdisent la collecte, et parce que les personnes concernées s’attendent à de la confidentialité.
Un schéma unique pour chaque plateforme
Chaque source nomme ses champs différemment : un forum a un permalien et un corps de texte, un site d’avis a un lien et un texte d’avis, et les dates se présentent dans des formats et des fuseaux horaires différents. Si vous les analysez séparément, les comparaisons ne tiennent plus. Faites correspondre chaque source à un seul petit schéma au fur et à mesure de la collecte :
- source : d’où vient le post ;
- url : l’adresse canonique, pour que le même post ne soit compté qu’une fois ;
- published_at : l’heure en UTC ;
- text : le texte du post, avec les espaces normalisés ;
- author_key : une clé pseudonyme à la place du nom de l’auteur.
Le module ci-dessous effectue cette correspondance, supprime les URL en double (les paramètres de suivi et les fragments font souvent qu’un seul post semble en être plusieurs) et compte les mentions quotidiennes par marque :
import hashlib
from collections import Counter
from datetime import datetime, timezone
from urllib.parse import urlsplit, urlunsplit
# Where each source keeps the fields we need, after extraction rules have run.
FIELD_MAPS = {
"forum": {"url": "permalink", "text": "body", "author": "username", "time": "created"},
"review": {"url": "link", "text": "review_text", "author": "reviewer", "time": "date"},
}
def canonical(url):
"""Drop query strings and fragments so the same post counts once."""
parts = urlsplit(url)
return urlunsplit((parts.scheme, parts.netloc.lower(), parts.path.rstrip("/"), "", ""))
def normalise(source, raw, salt):
"""One post in a common shape, with the author pseudonymised and no other personal data."""
m = FIELD_MAPS[source]
when = datetime.fromisoformat(raw[m["time"]].replace("Z", "+00:00")).astimezone(timezone.utc)
return {
"source": source,
"url": canonical(raw[m["url"]]),
"published_at": when.isoformat(timespec="seconds"),
"text": " ".join(raw[m["text"]].split()),
"author_key": hashlib.sha256((salt + raw[m["author"]]).encode()).hexdigest()[:16],
}
def daily_mentions(posts, brands):
"""Count posts per day that mention each brand, counting each URL once."""
seen, counts = set(), Counter()
for post in posts:
if post["url"] in seen:
continue
seen.add(post["url"])
day = post["published_at"][:10]
for brand in brands:
if brand.lower() in post["text"].lower():
counts[(day, brand)] += 1
return dict(sorted(counts.items()))
Appliqué à trois enregistrements illustratifs, dont l’un est un doublon avec un paramètre de suivi :
import os
from social import daily_mentions, normalise
salt = os.environ.get("MENTIONS_SALT", "rotate-me-per-project")
raw = [
("forum", {"permalink": "https://forum.example/t/88?ref=home", "body": "Acme kettle died after a week",
"username": "kitchen_fan", "created": "2026-10-20T08:15:00Z"}),
("forum", {"permalink": "https://forum.example/t/88", "body": "Acme kettle died after a week",
"username": "kitchen_fan", "created": "2026-10-20T08:15:00Z"}),
("review", {"link": "https://reviews.example/p/42", "review_text": "Better than my old Brandly one",
"reviewer": "J. D.", "date": "2026-10-20T19:40:00+02:00"}),
]
posts = [normalise(source, item, salt) for source, item in raw]
print(daily_mentions(posts, ["Acme", "Brandly"]))
{('2026-10-20', 'Acme'): 1, ('2026-10-20', 'Brandly'): 1}
Le doublon n’est compté qu’une fois, l’heure locale de l’avis est convertie en UTC, et aucun nom d’utilisateur n’atteint la sortie.
Les données personnelles, exclues dès la conception
Les posts publics restent des données personnelles en Europe et dans de nombreux autres endroits, et les règles de protection des données s’appliquent quel que soit le caractère public du post. La conception la plus sûre conserve le moins possible d’informations sur les personnes, selon ce dont la question a réellement besoin :
- Pseudonymisez les auteurs. Un hash salé permet de compter les posteurs distincts ou de repérer un compte qui publie de manière répétée, sans stocker le nom d’utilisateur. Utilisez un sel différent par projet, et gardez-le secret.
- Ne collectez pas les profils. Le nombre d’abonnés, les biographies, les photos et les localisations des individus sont rarement nécessaires pour répondre à des questions de marque.
- Gardez une rétention courte. Les comptes agrégés et les sujets peuvent être conservés ; le texte brut peut généralement être supprimé après l’analyse.
- Rapportez de manière agrégée. Publiez des tendances et des exemples sans identifier les personnes.
Notre guide sur le scraping des plateformes sociales pour l’analyse de sentiment couvre le volet analyse une fois les données nettoyées, et notre guide sur le suivi des mentions de marque en ligne couvre la construction de l’ensemble de requêtes et la gestion des différences régionales.
Collectez en douceur
Les sites sociaux et communautaires sont gérés pour leurs utilisateurs. Collectez à un rythme qu’un lecteur pourrait adopter en naviguant, privilégiez les pages qui listent les nouveaux posts plutôt que d’explorer des archives entières, et arrêtez de collecter auprès de toute source qui vous le demande. La surveillance de marque n’a rarement besoin de plus d’un passage quotidien sur les sources qui comptent.
FAQ
Est-il légal de collecter des données issues des réseaux sociaux ?
Collecter des posts publics est souvent licite, mais les conditions d’utilisation des plateformes, la manière dont vous accédez aux données et le droit de la protection des données s’appliquent tous. Utilisez les API officielles lorsqu’elles conviennent, évitez le contenu derrière des connexions, et limitez les données personnelles à ce que l’objectif exige. Demandez conseil juridique pour votre cas spécifique.
Dois-je utiliser l’API d’une plateforme ou une web scraping API ?
Utilisez l’API officielle lorsqu’elle couvre les données et le volume dont vous avez besoin, dans le respect de ses conditions. Utilisez une web scraping API pour les pages publiques qui n’ont pas d’API adaptée, en particulier les pages qui s’affichent via JavaScript.
Comment éviter de collecter des données personnelles sur les réseaux sociaux ?
Collectez uniquement les champs dont votre question a besoin, remplacez les noms d’utilisateur par des clés pseudonymes salées, évitez entièrement les profils, ne conservez le texte brut que le temps nécessaire, et présentez les résultats de manière agrégée.
À quelle fréquence dois-je collecter les mentions sociales ?
Une fréquence quotidienne suffit pour la plupart des surveillances de marque. Collectez plus souvent uniquement pendant un lancement ou un incident, et concentrez-vous sur les sources où votre audience publie réellement.
En résumé
Les données sociales ont de la valeur parce qu’elles reflètent ce que de vraies personnes disent publiquement, et c’est aussi pourquoi elles nécessitent de la précaution. Déterminez d’abord la question, utilisez les API officielles lorsqu’elles conviennent et une web scraping API pour les pages publiques, faites correspondre chaque source à un seul petit schéma, et excluez les données personnelles dès la conception. Le résultat est un jeu de données qui répond aux questions de marque sans collecter plus que nécessaire.