Les journalistes d'investigation ont besoin d'avis Google en masse pour faire apparaître des tendances (faux avis, bombardement d'avis, plaintes pour vol de salaire). L'API officielle de Google limite à 5 avis par lieu. Ce tutoriel utilise la recherche Maps/Places de Scavio pour extraire des milliers d'avis par entreprise à l'échelle du journalisme.
Prérequis
- Python 3.10+
- Une clé API Scavio
- Une liste de noms d'entreprises cibles ou d'IDs de lieu
- pandas pour l'analyse
Parcours
Étape 1: Trouver l'ID du lieu
La recherche Scavio Maps renvoie le place_id pour chaque entreprise.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def find_place(name):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google_maps', 'query': name})
return r.json().get('local_results', [{}])[0].get('place_id')Étape 2: Récupérer les avis par place_id
Parcourir tous les avis par pagination.
def reviews(place_id, max_pages=10):
all_reviews, token = [], None
for _ in range(max_pages):
body = {'platform': 'google_reviews', 'query': place_id}
if token: body['next_token'] = token
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json=body).json()
all_reviews += r.get('reviews', [])
token = r.get('next_token')
if not token: break
return all_reviewsÉtape 3: Stocker dans pandas
Une ligne par avis pour l'analyse.
import pandas as pd
def to_df(reviews):
return pd.DataFrame(reviews)[['author', 'rating', 'date', 'text']]Étape 4: Effectuer une analyse de motifs
Mots-clés fréquents, distributions de notes, pics de vélocité.
def burst_days(df):
return df.groupby('date').size().sort_values(ascending=False).head(10)Étape 5: Exporter pour la rédaction
CSV pour les rédacteurs, extraits en markdown pour les citations.
def export(df, business):
df.to_csv(f'reviews_{business}.csv', index=False)Exemple Python
import os, requests, pandas as pd
API_KEY = os.environ['SCAVIO_API_KEY']
def pull(business):
pid = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google_maps', 'query': business}).json()['local_results'][0]['place_id']
revs = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google_reviews', 'query': pid}).json().get('reviews', [])
return pd.DataFrame(revs)
print(pull('Joe Coffee Brooklyn').head())Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
async function pull(business) {
const mapR = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'google_maps', query: business })
});
const pid = (await mapR.json()).local_results[0].place_id;
const revR = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'google_reviews', query: pid })
});
return (await revR.json()).reviews;
}Sortie attendue
Thousands of reviews per business in minutes. Pandas dataframe with date, rating, author, text. Ready for burst-day detection and keyword analysis.