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.
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:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Elenco degli URL dei prodotti Walmart da raschiare.
product_urls = [
'link with https',
'link with https',
'link with https'
]
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>',
]
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',
}
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:
Prezzo:
Dettaglio della recensione:
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commenti: 0