Extrayez les avis d'entreprises Google via une API SERP en recherchant un nom d'entreprise et en analysant le panneau de connaissances qui contient les notes, le nombre d'avis et des extraits d'avis individuels. Le scraping direct de Google Maps nécessite une automatisation du navigateur, une rotation des proxys et une maintenance constante des sélecteurs. Une API SERP renvoie les mêmes données d'avis sous forme de JSON structuré à partir d'une seule requête POST. Ce tutoriel extrait les avis pour n'importe quelle entreprise et compare cette approche au scraping direct.
Prérequis
- Python 3.8+ installé
- Bibliothèque requests installée
- Une clé API Scavio provenant de scavio.dev
- Un nom d'entreprise à rechercher
Parcours
Étape 1: Rechercher l'entreprise
Interrogez Google via Scavio en utilisant le nom et l'emplacement de l'entreprise pour déclencher le panneau de connaissances.
import os, requests, json
API_KEY = os.environ['SCAVIO_API_KEY']
def search_business(name: str, location: str = '') -> dict:
query = f'{name} {location} reviews' if location else f'{name} reviews'
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': query}, timeout=15)
resp.raise_for_status()
return resp.json()
data = search_business('Starbucks', 'Times Square New York')
print(f'Keys in response: {list(data.keys())}')Étape 2: Extraire les avis du panneau de connaissances
Analysez la section du panneau de connaissances de la réponse pour extraire la note globale, le nombre d'avis et les extraits d'avis.
def extract_reviews(data: dict) -> dict:
kg = data.get('knowledge_graph', {})
reviews_data = {
'name': kg.get('title', kg.get('name', '')),
'rating': kg.get('rating', ''),
'review_count': kg.get('reviews', kg.get('review_count', '')),
'type': kg.get('type', ''),
'address': kg.get('address', ''),
}
# Extract individual review snippets if available
reviews = kg.get('reviews', kg.get('user_reviews', []))
if isinstance(reviews, list):
reviews_data['snippets'] = [{
'text': r.get('text', r.get('snippet', '')),
'rating': r.get('rating', ''),
'author': r.get('author', ''),
} for r in reviews[:5]]
return reviews_data
reviews = extract_reviews(data)
print(json.dumps(reviews, indent=2))Étape 3: Analyser les résultats organiques pour les pages d'avis
Vérifiez également les résultats organiques pour les pages d'agrégation d'avis qui contiennent des données d'avis supplémentaires.
def extract_review_links(data: dict) -> list:
results = data.get('organic_results', [])
review_links = []
review_signals = ['review', 'rating', 'stars', 'feedback', 'testimonial']
for r in results:
text = f"{r.get('title', '')} {r.get('snippet', '')}".lower()
if any(signal in text for signal in review_signals):
review_links.append({
'title': r.get('title', ''),
'url': r.get('link', ''),
'snippet': r.get('snippet', '')[:200],
})
return review_links
links = extract_review_links(data)
for link in links:
print(f"{link['title'][:50]}: {link['url']}")Étape 4: Comparer avec le scraping direct
Mettez en évidence les différences entre l'extraction d'avis basée sur une API et le scraping direct de Google Maps en termes de fiabilité et de coût.
def review_report(business: str, location: str = '') -> dict:
data = search_business(business, location)
reviews = extract_reviews(data)
review_links = extract_review_links(data)
report = {
'business': reviews.get('name', business),
'rating': reviews.get('rating', 'N/A'),
'review_count': reviews.get('review_count', 'N/A'),
'review_snippets': len(reviews.get('snippets', [])),
'review_pages_found': len(review_links),
'method': 'SERP API (1 API call, structured JSON)',
'alternative': 'Direct scraping (browser + proxy + selector maintenance)',
'api_cost': '$0.005 per query',
}
print(f"{report['business']}: {report['rating']} ({report['review_count']} reviews)")
print(f"Snippets: {report['review_snippets']}, Review pages: {report['review_pages_found']}")
return report
review_report('Blue Bottle Coffee', 'San Francisco')Exemple Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def get_reviews(business, location=''):
query = f'{business} {location} reviews'.strip()
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': query}).json()
kg = data.get('knowledge_graph', {})
return {'name': kg.get('title', ''), 'rating': kg.get('rating', ''), 'reviews': kg.get('reviews', '')}
print(get_reviews('Blue Bottle Coffee', 'San Francisco'))Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function getReviews(business, location = '') {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({platform: 'google', query: `${business} ${location} reviews`})
});
const kg = (await r.json()).knowledge_graph || {};
return {name: kg.title, rating: kg.rating, reviews: kg.reviews};
}
getReviews('Blue Bottle Coffee', 'San Francisco').then(console.log);Sortie attendue
Business review data extracted from Google knowledge graph via SERP API, including rating, review count, and individual review snippets without browser scraping.