Passer au contenu

Comment Web Scrape Yelp.com : le guide ultime de 3000 XNUMX mots pour extraire des listes d'entreprises, des avis et d'autres données

Yelp est l'une des plus grandes plateformes d'avis participatifs sur le Web. Avec plus de 200 millions d'avis sur des restaurants, bars, salons, magasins et autres entreprises dans plus de 30 pays, il contient une mine d'or de données pour les analystes, les chercheurs, les entrepreneurs et bien plus encore.

Mais est-il possible d’extraire ces données via le web scraping ? Absolument!

Dans ce guide complet de plus de 3000 XNUMX mots, je partagerai tout ce dont vous avez besoin pour créer un grattoir Web capable d'extraire d'énormes ensembles de données de Yelp à l'aide de Python.

Voici un bref aperçu de ce que nous allons couvrir :

  • Configuration de notre environnement de scraping Web Python
  • Rechercher et extraire toutes les entreprises correspondant à une requête de recherche
  • Récupérer des détails clés tels que le nom, l'adresse et les numéros de téléphone des pages de profil d'entreprise
  • Extraire tous les avis sur une entreprise, y compris les notes, les détails des utilisateurs, etc.
  • Éviter la détection des robots via des proxys, des retards et d'autres astuces

Alors attachez-vous et c'est parti pour le grattage !

Configuration d'un environnement Python Web Scraping

Avant de pouvoir supprimer Yelp, nous devons configurer un environnement Python avec les dépendances requises.

Il y a quelques packages clés que nous devons installer :

Demandes – pour envoyer des requêtes HTTP aux serveurs de Yelp

BeautifulSoup – pour analyser et extraire les données des pages HTML de Yelp

Scrapy – (facultatif) un cadre pour construire des grattoirs

Je recommanderais de créer un environnement virtuel avant d'installer ceux-ci :

python -m venv scraping-env
source scraping-env/bin/activate

Nous pouvons maintenant installer les packages :

pip install requests beautifulsoup4 scrapy

C'est tout pour les dépendances. Nous avons également besoin d'en-têtes valides pour que les serveurs de Yelp pensent que nos requêtes proviennent d'un vrai navigateur :

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}

La clé est d'établir une approche convaincante User-Agent entête. Je recommanderais de faire tourner plusieurs agents utilisateurs de navigateur pour imiter davantage le trafic réel.

Et nous sommes prêts à commencer à gratter !

Trouver des entreprises sur Yelp

Notre premier défi consiste à découvrir les URL des profils d'entreprise Yelp à récupérer. Yelp ne fournit pas d'API publique ni de plan de site que nous pouvons interroger à cet effet.

Nous devrons donc procéder à une ingénierie inverse de leur fonctionnalité de recherche pour trouver les entreprises correspondant à un terme de recherche ou à un emplacement.

Analysons une requête de recherche typique :

https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco

Cela renvoie un ensemble paginé d'entreprises correspondant à nos critères de recherche. Chaque page contient 10 fiches d'entreprises.

Pour extraire TOUTES les entreprises correspondantes, nous devons :

  1. Récupérez la première page pour obtenir le nombre total d'entreprises
  2. Parcourez toutes les pages en incrémentant le start paramètre

Voici comment nous pouvons implémenter cette logique de pagination en Python :

import requests
from urllib.parse import urlencode
from bs4 import BeautifulSoup

search_url = "https://www.yelp.com/search?"

params = {
  "find_desc": "restaurants",
  "find_loc": "San Francisco"  
}

search_url += urlencode(params)

print("Fetching first page")
first_page = requests.get(search_url, headers=headers)
soup = BeautifulSoup(first_page.content, "html.parser")

businesses = soup.select(".businessName") 
total = int(soup.select_one(".pagination-results-window").text.split()[0].replace(‘,‘, ‘‘))
print(f"Found {total} businesses")

# Calculate pages needed to cover all businesses
num_pages = math.ceil(total / 10)

print(f"Scraping {num_pages} pages...")

for page in range(0, num_pages):

  # Update start param 
  params["start"] = page * 10
  page_url = search_url + "&" + urlencode(params)

  # Fetch page
  print(f"Page {page+1}/{num_pages}")
  page = requests.get(page_url, headers=headers)

  # Extract businesses
  page_soup = BeautifulSoup(page.content, "html.parser")
  businesses.extend(page_soup.select(".businessName"))

print(f"Found {len(businesses)} businesses!")

