Comment Scraper des Avis en Ligne en JSON : Yelp, Tripadvisor, Booking et Plus
Les avis vous apprennent ce qu’aucune fiche produit ne dira. Pourquoi des clients quittent un hôtel mécontents. Quelle fonctionnalité pousse des acheteurs à changer de logiciel. Ce que les salariés pensent vraiment d’une entreprise. Si vous voulez ce signal à grande échelle, il vous faut les avis sous forme de données, pas une page web à faire défiler.
Les collecter est plus difficile qu’il n’y paraît. Ce guide explique pourquoi, quels plugins d’avis utiliser pour obtenir les données en JSON propre, comment surveiller les nouveaux avis de façon planifiée et comment fusionner des avis de plusieurs sites dans un seul jeu de données.
Pourquoi Scraper des Avis Soi-Même Est Difficile
Chaque site d’avis vous complique la tâche d’une manière un peu différente :
- Le HTML ne contient que quelques avis. La page d’un établissement sur Yelp ou d’un logement sur Airbnb affiche une poignée d’avis. Le reste se charge page par page depuis l’API interne du site, donc votre parseur HTML ne voit presque rien.
- La pagination est la partie coûteuse. Tripadvisor sert 10 avis par page. Pour obtenir 200 avis, vous chargez 20 pages, et chaque page est une occasion de plus de vous faire bloquer.
- Des systèmes anti-bot protègent les meilleures sources. Plusieurs grands sites d’avis sont protégés par des solutions anti-bot commerciales comme DataDome ou Cloudflare. Un simple appel
requestsreçoit une page de challenge au lieu des avis. - Des murs de connexion cachent une partie des données. Amazon ne montre sa liste complète d’avis qu’aux clients connectés. Glassdoor montre trois avis par vue aux visiteurs non connectés.
- Chaque site a son propre schéma. Booking.com note sur 10 et sépare le texte en “a aimé” et “n’a pas aimé”. Glassdoor a des points positifs et négatifs. Yelp n’a qu’un seul champ de texte. Vous finissez par écrire un parseur par site et par le corriger à chaque changement de balisage.
Si vous avez déjà construit un scraper d’avis, vous savez que le parseur est la partie facile. Le vrai travail, c’est d’obtenir les pages de façon fiable.
Les Plugins d’Avis en un Coup d’Œil
ScrapeUnblocker propose un ensemble de plugins d’avis qui prennent un établissement, un produit ou un logement et renvoient ses avis déjà parsés. Vous envoyez une requête POST et recevez du JSON. Pas de compte sur le site d’avis, pas de connexion, pas de sélecteurs CSS.
| Plateforme | Endpoint | Avis par appel | Bon à savoir |
|---|---|---|---|
| Yelp | /local/yelp-reviews | jusqu’à 500 | Toutes les pages d’avis, une langue par appel |
| Tripadvisor | /travel/tripadvisor-reviews | jusqu’à 200 | Hôtels, restaurants et attractions, réponses du propriétaire |
| Airbnb | /travel/airbnb-reviews | jusqu’à 500 | Tous les avis, avec la traduction d’Airbnb |
| Booking.com | /travel/booking-reviews | jusqu’à 270 | Les 15 plus récents par langue, 18 langues |
| Amazon | /marketplace/amazon-reviews | les 5 à 13 avis mis en avant | Note, histogramme des étoiles et le résumé “Customers say” |
| Glassdoor | /reviews/glassdoor | jusqu’à 25 | Un échantillon public, site américain uniquement |
| Capterra | /reviews/capterra | jusqu’à 500 | Points positifs, négatifs et raisons du changement |
| Trustpilot | /reviews/trustpilot | 20 par page | TrustScore, répartition des étoiles et réponses de l’entreprise |
Chaque plugin a sa propre page dans le catalogue de scrapers, avec la liste complète des champs, un exemple de réponse et son benchmark public.
Votre Premier Appel
Voici le plugin Yelp en Python. Le paramètre business accepte une URL Yelp, l’alias de l’établissement ou son identifiant :
import os
import requests
resp = requests.post(
"https://api.scrapeunblocker.com/local/yelp-reviews",
headers={"X-ScrapeUnblocker-Key": os.environ["SU_API_KEY"]},
params={"business": "gary-danko-san-francisco", "max_reviews": "20", "sort": "newest"},
timeout=180,
)
resp.raise_for_status()
data = resp.json()
biz = data["business"]
print(biz["name"], biz["rating"], biz["reviewCount"], biz["ratingHistogram"])
for review in data["reviews"]:
print(review["date"], review["rating"], review["text"][:80])
La réponse a deux parties. business est le résumé : note, nombre d’avis, l’histogramme de 1 à 5 étoiles et le nombre d’avis par langue. reviews est la liste elle-même, chaque avis avec son identifiant, sa note, le texte complet, la date, l’auteur, les photos, les réactions et la réponse du propriétaire.
La pagination fonctionne de la même manière pour tous les plugins. Vous demandez un nombre d’avis avec max_reviews ou max_results, et la réponse vous indique s’il y en a d’autres (hasMore) et où reprendre (nextStart sur Yelp, nextPage sur Tripadvisor et Capterra, nextPage ou nextOffset sur Airbnb). Elle indique aussi pagesFetched, c’est-à-dire ce qui vous est facturé.
Surveiller les Nouveaux Avis de Façon Planifiée
La plupart des projets d’avis ne sont pas des téléchargements ponctuels. Vous voulez savoir quand un nouvel avis arrive, surtout s’il est mauvais. La méthode qui fonctionne :
- Demandez d’abord les avis les plus récents (
sort=newestsur Yelp,sort=most_recentsur Airbnb ; Tripadvisor trie déjà du plus récent au plus ancien par défaut). - Gardez des lots petits, car vous n’avez besoin que de ce qui a changé depuis la dernière exécution.
- Enregistrez chaque identifiant d’avis déjà vu et n’agissez que sur les nouveaux.
- Quand le plugin le permet, passez une date
sincepour écarter les avis plus anciens avant qu’ils ne vous parviennent.
Booking.com est fait exactement pour ça. Il n’expose que les 15 avis les plus récents par langue, donc vous l’interrogez régulièrement et passez since sous forme de date YYYY-MM-DD.
import os
import sqlite3
from datetime import date, timedelta
import requests
API = "https://api.scrapeunblocker.com"
HEADERS = {"X-ScrapeUnblocker-Key": os.environ["SU_API_KEY"]}
since = (date.today() - timedelta(days=7)).isoformat()
TARGETS = [
("yelp", "/local/yelp-reviews",
{"business": "gary-danko-san-francisco", "sort": "newest", "max_reviews": "20"}),
("tripadvisor", "/travel/tripadvisor-reviews",
{"url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
"max_reviews": "20"}),
("airbnb", "/travel/airbnb-reviews",
{"room": "35283352", "sort": "most_recent", "max_reviews": "50"}),
("booking", "/travel/booking-reviews",
{"hotel": "gb/the-savoy", "languages": "en,de", "since": since}),
]
db = sqlite3.connect("reviews.db")
db.execute("CREATE TABLE IF NOT EXISTS seen (platform TEXT, id TEXT, PRIMARY KEY (platform, id))")
for platform, path, params in TARGETS:
r = requests.post(API + path, headers=HEADERS, params=params, timeout=180)
r.raise_for_status()
data = r.json()
new = []
for review in data.get("reviews", []):
cur = db.execute("INSERT OR IGNORE INTO seen VALUES (?, ?)", (platform, str(review["id"])))
if cur.rowcount:
new.append(review)
db.commit()
print(f"{platform}: {len(new)} new reviews, {data.get('pagesFetched')} pages billed")
Lancez-le une fois par jour avec cron ou n’importe quel planificateur. La première exécution remplit la table ; chaque exécution suivante ne signale que les nouveautés. Ensuite, envoyez les mauvaises notes sur Slack ou par e-mail, ou chargez tout dans votre data warehouse.
Fusionner les Avis dans un Seul Schéma
Dès que vous suivez plusieurs plateformes, vous voulez une seule table, pas sept. Les différences sont petites mais réelles : Booking.com note sur 10, Amazon appelle son texte body, Glassdoor et Capterra le divisent en points positifs et négatifs, et le champ de réponse porte un nom différent sur chaque site. Une petite table de correspondance règle le problème :
FIELDS = {
# platform: (text fields, date field, author path, reply field, rating scale)
"yelp": (["text"], "date", ("user", "name"), "ownerResponse", 5),
"tripadvisor": (["title", "text"], "publishedDate", ("user", "name"), "ownerResponse", 5),
"airbnb": (["text"], "date", ("reviewer", "name"), "response", 5),
"booking": (["title", "positiveText", "negativeText"], "reviewDate", ("reviewer", "name"), None, 10),
"amazon": (["title", "body"], "date", ("author",), None, 5),
"glassdoor": (["title", "pros", "cons"], "date", ("jobTitle",), "employerResponse", 5),
"capterra": (["title", "comments", "pros", "cons"], "date", ("reviewer", "name"), "vendorResponse", 5),
}
def normalize(platform, r):
text_fields, date_field, author_path, reply_field, scale = FIELDS[platform]
author = r
for key in author_path:
author = author.get(key) if isinstance(author, dict) else None
return {
"platform": platform,
"id": str(r["id"]),
"rating": round(r["rating"] / scale * 5, 1) if r.get("rating") is not None else None,
"text": "\n\n".join(r[f] for f in text_fields if r.get(f)),
"date": (r.get(date_field) or "")[:10],
"author": author,
"replied": bool(reply_field and r.get(reply_field)),
}
Chaque avis a désormais une note sur une échelle de 1 à 5, un seul champ de texte, une date ISO et un indicateur replied. C’est suffisant pour des tableaux de bord, des alertes et de l’analyse de sentiment sur toutes vos sources.
Ce Que Vous Pouvez Construire avec des Données d’Avis
- Suivi de réputation pour hôtels et restaurants. Suivez les nouveaux avis sur Tripadvisor, Booking.com, Airbnb et Yelp au même endroit, soyez alerté des mauvaises notes et mesurez la fréquence et la rapidité des réponses du propriétaire par rapport aux concurrents proches.
- Recherche produit sur Amazon. Les données “Customers say” listent les aspects dont parlent les acheteurs (qualité, ajustement, son) avec leur sentiment et le nombre de mentions. Comparez-les entre produits concurrents pour voir quelle faiblesse vous pouvez corriger.
- Veille concurrentielle SaaS. Les avis Capterra incluent les raisons du choix d’un produit, les raisons du changement et les produits abandonnés par l’acheteur. Utilisez
mode=searchavec un mot-clé commecrmpour trouver tous les produits d’une catégorie, puis voyez qui perd des clients au profit de qui, et pourquoi. - Recherche sur les employeurs. Les avis Glassdoor contiennent six sous-notes, l’approbation du CEO et les perspectives de l’entreprise. Suivez leur évolution pour votre entreprise et pour celles avec qui vous êtes en concurrence pour recruter.
- Analyse de sentiment multilingue. Booking.com renvoie des avis dans jusqu’à 18 langues, et Airbnb renvoie sa propre traduction à côté du texte original, ce qui permet de tout analyser dans une seule langue.
- Jeux de données pour l’IA. Des avis normalisés sont une entrée propre pour un LLM qui extrait des thèmes, résume des plaintes ou étiquette des demandes de fonctionnalités.
Connaître les Limites Avant de Construire
Les plugins renvoient ce que chaque site montre publiquement, et cela varie beaucoup :
- Amazon renvoie la partie publique d’une fiche produit : note, histogramme, “Customers say” et les avis mis en avant. Quand Amazon affiche une invitation à se connecter à la place des avis,
reviewsGatedvaut true et la liste est vide. Ce n’est pas un export complet. - Glassdoor montre trois avis par vue aux visiteurs non connectés. Le plugin combine plusieurs ordres de tri et filtres par étoiles pour atteindre jusqu’à 25 avis par appel. Considérez-le comme un échantillon, pas comme un historique.
- Booking.com donne les 15 avis les plus récents par langue. Un indicateur
cappedvous signale quand des avis plus anciens existent sans être accessibles. - Yelp liste une langue d’avis par appel.
reviewsCountByLanguagevous dit si un autre passage en vaut la peine. - Capterra ne propose que son tri Most Helpful, sans filtre de date, et s’arrête à 100 pages par produit.
La facturation suit les pages servies par chaque site : une requête pour 10 avis sur Yelp, par page d’avis sur Tripadvisor (10 avis, 15 pour les restaurants), pour 50 sur Airbnb, pour 25 sur Capterra, par langue sur Booking.com et par vue sur Glassdoor. Vérifiez pagesFetched dans chaque réponse et ajustez max_reviews à ce dont vous avez réellement besoin.
Un dernier point : les noms et profils des auteurs d’avis peuvent être des données personnelles. Ne conservez que ce dont votre cas d’usage a besoin. Notre guide sur la légalité du web scraping couvre l’essentiel.
FAQ
Puis-je obtenir tous les avis d’un établissement ? Sur Airbnb et Yelp, oui : les plugins parcourent tous les avis, jusqu’à 500 par appel. Tripadvisor en donne jusqu’à 200 par appel, puis vous continuez avec la page suivante. Capterra va jusqu’à 100 pages de 25. Amazon, Glassdoor et Booking.com n’exposent qu’une partie publique, vous obtenez donc un échantillon ou les avis les plus récents.
Comment ne collecter que les nouveaux avis ?
Triez du plus récent au plus ancien, gardez chaque exécution petite, enregistrez les identifiants d’avis déjà vus et passez une date since quand le plugin le permet. Le script de surveillance ci-dessus fait exactement cela.
Ai-je besoin d’un compte sur le site d’avis ? Non. Aucun des plugins ne se connecte ni n’a besoin d’une clé d’API partenaire. Ils lisent ce que le site montre à un visiteur non connecté.
Combien cela coûte-t-il ? Chaque page facturée correspond à une requête, et une requête à un crédit : 1,00 EUR pour 1 000 en paiement à l’usage, jusqu’à environ 0,55 EUR pour 1 000 avec le plan Ultimate. Les requêtes bloquées et les timeouts ne sont pas facturés.
Pour Commencer
Les données d’avis ne sont utiles que si elles continuent d’arriver. Les parties difficiles sont les barrières anti-bot, la pagination et les changements de schéma, et c’est exactement ce que les plugins prennent en charge pour vous, afin que vous consacriez votre temps à l’analyse.
Parcourez les plugins d’avis dans le catalogue de scrapers de ScrapeUnblocker, puis créez un compte gratuit et lancez le premier exemple ci-dessus avec votre propre établissement ou produit. L’essai gratuit inclut 500 requêtes, sans carte bancaire.
Essayez ScrapeUnblocker gratuitement
Taux de réussite de plus de 95 % · à partir de 0,55 € pour 1 000 appels · 500 requêtes gratuites à l'inscription.