Comment récupérer Yelp en utilisant Python

Commentaires: 0

La récupération des données de Yelp peut fournir des informations précieuses sur les restaurants locaux, y compris des détails tels que le nom, l'URL, les cuisines et les évaluations. En utilisant les bibliothèques Python requests et lxml, ce tutoriel montrera comment extraire les résultats de recherche de Yelp. Plusieurs techniques seront abordées, notamment l'utilisation de proxies, la gestion des en-têtes et l'extraction de données à l'aide de XPath.

Étape 1 : Mise en place de l'environnement

Avant de commencer le processus de scraping, assurez-vous que vous avez installé Python et les bibliothèques nécessaires :

pip install requests
pip install lxml

Ces bibliothèques nous aideront à envoyer des requêtes HTTP à Yelp, à analyser le contenu HTML et à extraire les données dont nous avons besoin.

Etape 2 : Envoi d'une requête à Yelp

Tout d'abord, nous devons envoyer une requête GET à la page de résultats de recherche de Yelp pour récupérer le contenu HTML. Voici comment procéder :

import requests

# URL de la page de recherche Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Envoyer une requête GET pour récupérer le contenu HTML
response = requests.get(url)

# Vérifier si la demande a abouti
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

Comprendre les en-têtes HTTP

Lorsque vous adressez des requêtes à un site web, il est essentiel d'inclure les en-têtes HTTP appropriés. Les en-têtes peuvent contenir des métadonnées sur la requête, telles que l'agent utilisateur, qui identifie le navigateur ou l'outil à l'origine de la requête. L'inclusion de ces en-têtes peut aider à éviter le blocage ou l'étranglement par le site web cible.

Voici comment configurer les en-têtes :

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}

response = requests.get(url, headers=headers)

Mise en œuvre de la rotation du proxy

Lors du scraping d'un grand volume de pages, il y a un risque que votre adresse IP soit bloquée par le site cible. Pour éviter cela, il est recommandé d'utiliser des serveurs proxy. Pour ce guide, il est conseillé d'utiliser des serveurs proxy dynamiques qui proposent une rotation automatique. Ainsi, vous n'aurez à configurer les paramètres du serveur proxy qu'une seule fois, et la rotation permettra de maintenir l'accès en changeant périodiquement l'adresse IP, réduisant ainsi la probabilité d'être bloqué.

proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

response = requests.get(url, headers=headers, proxies=proxies)

Etape 3 : Analyse du contenu HTML avec lxml

Une fois que nous avons le contenu HTML, l'étape suivante consiste à l'analyser et à en extraire les données pertinentes. Nous utiliserons pour cela la bibliothèque lxml.

from lxml import html

# Analyse du contenu HTML à l'aide de lxml
parser = html.fromstring(response.content)

Identifier les éléments à récupérer

Nous devons cibler les listes individuelles de restaurants sur la page des résultats de la recherche. Ces éléments peuvent être identifiés à l'aide d'expressions XPath. Pour Yelp, les listes sont généralement enveloppées dans un élément div avec un attribut data-testid spécifique.

# Extraction d'éléments individuels de restaurants
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

Utilisation de XPath pour l'extraction de données

XPath est un outil puissant pour naviguer et sélectionner des nœuds dans un document HTML. Dans ce tutoriel, nous utiliserons des expressions XPath pour extraire le nom du restaurant, l'URL, les cuisines et l'évaluation de chaque élément restaurant.

Voici les XPaths spécifiques pour chaque point de données :

  1. Nom du restaurant: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()
  2. URL du restaurant: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href
  3. Cuisines: .//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()
  4. Evaluation: .//div[@class="y-css-9tnml4"]/@aria-label

Etape 4 : Extraction des données de chaque liste de restaurant

Maintenant que nous disposons du contenu HTML et que nous avons géré le blocage potentiel des adresses IP, nous pouvons extraire les données requises de chaque liste de restaurants.

restaurants_data = []

# Itérer sur chaque élément du restaurant
for element in elements:
    # Extraire le nom du restaurant
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Extraire l'URL du restaurant
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Extraire les cuisines
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Extraire la note
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Créer un dictionnaire pour stocker les données
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Ajouter les coordonnées du restaurant à la liste
    restaurants_data.append(restaurant_info)

Etape 5 : Enregistrement des données sous forme de JSON

Après avoir extrait les données, nous devons les enregistrer dans un format structuré. JSON est un format largement utilisé à cette fin.

import json

# Enregistrer les données dans un fichier JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Code complet

import requests
from lxml import html
import json

# URL de la page de recherche Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Configurer les en-têtes pour imiter une requête du navigateur
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.5'
}

# Mettre en place des proxys si nécessaire
proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

# Envoyer une requête GET pour récupérer le contenu HTML
response = requests.get(url, headers=headers, proxies=proxies)

# Vérifier si la demande a abouti
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

# Analyse du contenu HTML à l'aide de lxml
parser = html.fromstring(response.content)

# Extraction d'éléments individuels de restaurants
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

# Initialiser une liste pour contenir les données extraites
restaurants_data = []

# Itérer sur chaque élément du restaurant
for element in elements:
    # Extraire le nom du restaurant
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Extraire l'URL du restaurant
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Extraire les cuisines
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Extraire la note
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Créer un dictionnaire pour stocker les données
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Ajouter les coordonnées du restaurant à la liste
    restaurants_data.append(restaurant_info)

# Enregistrer les données dans un fichier JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Il est essentiel que les utilisateurs configurent correctement les en-têtes HTTP et utilisent des proxys pour contourner les restrictions et éviter le blocage. Pour une expérience de scraping optimisée et plus sûre, envisagez d'automatiser la rotation des IP. L'utilisation de proxys dynamiques résidentiels ou mobiles peut améliorer considérablement ce processus, en réduisant la probabilité d'être détecté et bloqué.

Commentaires:

0 Commentaires