Décomposons cela :

  • Nous commençons par l'URL de recherche de base et les paramètres de recherche
  • Récupérez la première page pour obtenir le nombre total d'entreprises
  • Calculer le nombre de pages nécessaires pour couvrir toutes les entreprises
  • Parcourez les pages en mettant à jour le start arrêter
  • Sur chaque page, extrayez les fiches d'entreprises et ajoutez-les à la liste principale

Dans mon test, cela a été extrait 6,000 XNUMX fiches de restaurants à San Francisco – pas mal pour 30 lignes de Python !

Avec quelques ajustements supplémentaires, vous pourriez en faire un grattoir commercial Yelp pour une ville ou un pays entier.

Supprimer les pages de profil d'entreprise

Maintenant que nous pouvons découvrir les URL des profils d'entreprise, notre prochaine étape consiste à visiter chacune d'elles et à extraire des détails clés tels que :

  • Nom
  • Adresse
  • Téléphone
  • Heures d'ouverture
  • Description
  • Photos

Les pages professionnelles de Yelp sont rendues dynamiquement, mais le code HTML sous-jacent est suffisamment simple pour être analysé avec BeautifulSoup.

Regardons un exemple d'extrait :



<p>
  <strong>Phone:</strong> 
  415-387-2147
</p>

<p>
  <strong>Address:</strong>
  1345 9th Ave, San Francisco, CA 94122
</p>

<!-- And so on... -->

Nous pouvons extraire chaque information avec quelques sélecteurs CSS bien placés :

from bs4 import BeautifulSoup
import requests

business_url = "https://www.yelp.com/biz/burma-superstar-san-francisco"

page = requests.get(business_url, headers=headers)
soup = BeautifulSoup(page.content, "html.parser")

name = soup.select_one("h1").text
phone = soup.find("strong", string="Phone:").next_sibling.strip() 
address = soup.find("strong", string="Address:").next_sibling.strip()

hours = {}
for day in soup.select(".day-hours"):
   day_name = day.select_one(".day-name").text
   hours[day_name] = day.select_one(".hours").text

print(name)
print(phone) 
print(address)
print(hours)

# Burma Superstar
# 415-387-2147
# 1345 9th Ave, San Francisco, CA 94122
# {‘Mon‘: ‘11:30am–3pm, 5–9:30pm‘, ‘Tue‘: ‘11:30am–3pm, 5–9:30pm‘...}

Les points clés sont:

  • Utilisez select_one pour extraire des éléments singuliers comme le nom, le téléphone, etc.
  • Pour les données imbriquées comme les heures, parcourez et créez un dictionnaire
  • Préfixez les sélecteurs CSS avec des balises et des classes pour plus d'unicité

Avec ces éléments de base de scraping, nous pouvons extraire des dizaines de champs de chaque page de profil dans un dictionnaire Python structuré ou un objet JSON.

Certains autres domaines que vous voudrez peut-être envisager de supprimer incluent :

  • Balises de catégorie comme « Mexicain », « Brunch », etc.
  • Balises de cuisine comme « Burger », « Sushi », « Café », etc.
  • Mesures de sécurité COVID
  • Budget
  • Quartier
  • latitude / longitude

Faire preuve de créativité ici vous permet de créer de vastes ensembles de données Yelp avec des centaines de champs à analyser si nécessaire.

Récupérer les avis des pages professionnelles de Yelp

Les avis sont les joyaux des données de Yelp. Ils fournissent des informations incroyables sur le sentiment des consommateurs, les tendances, les données démographiques et bien plus encore.

Malheureusement, les avis ne sont pas chargés directement dans le HTML. Ils sont récupérés dynamiquement via des appels JavaScript.

Nous devrons intercepter et imiter ces demandes pour extraire les données d'examen.

Ouvrons une page commerciale et surveillons les requêtes réseau dans les outils du navigateur :

Yelp examine la demande du réseau

Aha – nous pouvons voir que les avis sont chargés à partir d'une URL telle que :

https://www.yelp.com/biz/{business_id}/reviews

{business_id} est propre à chaque entreprise. Nous pouvons l'extraire de la page HTML de l'entreprise.

Les avis sont paginés via le start paramètre. Nous suivrons donc la même stratégie de pagination :

  1. Récupérez la 1ère page pour obtenir le nombre total d'avis
  2. Parcourez toutes les pages en incrémentant start

Voici un script pour extraire tous les avis d'une entreprise :

import json
import requests 

business_id = "WavvLdfdP6g8aZTtbBQHTw" # Extract this from HTML

review_url = f"https://www.yelp.com/biz/{business_id}/review_feed?rl=en&q=&sort_by=relevance_desc"

print("Fetching first page")
first_page = requests.get(review_url, headers=headers)
data = json.loads(first_page.text)

