Le web scraping est un moyen puissant d'extraire des données de sites web à des fins diverses, telles que l'analyse, la recherche et l'intelligence dans les affaires. Ce tutoriel vous aide à extraire des informations sur les produits Walmart en Python en mettant l'accent sur les stratégies et les techniques clés. Le scraping Walmart présente un exemple où nous pouvons extraire des détails de produits comme le nom, le prix ou les commentaires trouvés sur différentes pages des sites Walmart.
Ce guide utilise la bibliothèque requests pour effectuer des requêtes HTTP et la bibliothèque lxml pour analyser le contenu HTML.
Avant de commencer, assurez-vous que Python est installé sur votre machine. Vous pouvez installer les bibliothèques nécessaires à l'aide de pip :
pip install requests
pip install lxml
pip install urllib3
Ensuite, importons les bibliothèques nécessaires :
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Liste des URL de produits Walmart à récupérer.
product_urls = [
'link with https',
'link with https',
'link with https'
]
Pour gratter un site web, il est très important d'utiliser les bons en-têtes, notamment l'en-tête User-Agent, afin d'imiter une requête provenant d'un véritable navigateur. De plus, on peut éviter d'être limité par les mesures anti-bots mises en place par les propriétaires de sites en utilisant des serveurs proxy rotatifs. Vous trouverez ci-dessous des exemples de chaînes User-Agent ainsi qu'une description de la manière d'intégrer des serveurs proxy qui requièrent une autorisation basée sur l'adresse 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>',
]
Définissez des en-têtes pour imiter les demandes du navigateur et éviter d'être détecté.
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',
}
Créer une liste vide pour stocker les détails du produit.
product_details = []
Le processus d'énumération des pages URL se déroule comme suit : Pour chaque page URL, une requête GET est envoyée en utilisant un User-Agent et un proxy choisis au hasard. À la réception de la réponse HTML, celle-ci est analysée pour en extraire des détails tels que le nom du produit, le prix et les commentaires. Les données extraites sont stockées dans un dictionnaire, qui est ensuite ajouté à une liste créée précédemment.
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:
# Envoyer une requête HTTP GET à l'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}')
# Analyse du contenu HTML à l'aide de lxml
parser = html.fromstring(response.text)
# Extraire le titre du produit
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Prix des produits d'extraction
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# Extraire les détails de l'examen
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Stocker les informations extraites dans un dictionnaire
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Ajouter les détails du produit à la liste
product_details.append(product_detail)
Titre:
Prix:
Détail de la révision:
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)
Voici le code complet avec des commentaires pour vous aider à mieux le comprendre :
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()
# Liste des URL de produits à récupérer
product_urls = [
'link with https',
'link with https',
'link with https'
]
# Chaînes d'agent utilisateur aléatoires pour l'anonymat
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'
]
# Liste de proxy pour la rotation d'IP
proxy = [
'<ip>:<port>',
'<ip>:<port>',
'<ip>:<port>',
]
# En-têtes pour imiter les requêtes du navigateur
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',
}
# Initialisation d'une liste vide pour stocker les détails du produit
product_details = []
# Bouclez l'URL de chaque produit
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:
# Envoyer une requête HTTP GET à l'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}')
# Analyser le contenu HTML à l'aide de lxml
parser = html.fromstring(response.text)
# Extraire le titre du produit
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Prix des produits d'extraction
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# Extraire les détails de l'examen
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Stocker les informations extraites dans un dictionnaire
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Ajouter les détails du produit à la liste
product_details.append(product_detail)
# Enregistrer les données extraites dans un fichier 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)
Notre tutoriel montre comment utiliser les bibliothèques Python pour récupérer des données sur les produits de Walmart et les enregistrer au format CSV en vue d'une analyse ultérieure. Le script fourni est fondamental et offre une base qui peut être améliorée pour accroître l'efficacité du processus de récupération. Les améliorations pourraient inclure l'introduction de délais aléatoires entre les requêtes pour imiter les modèles de navigation humaine, la mise en œuvre d'une rotation de l'agent utilisateur et du proxy pour éviter la détection, et le développement d'un système robuste de traitement des erreurs pour gérer les interruptions ou les échecs potentiels du scraping.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commentaires: 0