Comment récupérer des sites de commerce électronique avec Python

Commentaires: 0

Pour l'analyse de la concurrence, la surveillance des prix et les études de marché, il est important de récupérer des données sur les produits à partir des sites de commerce électronique. Vous pouvez utiliser Python pour extraire efficacement les données des pages de produits. Dans ce guide, nous allons montrer comment récupérer des informations sur les produits à partir de magasins en ligne en utilisant une combinaison de requêtes et de lxml.

Le scraping du commerce électronique consiste à extraire les détails des produits tels que les noms, les prix et les identifiants des boutiques en ligne. Python, avec ses bibliothèques polyvalentes, rend cette tâche efficace et simple. Dans ce guide, nous allons extraire des informations sur les produits du site Web de Costco.

Écrire un script pour extraire des données sur les produits

Avant de plonger dans le processus de scraping, assurez-vous que les bibliothèques Python nécessaires sont installées :

pip install requests
pip install lxml

Nous nous concentrerons sur l'extraction des noms de produits, des caractéristiques des produits et des marques de produits à partir de pages de produits spécifiques sur le site web.

Étape 1. Comprendre la structure HTML du site web

Pour extraire des données d'un site web, vous devez comprendre la structure de la page web. Ouvrez une page web et inspectez les éléments que vous souhaitez extraire (par exemple, le nom du produit, les caractéristiques de la marque, etc.)

Étape 2. Envoi de requêtes HTTP

Tout d'abord, nous allons utiliser la bibliothèque requests pour envoyer des requêtes HTTP GET aux pages de produits. Nous allons également configurer les en-têtes de requête pour imiter une vraie requête de navigateur.


import requests

# Liste des URL de produits à récupérer
urls = [
    "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
    "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    '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',
}

# Bouclez chaque URL et envoyez une requête GET
pour url dans urls :
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # D'autres traitements seront ajoutés dans les étapes suivantes
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Etape 3. Extraction de données à l'aide de XPath et de lxml

À l'aide de lxml, nous allons extraire les points de données requis du code HTML analysé.

from lxml import html

# Liste de stockage des données extraites
scraped_data = []

# Bouclez chaque URL et envoyez une requête GET
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Analyse du contenu HTML avec lxml
        tree = html.fromstring(html_content)
        
        # Extraire des données à l'aide de XPath
        product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
        product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
        product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
        
        # Ajouter les données extraites à la liste
        scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Imprimer les données extraites
for item in scraped_data:
    print(item)

Etape 4. Traiter les problèmes potentiels

Les sites web mettent souvent en œuvre des mesures anti-bots. L'utilisation de proxys et la rotation des agents utilisateurs peuvent aider à éviter la détection.

Utilisation de proxies avec autorisation IP :


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)

Rotation des agents utilisateurs :


import random

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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # Ajouter d'autres agents utilisateurs si nécessaire
]

headers['user-agent'] = random.choice(user_agents)

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

Etape 5. Enregistrement des données dans un fichier CSV

Enfin, nous enregistrerons les données scrappées dans un fichier CSV en vue d'une analyse ultérieure.

import csv

csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Ecriture de données dans un fichier CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for item in scraped_data:
            writer.writerow(item)
    print(f"Data saved to {csv_file}")
except IOError:
    print(f"Error occurred while writing data to {csv_file}")

Code complet


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

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

# Liste des URL de produits à récupérer
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

# 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-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   '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',
}

# Liste des agents utilisateurs pour les demandes tournantes
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   # Ajouter d'autres agents utilisateurs si nécessaire
]


# Liste des mandataires pour les demandes de rotation
proxies = [
    {'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
    # Ajouter d'autres mandataires si nécessaire
]

# Liste de stockage des données extraites
scraped_data = []

# Bouclez chaque URL et envoyez une requête GET
for url in urls:
   # Choisir un agent utilisateur aléatoire pour les en-têtes de la requête
   headers['user-agent'] = random.choice(user_agents)
   # Choisir un proxy aléatoire pour la demande
   proxy = random.choice(proxies)

   # Envoyer une requête HTTP GET à l'URL avec les en-têtes et le proxy
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Stocker le contenu HTML de la réponse
       html_content = response.content
       # Analyse du contenu HTML avec lxml
       tree = html.fromstring(html_content)

       # Extraire des données à l'aide de XPath
       product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
       product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
       product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()

       # Ajouter les données extraites à la liste
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # Imprimer un message d'erreur si la demande échoue
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Configuration du fichier CSV
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Ecriture de données dans un fichier CSV
try:
   with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
       writer = csv.DictWriter(file, fieldnames=fieldnames)
       writer.writeheader()
       for item in scraped_data:
           writer.writerow(item)
   print(f"Data saved to {csv_file}")
except IOError:
   # Impression d'un message d'erreur en cas d'échec de l'écriture dans le fichier
   print(f"Error occurred while writing data to {csv_file}")

L'utilisation de Python pour extraire des données de sites de commerce électronique tels que Costco est une méthode efficace pour collecter des informations sur les produits afin de les analyser et de prendre des décisions stratégiques. L'utilisation correcte de bibliothèques telles que Requests et Lxml permet d'obtenir des processus d'extraction automatisés capables de traiter des contenus HTML sans oublier la mise en œuvre d'une API anti-bot efficace. Il convient de noter que les protocoles de scraping éthiques doivent toujours être respectés.

Commentaires:

0 Commentaires