total = data["pagination"]["totalResults"]
print(f"Found {total} reviews")

reviews = data["reviews"]

for page in range(total//20 + 1): # 20 reviews per page

  print(f"Fetching page {page+1}/{math.ceil(total/20)}")
  next_page = f"{review_url}&start={page*20}"
  page_data = requests.get(next_page, headers=headers).json()

  reviews.extend(page_data["reviews"])

print(f"Scraped {len(reviews)} reviews!")

Boom! Nous disposons désormais du corpus d'évaluation complet d'une entreprise avec des données telles que :

{
   "id": "xAG4O7l-t1ubiIsO4cXMYg",
   "rating": 5,
   "user": {
      "id": "rpOyqD_893cqmDAtJLbdog",
      "profile_url": "https://www.yelp.com/user_details?userid=rpOyqD_893cqmDAtJLbdog",
      "name": "Sarah K.",
      "location": "Los Angeles, CA", 
      //...
   },
   "text": "This place is incredible! The sushi melts in your mouth and the...",
    //...
}

L'analyse de ces données peut fournir des signaux forts sur le sentiment des clients en fonction des emplacements, des données démographiques, des types de cuisine et bien plus encore.

Éviter la détection des robots

Maintenant que nous avons créé des scrapers pour les entreprises et les avis, il est temps de tout rassembler.

Un problème : si nous commençons à attaquer les serveurs de Yelp avec des milliers de requêtes, nous serons rapidement bloqués.

Yelp utilise des systèmes avancés de détection de robots pour prévenir les abus, notamment :

  • Limites d'utilisation – limitez la vitesse à laquelle vous pouvez demander des pages
  • CAPTCHA – mettez les utilisateurs au défi de vérifier qu'ils sont humains
  • Interdictions IP – bloquez les adresses IP abusives

Voici quelques conseils pour éviter les blocages lors du scraping de Yelp à grande échelle :

Utiliser des procurations

En acheminant le trafic via un large pool d’adresses IP résidentielles, nous pouvons masquer les scrapers et éviter de simples interdictions d’adresses IP.

Voici comment utiliser les proxys avec le module Requêtes :

from proxy_list import proxies 

# Rotate proxy per request
proxy = random.choice(proxies)

requests.get(url, headers=headers, proxies={"http": proxy, "https": proxy}) 

Je recommanderais d'avoir une piscine de au moins 10,000 proxys de différentes plages IP pour être en sécurité.

Ajouter des délais aléatoires

L'ajout de délais variés entre les requêtes permet d'imiter le comportement humain organique :

from random import randint

# Add random delay between 2s and 6s
time.sleep(randint(2, 6))

Visez une moyenne de secondes 3-5 entre les pages. Tout excès de vitesse déclenchera des signaux d’alarme.

Utilisez un navigateur sans tête

Pour un anonymat accru, vous pouvez utiliser un navigateur sans tête comme Selenium pour afficher JavaScript et contourner les protections.

Assurez-vous simplement de modifier l'empreinte digitale et le proxy du navigateur par session.

Résolvez les CAPTCHA avec 2Captcha

Si vous frappez un CAPTCHA, des services comme 2Captcha peuvent le résoudre automatiquement pour continuer le scraping.

La plupart des services facturent environ 2 $ pour 1000 XNUMX CAPTCHA résolus, ce qui vaut la peine de mettre à l'échelle de grands grattoirs.

Respecter les limites du compte

Gardez un œil sur la page d'état de votre compte. Si votre taux de scrape est trop agressif, Yelp peut imposer des limites d'utilisation temporaires.

Rythmez vos demandes et reculez si des erreurs indiquent que vous approchez d'un seuil d'utilisation.

Scraping Yelp : prochaines étapes

Et cela couvre les techniques de base pour supprimer les fiches d'entreprises, les profils et les avis de Yelp !

Les données que vous pouvez extraire ouvrent des tonnes de possibilités :

  • Analyser le sentiment des consommateurs selon les données démographiques
  • Suivez les tendances et les types de cuisine émergents
  • Créer des modèles prédictifs pour les facteurs de réussite de l'entreprise
  • Optimisez votre propre référencement et votre réputation
  • Réaliser une vaste étude de marché
  • Identifier les opportunités publicitaires

N'oubliez pas de respecter les conditions d'utilisation de Yelp, de limiter le volume des demandes et d'éviter d'extraire des données utilisateur privées.

J'espère que vous avez trouvé ce guide utile ! N'hésitez pas à nous contacter si vous avez d'autres questions.

Bon grattage !

Mots clés:

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *