L'accès aux données des géants du commerce électronique comme Amazon est essentiel pour l'analyse du marché, les stratégies de tarification et la recherche de produits. Ces données peuvent être recueillies par le biais du "web scraping", une méthode qui consiste à extraire de grandes quantités d'informations des sites web. Cependant, Amazon protège rigoureusement ses données, ce qui rend les techniques de scraping traditionnelles souvent inefficaces. Dans ce guide complet, nous nous pencherons sur les méthodes de collecte des données produit d'Amazon et discuterons des stratégies permettant de contourner les systèmes anti-scraping robustes de la plateforme. Nous explorerons l'utilisation de Python, de proxies et de techniques de scraping avancées qui peuvent aider à surmonter ces défis et à récolter efficacement les données nécessaires à votre activité ou à vos recherches.
Pour réussir à extraire des données d'Amazon, vous pouvez suivre l'algorithme structuré décrit ci-dessous. Cette méthode vous permettra de récupérer les informations nécessaires de manière efficace et précise.
Étape 1: Envoi de requêtes HTTP aux pages de produits Amazon :
Étape 2: Analyse du contenu HTML :
Étape 3: Stockage des données :
Amazon emploie plusieurs mesures pour entraver les efforts de scraping, notamment des limitations de vitesse de connexion, l'intégration de CAPTCHA et le blocage d'IP. Les utilisateurs peuvent adopter des contre-mesures pour contourner ces obstacles, comme l'utilisation de proxys de haute qualité.
Pour les activités de scraping de grande envergure, des techniques Python avancées peuvent être employées pour récolter des quantités substantielles de données sur les produits. Ces techniques comprennent le bourrage d'en-tête et l'empreinte TLS, qui permettent d'échapper à la détection et d'assurer une extraction de données réussie.
Ces étapes sont expliquées dans les prochaines sections de l'article où l'on verra sa mise en œuvre pratique en utilisant Python 3.12.2.
Pour lancer un projet de scraping web, nous commencerons par mettre en place un scraper de base utilisant la bibliothèque lxml pour l'analyse HTML et la bibliothèque requests pour gérer les requêtes HTTP dirigées vers le serveur web d'Amazon.
Nous nous concentrerons sur l'extraction d'informations essentielles telles que les noms de produits, les prix et les évaluations à partir des pages de produits Amazon. Nous présenterons également des techniques permettant d'analyser efficacement le code HTML et de gérer les requêtes, afin de garantir une extraction précise et organisée des données.
Pour maintenir les dépendances du projet et éviter les conflits, il est conseillé de créer un environnement virtuel séparé pour cette entreprise de web scraping. Il est recommandé d'utiliser des outils tels que "venv" ou "pyenv" pour mettre en place des environnements virtuels.
Vous aurez besoin des bibliothèques Python tierces suivantes :
Utilisé pour envoyer des requêtes HTTP et récupérer du contenu web. Il est souvent utilisé pour le web scraping et l'interaction avec les API web.
Installation :
pip install requests
Une bibliothèque pour analyser et manipuler les documents XML et HTML. Elle est fréquemment utilisée pour le web scraping et pour travailler avec des données structurées provenant de pages web.
Installation :
pip install lxml
Ici, nous devons importer les bibliothèques requises pour que notre scraper fonctionne. Il s'agit de la bibliothèque request pour gérer les requêtes HTTP, de la bibliothèque CSV pour gérer les opérations sur les fichiers CSV, de la bibliothèque random pour générer des valeurs aléatoires et faire des choix aléatoires, de la bibliothèque lxml pour analyser le contenu HTML brut, et des bibliothèques Dict et List pour les indications de type.
import requests
import csv
import random
from lxml import html
from typing import Dict, List
L'extrait de code suivant lit un fichier CSV nommé amazon_product_urls.csv dont chaque ligne contient l'URL d'une page de produit Amazon. Le code itère sur les lignes, extrait les URL de chaque ligne et les ajoute à une liste appelée URL.
with open('amazon_product_urls.csv', 'r') as file:
reader = csv.DictReader(file)
for row in reader:
urls.append(row['url'])
Les en-têtes de requête jouent un rôle important dans les requêtes HTTP, en fournissant des informations complexes sur le client et la requête. Lors du scraping, il est important de copier les titres des utilisateurs autorisés afin d'éviter d'être détecté et d'accéder facilement aux informations souhaitées. En imitant les en-têtes couramment utilisés, les "scrapers" peuvent éviter les techniques de détection, ce qui garantit que les données sont extraites de manière cohérente tout en respectant les normes éthiques.
Les proxys servent d'intermédiaires dans le web scraping, en masquant l'adresse IP du scraper pour éviter la détection et le blocage du serveur. Un proxy rotatif vous permet d'envoyer chaque demande avec une nouvelle adresse IP afin d'éviter les blocages potentiels. L'utilisation de proxys résidentiels ou mobiles renforce la résistance aux mesures anti-scraping grâce à la détection de l'hôte et du fournisseur réels.
Code pour l'intégration des en-têtes de requête et des serveurs proxy avec l'autorisation de l'adresse IP :
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',
'sec-ch-ua': '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
proxies = {'http': '', 'https': ''}
Ici, nous allons créer une liste de collections d'agents utilisateurs, à partir de laquelle un agent utilisateur aléatoire sera choisi pour chaque requête. La mise en œuvre d'un mécanisme de rotation des en-têtes, tel que la rotation de l'agent utilisateur après chaque demande, peut contribuer à contourner les mesures de détection des robots.
useragents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
"Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
]
headers['user-agent'] = random.choice(useragnets)
Envoie une requête HTTP GET à une URL spécifiée avec des en-têtes personnalisés, un délai d'attente de 30 secondes et des serveurs mandataires spécifiés pour la requête.
response = requests.get(url=url, headers=headers, proxies=proxies, timeout=30)
Points de données requis : titre, prix et classement. Maintenant, inspectons et identifions les XPath correspondants pour les éléments montrés dans les captures d'écran avec leurs points de données respectifs.
La capture d'écran ci-dessous montre l'utilisation de la fonction "Inspect" de Chrome DevTools pour trouver le XPath `//span[@id="productTitle"]/text()` afin d'extraire le titre du produit d'une page de produit Amazon.
La capture d'écran suivante montre comment trouver le XPath `//div[@id="corePrice_feature_div"]/div/div/span/span/text()` pour extraire le prix d'un produit à partir d'une page de produit Amazon.
La capture d'écran montre la recherche respective de l'XPath `//span[@id="acrPopover"]/@title'` pour extraire les évaluations d'un produit à partir d'une page de produit Amazon.
Créez un dictionnaire qui fournit des expressions XPath pour extraire des informations spécifiques d'une page web : le titre, les notes et le prix d'un produit.
xpath_queries = {'title': '//span[@id="productTitle"]/text()', 'ratings': '//span[@id="acrPopover"]/@title', 'price': '//span[@class="a-offscreen"]/text()'}
Le code ci-dessous analyse le contenu HTML obtenu à partir de la requête GET adressée au serveur Amazon dans un format structuré sous forme d'arbre, ce qui facilite la navigation et la manipulation de ses éléments et attributs.
tree = html.fromstring(response.text)
L'extrait de code suivant extrait des données de l'arbre HTML analysé à l'aide d'une requête XPath et les affecte à un dictionnaire avec une clé spécifiée. strip() est utilisé pour supprimer les espaces au début et à la fin, le cas échéant. Il récupère le premier résultat de la requête XPath et le stocke sous la clé donnée dans le dictionnaire extracted_data.
data = tree.xpath(xpath_query)[0].strip()
extracted_data[key] = data
Le code suivant écrit les données du dictionnaire extracted_data dans un fichier CSV appelé product_data.csv. Assurez-vous que la ligne d'en-tête n'est écrite que si le fichier est vide. Si le fichier n'est pas vide, il ajoute les données en tant que ligne supplémentaire au fichier CSV. Cette fonction permet de mettre à jour en permanence le fichier CSV avec les nouvelles données extraites sans écraser le texte existant.
csv_file_path = 'product_data.csv'
fieldnames = ['title', 'ratings', 'price']
with open(csv_file_path, 'a', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if csvfile.tell() == 0:
writer.writeheader()
writer.writerow(extracted_data)
Veuillez vous référer à notre code complet, qui vous aidera à démarrer rapidement. Le code est bien structuré et documenté, ce qui le rend convivial pour les débutants. Pour exécuter ce code, l'utilisateur doit disposer d'un fichier CSV appelé "amazon_product_urls" dans le même répertoire. Vous trouverez ci-dessous la structure du fichier CSV :
import requests
import csv
import random
from lxml import html
from typing import Dict, List
def send_requests(
url: str, headers: Dict[str, str], proxies: Dict[str, str]
) -> List[Dict[str, str]]:
"""
Envoie des requêtes HTTP GET à plusieurs URL avec des en-têtes et des proxies.
Args:
urls (str): URL à laquelle envoyer les demandes.
headers (Dict[str, str]): Dictionnaire contenant les en-têtes de la demande.
proxies (Dict[str, str]): Dictionnaire contenant les paramètres du proxy.
Returns:
Response: Objet de réponse contenant les données de réponse pour chaque URL.
"""
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
# Validation de la réponse
if len(response.text)> 10000:
return response
return None
except Exception as e:
print(f"Error occurred while fetching URL {url}: {str(e)}")
def extract_data_from_html(
response, xpath_queries: Dict[str, str]
) -> Dict[str, List[str]]:
"""
Extrait des données du contenu HTML à l'aide de requêtes XPath.
Args:
response (Response): Objet de la réponse.
xpath_queries (Dict[str, str]): Dictionnaire contenant des requêtes XPath pour l'extraction de données.
Returns:
Dict[str, str]: Dictionnaire contenant les données extraites pour chaque requête XPath.
"""
extracted_data = {}
tree = html.fromstring(response.text)
for key, xpath_query in xpath_queries.items():
data = tree.xpath(xpath_query)[0].strip()
extracted_data[key] = data
return extracted_data
def save_to_csv(extracted_data: Dict[str, any]):
"""
Enregistre un dictionnaire sous forme de ligne dans un fichier CSV à l'aide de DictWriter.
Args:
extracted_data (Dict[str, any]): Dictionnaire représentant une ligne de données.
"""
csv_file_path = "product_data.csv"
fieldnames = ["title", "ratings", "price"]
with open(csv_file_path, "a", newline="") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if csvfile.tell() == 0:
writer.writeheader() # Écrire l'en-tête seulement si le fichier est vide
writer.writerow(extracted_data)
def main():
# Lecture des URL à partir d'un fichier CSV
urls = []
with open("amazon_product_urls.csv", "r") as file:
reader = csv.DictReader(file)
for row in reader:
urls.append(row["url"])
# Définition des en-têtes de la requête
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",
"sec-ch-ua": '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"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/123.0.0.0 Safari/537.36",
}
useragents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
"Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
]
# Définition des mandataires
proxies = {"http": "IP:Port", "https": "IP:Port"}
# Envoi de requêtes à des URL
for url in urls:
# rotation de l'agent utilisateur dans les en-têtes
headers["user-agent"] = random.choice(useragnets)
response = send_requests(url, headers, proxies)
if response:
# Extraction de données à partir du contenu HTML
xpath_queries = {
"title": '//span[@id="productTitle"]/text()',
"ratings": '//span[@id="acrPopover"]/@title',
"price": '//span[@class="a-offscreen"]/text()',
}
extracted_data = extract_data_from_html(response, xpath_queries)
# Enregistrement des données extraites dans un fichier CSV
save_to_csv(extracted_data)
if __name__ == "__main__":
main()
Différentes solutions de proxy, y compris des proxys IPv4 de centre de données, des proxys mobiles rotatifs, des proxys de FAI et des proxys résidentiels, sont disponibles pour une extraction ininterrompue des données. Une logique de rotation et des agents utilisateurs appropriés sont utilisés pour simuler le comportement réel de l'utilisateur, tandis que des proxys spéciaux prennent en charge le scraping à grande échelle avec une rotation interne et des pools d'IP étendus. Il est essentiel de comprendre les avantages et les inconvénients de chaque option de proxy pour assurer une extraction de données ininterrompue.
Type | Pour | Contre |
---|---|---|
Proxies pour centres de données |
Vitesse et performance élevées. Rentabilité. Idéal pour les demandes de gros volumes. |
Peut être facilement détecté et mis sur liste noire. Pas fiable contre les systèmes anti-scraping ou anti-bot. |
Procurations résidentielles |
Forte légitimité grâce à des adresses IP résidentielles réelles. Disponibilité d'un grand nombre d'adresses IP à l'échelle mondiale pour l'extraction de données spécifiques à un lieu. Capacités de rotation des adresses IP. |
Plus cher que les proxys des centres de données. |
Proxies mobiles |
Des adresses IP tout à fait légitimes. Efficace pour éviter les blocages et les invites de vérification. |
Plus coûteux que les autres types de mandataires. Plus lent que les proxys de centre de données en raison de la dépendance à l'égard du réseau mobile. |
Proxies ISP |
IP très fiables. Plus rapide que les IP résidentielles. |
Disponibilité limitée des adresses IP. Rotation d'IP non disponible. |
L'extraction de données sur les produits d'Amazon nécessite une préparation méticuleuse afin de contourner efficacement les mécanismes anti-scraping de la plateforme. L'utilisation de serveurs proxy avec Python permet un traitement efficace des données et une extraction ciblée des informations nécessaires. Lors de la sélection des serveurs mandataires pour le web scraping, il est essentiel de prendre en compte des facteurs tels que les performances, le coût, la fiabilité du serveur et les exigences spécifiques de votre projet. L'utilisation de proxys dynamiques et la mise en œuvre de stratégies visant à contrecarrer les mesures de sécurité peuvent minimiser le risque d'être bloqué et améliorer l'efficacité globale du processus de scraping.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commentaires: 0