Guida allo scraping dei dati Walmart con Python

Commenti: 0

Il web scraping è un modo potente per estrarre dati dai siti web per scopi diversi, come l'analisi, la ricerca e l'intelligence negli affari. Questo tutorial vi aiuta a scrapare le informazioni sui prodotti Walmart in Python, concentrandosi sulle strategie e sulle tecniche principali. Lo scraping di Walmart presenta un esempio in cui è possibile estrarre dettagli di prodotti come il nome, il prezzo o le recensioni presenti in varie pagine del sito di Walmart.

Questa guida utilizza la libreria requests per effettuare richieste HTTP e la libreria lxml per analizzare il contenuto HTML.

Impostazione dell'ambiente

Prima di iniziare, assicurarsi di avere Python installato sulla propria macchina. È possibile installare le librerie necessarie utilizzando pip:

pip install requests
pip install  lxml
pip install urllib3

Quindi, importiamo le librerie necessarie:

  • requests: per effettuare richieste HTTP per recuperare pagine web;
  • lxml: per l'analisi del contenuto HTML;
  • csv: per scrivere i dati estratti in un file CSV;
  • random: per selezionare proxy e stringhe User-Agent casuali.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Definire gli URL dei prodotti

Elenco degli URL dei prodotti Walmart da raschiare.

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

Stringhe e proxy dell'utente-agente

Per effettuare lo scraping di un sito web, è molto importante utilizzare le intestazioni giuste, in particolare l'intestazione User-Agent, in modo da imitare una richiesta proveniente da un browser reale. Inoltre, si può evitare di essere limitati dalle misure anti-bot messe in atto dai proprietari dei siti utilizzando server proxy ruotabili. Di seguito sono riportati esempi di stringhe User-Agent e una descrizione di come integrare i server proxy che richiedono l'autorizzazione in base all'indirizzo 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>',
]

Headers per le richieste

Impostare le intestazioni per imitare le richieste del browser ed evitare il rilevamento.

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

Iniziare la memorizzazione dei dati

Creare un elenco vuoto per memorizzare i dettagli del prodotto.

product_details = []

Il processo di enumerazione delle pagine URL funziona come segue: Per ogni pagina URL, viene inviata una richiesta GET utilizzando un User-Agent e un proxy scelti a caso. Una volta ricevuta la risposta HTML, questa viene analizzata per estrarre dettagli come il nome del prodotto, il prezzo e le recensioni. I dati estratti vengono memorizzati in un dizionario, che viene successivamente aggiunto a un elenco creato in precedenza.

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:
       # Inviare una richiesta HTTP GET all'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}')

   # Analizzare il contenuto HTML utilizzando lxml
   parser = html.fromstring(response.text)
   # Estrarre il titolo del prodotto
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Prezzo del prodotto estratto
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Dettagli della recensione dell'estratto
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Memorizzare i dettagli estratti in un dizionario
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Aggiungere i dettagli del prodotto all'elenco
   product_details.append(product_detail)

Titolo:

1.png

Prezzo:

2.png

Dettaglio della recensione:

3.png

Salvare i dati in CSV

  1. Apre un nuovo file CSV per la scrittura.
  2. Definire i nomi dei campi (colonne) per il file CSV.
  3. Creare un oggetto csv.DictWriter per scrivere i dizionari nel file CSV.
  4. Scrivere la riga di intestazione nel file CSV.
  5. Correre l'elenco product_details e scrivere ogni dizionario di prodotto come riga nel file 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)

Codice completo:

Ecco il codice completo con i commenti per aiutarvi a comprenderlo meglio:

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


# Elenco degli URL dei prodotti da analizzare
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Stringhe User-Agent randomizzate per l'anonimato
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'
]

# Elenco proxy per la rotazione IP
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Intestazioni per imitare le richieste del browser
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',
}

# Inizializzare un elenco vuoto per memorizzare i dettagli dei prodotti
product_details = []

# Eseguire un ciclo per ogni URL di prodotto
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:
       # Inviare una richiesta HTTP GET all'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}')

   # Analizzare il contenuto HTML utilizzando lxml
   parser = html.fromstring(response.text)
   # Estrarre il titolo del prodotto
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Prezzo del prodotto estratto
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Dettagli della recensione dell'estratto
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Memorizzare i dettagli estratti in un dizionario
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Aggiungere i dettagli del prodotto all'elenco
   product_details.append(product_detail)

# Scrivere i dati estratti in un file 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)

Il nostro tutorial mostra come utilizzare le librerie Python per effettuare lo scraping dei dati dei prodotti da Walmart e salvarli in formato CSV per la successiva analisi. Lo script fornito è fondamentale e offre una base che può essere migliorata per aumentare l'efficienza del processo di scraping. I miglioramenti potrebbero includere l'introduzione di ritardi casuali tra le richieste per imitare i modelli di navigazione umana, l'implementazione della rotazione degli User-Agent e dei proxy per evitare il rilevamento e lo sviluppo di un robusto sistema di gestione degli errori per gestire potenziali interruzioni o fallimenti dello scraping.

Commenti:

0 Commenti