Come effettuare lo scraping di siti web di e-commerce con Python

Commenti: 0

Per l'analisi della concorrenza, il monitoraggio dei prezzi e le ricerche di mercato è importante effettuare lo scraping dei dati dei prodotti dai siti web di e-commerce. È possibile utilizzare Python per effettuare lo scraping dei dati dalle pagine dei prodotti in modo efficiente. In questa guida dimostreremo come raschiare le informazioni sui prodotti dai negozi online utilizzando una combinazione di richieste e lxml.

Lo scraping del commercio elettronico comporta l'estrazione di dettagli sui prodotti, come nomi, prezzi e ID, dai negozi online. Python, con le sue versatili librerie, rende questo compito efficiente e semplice. In questa guida, faremo lo scraping di informazioni sui prodotti dal sito web di Costco.

Scrivere uno script per estrarre i dati dei prodotti

Prima di immergersi nel processo di scraping, assicuratevi di avere installato le librerie Python necessarie:

pip install requests
pip install lxml

Ci concentreremo sull'estrazione di nomi di prodotti, caratteristiche di prodotti e marchi di prodotti da specifiche pagine di prodotti sul sito web.

Fase 1. Comprendere la struttura HTML del sito

Per estrarre dati da qualsiasi sito web, è necessario comprendere la struttura della pagina web. Aprite la pagina di un sito web e ispezionate gli elementi che volete estrarre (ad esempio, il nome del prodotto, il marchio delle caratteristiche, ecc.)

Fase 2. Invio di richieste HTTP

Per prima cosa, utilizzeremo la libreria requests per inviare richieste HTTP GET alle pagine dei prodotti. Imposteremo anche le intestazioni della richiesta per imitare una vera richiesta del browser.


import requests

# Elenco degli URL dei prodotti da analizzare
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',
}

# Eseguire il loop di ogni URL e inviare una richiesta GET
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # Ulteriori elaborazioni saranno aggiunte nelle fasi successive
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Fase 3. Estrazione dei dati con XPath e lxml

Utilizzando lxml, estrarremo i dati richiesti dall'HTML analizzato.

from lxml import html

# Elenco per memorizzare i dati di scraping
scraped_data = []

# Eseguire il loop di ogni URL e inviare una richiesta GET
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Analizzare il contenuto HTML con lxml
        tree = html.fromstring(html_content)
        
        # Estrarre i dati con 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()
        
        # Aggiungere i dati estratti all'elenco
        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}")

# Stampare i dati scraped
for item in scraped_data:
    print(item)

Fase 4. Affrontare i problemi potenziali

I siti web spesso implementano misure anti-bot. L'uso di proxy e la rotazione degli user agent possono aiutare a evitare il rilevamento.

Utilizzo di proxy con autorizzazione IP:


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

Agenti utente rotanti:


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',
    # Aggiungere altri agenti utente se necessario
]

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

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

Fase 5. Salvataggio dei dati in un file CSV

Infine, salveremo i dati scraped in un file CSV per ulteriori analisi.

import csv

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

# Scrittura dei dati in un file 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}")

Codice completo


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()

# Elenco degli URL dei prodotti da analizzare
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

# intestazioni
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',
}

# Elenco degli agenti utente per la rotazione delle richieste
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',
   # Aggiungere altri agenti utente se necessario
]


# Elenco dei proxy per le richieste a rotazione
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'},
    # Aggiungere altri proxy se necessario
]

# Elenco per memorizzare i dati di scraping
scraped_data = []

# Eseguire il loop di ogni URL e inviare una richiesta GET
for url in urls:
   # Scegliere un agente utente casuale per le intestazioni delle richieste
   headers['user-agent'] = random.choice(user_agents)
   # Scegliere un proxy casuale per la richiesta
   proxy = random.choice(proxies)

   # Inviare la richiesta HTTP GET all'URL con intestazioni e proxy
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Memorizzare il contenuto HTML della risposta
       html_content = response.content
       # Analizzare il contenuto HTML con lxml
       tree = html.fromstring(html_content)

       # Estrarre i dati con 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()

       # Aggiungere i dati estratti all'elenco
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # Stampa del messaggio di errore se la richiesta fallisce
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Impostazione del file CSV
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Scrittura dei dati in un file 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:
   # Stampa un messaggio di errore se la scrittura sul file non riesce
   print(f"Error occurred while writing data to {csv_file}")

L'uso di Python per lo scraping da siti di e-commerce come Costco è un metodo efficace per raccogliere informazioni sui prodotti e analizzarle, oltre che per prendere decisioni strategiche. Il corretto utilizzo di librerie come Requests e Lxml consente di ottenere processi di estrazione automatizzati in grado di gestire i contenuti HTML senza dimenticare l'implementazione di API anti-bot. Va notato che i protocolli di scraping etico devono essere sempre seguiti.

Commenti:

0 Commenti