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

Commentaires: 0

La recherche de données sur les produits dans le commerce électronique est utile pour effectuer des analyses concurrentielles, surveiller les prix et réaliser des études de marché. Le scraping de données à partir de pages de produits peut être réalisé de manière pratique à l'aide de Python. Ce tutoriel sur le scraping dans le commerce électronique vous montrera comment récolter des informations en utilisant une combinaison de requêtes et de lxml à partir de boutiques en ligne.

La récupération de pages web pour le commerce électronique consiste à obtenir des informations sur les produits, telles que le titre, le prix ou le numéro d'identification, à partir de boutiques en ligne. Les nombreuses bibliothèques disponibles en Python rendent cette opération non seulement facile, mais aussi assez efficace. Dans cet article, nous nous concentrerons sur le web scraping de sites de commerce électronique à l'aide de Python. Le site web de Costco sera notre objet.

Écriture d'un script pour la collecte de données sur le commerce électronique

Pour commencer, assurons-nous que nous disposons de tous les outils ou bibliothèques Python de scraping de commerce électronique dont nous aurons besoin pour ce script:


pip install requests
pip install lxml

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

Étape 1. Comprendre la structure HTML du site web

Pour commencer à construire un scraper de produits de commerce électronique, vous devez d'abord comprendre comment une page web donnée est structurée. Allez sur le site web et ouvrez la page sur laquelle vous souhaitez recueillir des informations, puis inspectez les éléments requis (par exemple, le nom du produit, ses caractéristiques, la marque, etc.)

Étape 2. Envoi de requêtes HTTP

Tout d'abord, nous allons importer la bibliothèque requests pour envoyer des GET en particulier pour les pages de produits. Nous allons également configurer les en-têtes de requête pour qu'ils ressemblent à une 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
for url in 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}")

Étape 3. Extraction des données à l'aide de XPath et de lxml

Avec lxml, nous extrairons les informations souhaitées du html. C'est crucial lorsqu'il s'agit de récupérer des données sur le commerce électronique.


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)

Étape 4. Traiter les problèmes potentiels

Lorsque nous essayons de récupérer un site de commerce électronique avec Python, nous devons comprendre que la plupart des sites Web disposent d'une forme de logiciel anti-bot. L'utilisation de proxies et d'agents utilisateurs rotatifs peut contribuer à atténuer leurs soupçons.

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)

Étape 5. Enregistrement des données dans un fichier CSV

Au final, les données extraites seront stockées au format CSV afin que je puisse les analyser ultérieurement dans le cadre d'un processus de scraping de données de commerce électronique plus avancé.


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

Voici la version finale du script pour le scraping de données ecommerce efficace. Vous pouvez le copier et le coller pour l'utiliser facilement.


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"
]

# headers
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}")

Le scraper de commerce électronique Python est maintenant complet.

Récupération de données pour le commerce électronique: Réflexions finales

L'utilisation d'un scraper web pour la boutique en ligne de Costco montre à quel point Python peut être efficace pour obtenir des données sur les produits à des fins d'analyse et de prise de décisions commerciales optimales. Avec les bons scripts et bibliothèques Requests et Lxml pour fournir des extracteurs automatisés, il est possible de gratter le site sans aucune interruption du flux de travail causée par une API anti-bot. Enfin, il est essentiel de toujours se conformer aux règles éthiques lors de l'exécution d'une opération de web scraping pour le commerce électronique.

Commentaires:

0 Commentaires