Guide pour l'extraction des données de Walmart avec Python

Commentaires: 0

Le web scraping est un moyen puissant d'extraire des données de sites web à des fins diverses, telles que l'analyse, la recherche et l'intelligence dans les affaires. Ce tutoriel vous aide à extraire des informations sur les produits Walmart en Python en mettant l'accent sur les stratégies et les techniques clés. Le scraping Walmart présente un exemple où nous pouvons extraire des détails de produits comme le nom, le prix ou les commentaires trouvés sur différentes pages des sites Walmart.

Ce guide utilise la bibliothèque requests pour effectuer des requêtes HTTP et la bibliothèque lxml pour analyser le contenu HTML.

Mise en place de l'environnement

Avant de commencer, assurez-vous que Python est installé sur votre machine. Vous pouvez installer les bibliothèques nécessaires à l'aide de pip :

pip install requests
pip install  lxml
pip install urllib3

Ensuite, importons les bibliothèques nécessaires :

  • requests : pour effectuer des requêtes HTTP afin de récupérer des pages web ;
  • lxml : pour analyser le contenu HTML ;
  • csv : pour écrire les données extraites dans un fichier CSV ;
  • random : pour sélectionner des proxies et des chaînes User-Agent aléatoires.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Définir les URLs des produits

Liste des URL de produits Walmart à récupérer.

product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

Chaînes d'agent utilisateur et proxys

Pour gratter un site web, il est très important d'utiliser les bons en-têtes, notamment l'en-tête User-Agent, afin d'imiter une requête provenant d'un véritable navigateur. De plus, on peut éviter d'être limité par les mesures anti-bots mises en place par les propriétaires de sites en utilisant des serveurs proxy rotatifs. Vous trouverez ci-dessous des exemples de chaînes User-Agent ainsi qu'une description de la manière d'intégrer des serveurs proxy qui requièrent une autorisation basée sur l'adresse IP.

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

En-têtes pour les demandes

Définissez des en-têtes pour imiter les demandes du navigateur et éviter d'être détecté.

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',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    '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',
}

Initialiser le stockage des données

Créer une liste vide pour stocker les détails du produit.

product_details = []

Le processus d'énumération des pages URL se déroule comme suit : Pour chaque page URL, une requête GET est envoyée en utilisant un User-Agent et un proxy choisis au hasard. À la réception de la réponse HTML, celle-ci est analysée pour en extraire des détails tels que le nom du produit, le prix et les commentaires. Les données extraites sont stockées dans un dictionnaire, qui est ensuite ajouté à une liste créée précédemment.

for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Envoyer une requête HTTP GET à l'URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Analyse du contenu HTML à l'aide de lxml
   parser = html.fromstring(response.text)
   # Extraire le titre du produit
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Prix des produits d'extraction
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Extraire les détails de l'examen
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Stocker les informations extraites dans un dictionnaire
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Ajouter les détails du produit à la liste
   product_details.append(product_detail)

Titre:

1.png

Prix:

2.png

Détail de la révision:

3.png

Enregistrer les données au format CSV

  1. Ouvrir un nouveau fichier CSV pour l'écriture.
  2. Définissez les noms des champs (colonnes) pour le fichier CSV.
  3. Créer un objet csv.DictWriter pour écrire des dictionnaires dans le fichier CSV.
  4. Écrire la ligne d'en-tête dans le fichier CSV.
  5. Faites défiler la liste product_details et écrivez chaque dictionnaire de produit sous la forme d'une ligne dans le fichier CSV.
with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

Code complet:

Voici le code complet avec des commentaires pour vous aider à mieux le comprendre :

import requests
from lxml import html
import csv
import random
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# Liste des URL de produits à récupérer
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Chaînes d'agent utilisateur aléatoires pour l'anonymat
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# Liste de proxy pour la rotation d'IP
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# En-têtes pour imiter les requêtes du navigateur
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',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   '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',
}

# Initialisation d'une liste vide pour stocker les détails du produit
product_details = []

# Bouclez l'URL de chaque produit
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Envoyer une requête HTTP GET à l'URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Analyser le contenu HTML à l'aide de lxml
   parser = html.fromstring(response.text)
   # Extraire le titre du produit
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Prix des produits d'extraction
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Extraire les détails de l'examen
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Stocker les informations extraites dans un dictionnaire
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Ajouter les détails du produit à la liste
   product_details.append(product_detail)

# Enregistrer les données extraites dans un fichier CSV
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

Notre tutoriel montre comment utiliser les bibliothèques Python pour récupérer des données sur les produits de Walmart et les enregistrer au format CSV en vue d'une analyse ultérieure. Le script fourni est fondamental et offre une base qui peut être améliorée pour accroître l'efficacité du processus de récupération. Les améliorations pourraient inclure l'introduction de délais aléatoires entre les requêtes pour imiter les modèles de navigation humaine, la mise en œuvre d'une rotation de l'agent utilisateur et du proxy pour éviter la détection, et le développement d'un système robuste de traitement des erreurs pour gérer les interruptions ou les échecs potentiels du scraping.

Commentaires:

0 Commentaires