fr
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
भारतीय
Türkçe
한국인
Italiano
Indonesia
Polski Python s'impose comme le meilleur choix pour le web scraping en raison de ses bibliothèques robustes et de sa syntaxe simple. Dans ce tutoriel sur le web scraping en Python, nous explorerons les principes fondamentaux de l'extraction de données et nous vous guiderons dans la configuration de votre environnement Python pour créer votre premier scraper web. Nous vous présenterons les principales bibliothèques adaptées aux tâches de scraping, notamment Beautiful Soup, Playwright et lxml.
Il existe de nombreuses bibliothèques Python pour le web scraping qui simplifient le processus. Voici quelques-unes des plus populaires:
Dans des scénarios orientés contenu multimédia, YouTube proxy peut être utile lorsque l’accès aux pages dépend de la région ou du réseau. Si vous vous demandez comment récupérer un site web à l'aide de Python, il faut d'abord comprendre le fonctionnement des requêtes HTTP.
HTTP (HyperText Transfer Protocol) est un protocole de couche d'application pour le transfert de données sur le web. Vous tapez une URL dans le navigateur, qui génère une requête HTTP et l'envoie au serveur web. Le serveur renvoie la réponse au navigateur, qui la restitue sous la forme d'une page web. Pour le web scraping, vous devez imiter ce processus et générer des requêtes HTTP à partir de votre script afin d'obtenir le contenu des pages web de manière programmatique. Pour obtenir des pages et des prix comme un utilisateur local, un proxy France aide à récupérer le contenu tel qu’il est affiché depuis la France.
Tout d'abord, assurez-vous que Python est installé sur votre système. Vous pouvez le télécharger sur le site officiel de Python.
Un environnement virtuel permet de gérer les dépendances. Ces commandes permettent de créer et d'activer un environnement virtuel:
python -m venv scraping_env
source scraping_env/bin/activate
Ensuite, installez les paquets nécessaires à l'aide des commandes suivantes :
pip install requests
pip install beautifulsoup4
pip install lxml
Commençons par un simple web scraper utilisant la requête pour scraper du contenu HTML statique.
Le type de requête HTTP le plus courant est la requête GET, qui est utilisée pour récupérer des données à partir d'une URL spécifiée. Voici un exemple de base de l'exécution d'une requête GET à l'adresse http://example.com.
import requests
url = 'http://example.com'
response = requests.get(url)
Le même principe s’applique aux services web, par exemple proxy Whatsapp, lorsque l’accès est limité par le réseau et que vous devez récupérer des données via des requêtes.
La bibliothèque requests propose plusieurs façons de gérer et de traiter la réponse :
Vérifier le code d'état : s'assurer que la demande a abouti.
if response.status_code == 200:
print('Request was successful!')
else:
print('Request failed with status code:', response.status_code)
Extraction du contenu : extraire le texte ou le contenu JSON de la réponse.
# Obtenir le contenu de la réponse sous forme de texte
page_content = response.text
print(page_content)
# Obtenir le contenu de la réponse au format JSON (si la réponse est au format JSON)
json_content = response.json()
print(json_content)
Les erreurs HTTP et réseau peuvent survenir lorsqu'une ressource n'est pas accessible, qu'une requête a dépassé le temps imparti ou que le serveur renvoie un statut HTTP d'erreur (par exemple, 404 Not Found, 500 Internal Server Error). Nous pouvons utiliser les objets d'exception soulevés par les requêtes pour gérer ces situations.
import requests
url = 'http://example.com'
try:
response = requests.get(url, timeout=10) # Set a timeout for the request
response.raise_for_status() # Raises an HTTPError for bad responses
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except requests.exceptions.ConnectionError:
print('Failed to connect to the server.')
except requests.exceptions.Timeout:
print('The request timed out.')
except requests.exceptions.RequestException as req_err:
print(f'Request error: {req_err}')
else:
print('Request was successful!')
Pour des sessions longues et des requêtes répétées, les ISP proxies sont souvent préférables, car ils offrent une adresse IP stable et des connexions plus prévisibles.
Pour le web scraping, nous avons souvent besoin d'extraire des données du contenu HTML. Cette partie explique comment localiser et extraire des données à partir d'éléments HTML à l'aide de bibliothèques telles que Beautiful Soup ou lxml.
HTML (HyperText Markup Language) est le langage de balisage standard pour la création de pages web. Il se compose d'éléments imbriqués représentés par des balises, telles que <div>, <p>, <a>, etc. Chaque balise peut avoir des attributs et contenir du texte, d'autres balises ou les deux.
Les sélecteurs XPath et CSS offrent un moyen polyvalent de sélectionner des éléments HTML en fonction de leurs attributs ou de leur position dans le document.
Lors du web scraping, l'extraction de données spécifiques à partir de pages web nécessite souvent d'identifier les bons sélecteurs XPath ou CSS pour cibler les éléments HTML. Voici comment trouver ces sélecteurs de manière efficace :
La plupart des navigateurs modernes sont dotés d'outils de développement intégrés qui vous permettent d'inspecter la structure HTML des pages web. Voici un guide étape par étape sur la manière d'utiliser ces outils :
Pour le scraping de réseaux sociaux, un Facebook proxy peut aider à limiter les restrictions liées à l’adresse IP lors de requêtes fréquentes.
XPath: /html/body/div/h1
CSS Selector: body > div > h1
Beautiful Soup est une bibliothèque Python pour l'analyse des documents HTML et XML. Elle fournit des méthodes et des attributs simples pour naviguer et rechercher dans la structure HTML.
from bs4 import BeautifulSoup
import requests
# URL de la page web à récupérer
url = 'https://example.com'
# Envoyer une requête HTTP GET à l'URL
response = requests.get(url)
# Analyser le contenu HTML de la réponse à l'aide de Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')
# Utilisez le sélecteur CSS pour trouver toutes les balises <h1> qui se trouvent à l'intérieur des balises <div> # qui sont des enfants directs de la balise <body>
# qui sont des enfants directs de la balise <body>.
h1_tags = soup.select('body > div > h1')
# Itérer sur la liste des balises <h1> ; trouvées et imprimer leur contenu textuel
for tag in h1_tags:
print(tag.text)
Comme Beautiful Soup, lxml vous permet d'attraper et de gérer les problèmes de manière élégante en utilisant des exceptions telles que lxml.etree.XMLSyntaxError.
Le "code de scraping web Python" fourni effectue une extraction de données sur une page de produit Amazon à l'aide de Playwright et de lxml. Il met en place un proxy et lance un navigateur, navigue jusqu'à la page du produit, interagit avec les éléments, attend le chargement complet de la page et capture la source de la page. Si vous avez besoin d’une rotation plus « mobile-like », un 4g proxy peut être utilisé dans cette configuration de navigateur.
Ce contenu est analysé à l'aide de lxml pour créer un arbre d'éléments, et XPath est utilisé pour extraire le titre du produit. Le script gère les cas où l'élément n'est pas trouvé ou si l'analyse échoue. Après l'extraction, il ferme correctement la session du navigateur.
from bs4 import BeautifulSoup
import requests
# URL de la page web à récupérer
url = 'https://example.com'
# Envoyer une requête HTTP GET à l'URL
response = requests.get(url)
try:
# Analyser le contenu HTML de la réponse à l'aide de Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')
# Utilisez le sélecteur CSS pour trouver toutes les balises <h1> qui se trouvent à l'intérieur des balises <div> # qui sont des enfants directs de la balise <body>
# qui sont des enfants directs de la balise <body>.
h1_tags = soup.select('body > div > h1')
# Itérer sur la liste des balises <h1> ; trouvées et imprimer leur contenu textuel
for tag in h1_tags:
print(tag.text)
except AttributeError as attr_err:
# Gérer les cas où une erreur AttributeError pourrait se produire (par exemple, si le contenu de la réponse est None).
print(f'Attribute error occurred: {attr_err}')
except Exception as parse_err:
# Gérer toute autre exception pouvant survenir au cours de l'analyse syntaxique
print(f'Error while parsing HTML: {parse_err}')
Une autre bibliothèque populaire pour l'analyse de contenu est lxml. Bien que BeautifulSoup soit convivial, lxml est plus rapide et plus flexible, ce qui en fait la bibliothèque idéale pour les tâches critiques en termes de performances.
from lxml.html import fromstring
import requests
# URL de la page web à récupérer
url = 'https://example.com'
# Envoyer une requête HTTP GET à l'URL
response = requests.get(url)
# Analyse le contenu HTML de la réponse à l'aide de la méthode fromstring de lxml
parser = fromstring(response.text)
# Utilisez XPath pour trouver le contenu textuel de la première balise <h1>
# qui se trouve à l'intérieur d'une balise <div>, qui est un enfant direct de la balise <body>.
title = parser.xpath('/html/body/div/h1/text()')[0]
# Imprimer le titre
print(title)
Similaire à Beautiful Soup, lxml vous permet de gérer les erreurs d'analyse de manière élégante en attrapant des exceptions comme lxml.etree.XMLSyntaxError.
from lxml.html import fromstring
from lxml import etree
import requests
# URL de la page web à récupérer
url = 'https://example.com'
# Envoyer une requête HTTP GET à l'URL
response = requests.get(url)
try:
# Analyse le contenu HTML de la réponse à l'aide de la méthode fromstring de lxml
parser = fromstring(response.text)
# Utilisez XPath pour trouver le contenu textuel de la première balise <h1>
# qui se trouve à l'intérieur d'une balise <div>, qui est un enfant direct de la balise <body>.
title = parser.xpath('/html/body/div/h1/text()')[0]
# Imprimer le titre
print(title)
except IndexError:
# Gérer le cas où la requête XPath ne renvoie aucun résultat
print('No <h1> tag found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Traiter les erreurs de syntaxe XML lors de l'analyse syntaxique
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Gérer les autres exceptions
print(f'An unexpected error occurred: {e}')
Une fois que vous avez réussi à extraire des données, l'étape suivante consiste à les enregistrer. Python propose plusieurs options pour enregistrer les données extraites, notamment dans des fichiers CSV, des fichiers JSON et des bases de données. Voici un aperçu de la manière d'enregistrer les données extraites à l'aide de différents formats:
CSV (Comma-Separated Values) est un format simple et largement utilisé pour stocker des données tabulaires. Le module CSV de Python permet d'écrire facilement des données dans des fichiers CSV.
import csv
# Exemple de données
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Enregistrer les données dans un fichier CSV
with open('scraped_data.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Paragraph'])
for paragraph in data['paragraphs']:
writer.writerow([data['title'], paragraph])
print('Data saved to scraped_data.csv')
JSON (JavaScript Object Notation) est un format d'échange de données léger, facile à lire et à écrire. Le module JSON de Python fournit des méthodes pour enregistrer des données au format JSON.
import json
# Exemple de données
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Enregistrer les données dans un fichier JSON
with open('scraped_data.json', mode='w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
print('Data saved to scraped_data.json')
Playwright est un outil puissant qui permet de récupérer du contenu dynamique et d'interagir avec des éléments Web. Il peut prendre en charge des sites web à forte composante JavaScript, ce que les analyseurs HTML statiques ne peuvent pas faire.
Installez Playwright et configurez-le :
pip install playwright
playwright install
Playwright vous permet d'interagir avec des éléments Web comme remplir des formulaires et cliquer sur des boutons. Il peut attendre que les requêtes AJAX soient terminées avant de poursuivre, ce qui le rend idéal pour l'extraction de contenu dynamique.
Le code de scraping web Python fourni effectue l'extraction de données sur une page de produit Amazon à l'aide de Playwright et de lxml. Au départ, les modules nécessaires sont importés. Une fonction d'exécution est définie pour encapsuler la logique d'extraction. La fonction commence par mettre en place un serveur proxy et lance une nouvelle instance de navigateur avec le proxy et en mode sans tête, ce qui nous permet d'observer les actions du navigateur. Dans le contexte du navigateur, une nouvelle page est ouverte et navigue jusqu'à l'URL du produit Amazon spécifié, avec un délai de 60 secondes pour garantir le chargement complet de la page.
Le script interagit ensuite avec la page pour sélectionner un style de produit spécifique à partir d'un menu déroulant et une option de produit en utilisant des localisateurs et des correspondances de texte. Une fois ces interactions terminées et la page entièrement chargée, le contenu de la page est capturé.
Ce contenu est ensuite analysé à l'aide de la méthode fromstring de lxml pour créer un arbre d'éléments. Une requête XPath est utilisée pour extraire le contenu textuel du titre du produit à partir d'un élément spécifique avec l'ID productTitle. Le script est conçu pour gérer les situations dans lesquelles la requête XPath peut ne pas renvoyer de résultats, lorsque des problèmes de syntaxe XML surviennent pendant l'analyse, ou lorsque quelque chose d'autre ne fonctionne pas de manière inattendue. Au final, le titre du produit extrait avec lxml est imprimé, et le contexte du navigateur ainsi que le navigateur lui-même sont correctement fermés pour terminer la session.
La fonction run est exécutée dans une session Playwright démarrée par sync_playwright, ce qui garantit que l'ensemble du processus est géré et exécuté dans un environnement contrôlé. Cette structure garantit la robustesse et la résistance aux erreurs lors de l'exécution de la tâche d'exploration du web.
from playwright.sync_api import Playwright, sync_playwright
from lxml.html import fromstring, etree
def run(playwright: Playwright) -> None:
# Définir le serveur proxy
proxy = {"server": "https://IP:PORT", "username": "LOGIN", "password": "PASSWORD"}
# Lancer une nouvelle instance de navigateur avec le proxy spécifié et en mode sans tête.
browser = playwright.chromium.launch(
headless=False,
proxy=proxy,
slow_mo=50,
args=['--ignore-certificate-errors'],
)
# Créer un nouveau contexte de navigation
context = browser.new_context(ignore_https_errors=True)
# Ouvrir une nouvelle page dans le contexte du navigateur
page = context.new_page()
# Naviguer vers la page produit Amazon spécifiée
page.goto(
"https://www.amazon.com/A315-24P-R7VH-Display-Quad-Core-Processor-Graphics/dp/B0BS4BP8FB/",
timeout=10000,
)
# Attendre le chargement complet de la page
page.wait_for_load_state("load")
# Sélectionnez un style de produit spécifique dans le menu déroulant
page.locator("#dropdown_selected_style_name").click()
# Sélectionner une option de produit spécifique
page.click('//*[@id="native_dropdown_selected_style_name_1"]')
page.wait_for_load_state("load")
# Obtenir le contenu HTML de la page chargée
html_content = page.content()
try:
# Analyse du contenu HTML à l'aide de la méthode fromstring de lxml
parser = fromstring(html_content)
# Utiliser XPath pour extraire le contenu textuel du titre du produit
product_title = parser.xpath('//span[@id="productTitle"]/text()')[0].strip()
# Imprimer le titre du produit extrait
print({"Product Title": product_title})
except IndexError:
# Gérer le cas où la requête XPath ne renvoie aucun résultat
print('Product title not found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Traiter les erreurs de syntaxe XML lors de l'analyse syntaxique
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Gérer les autres exceptions
print(f'An unexpected error occurred: {e}')
# Fermer le contexte du navigateur et le navigateur
context.close()
browser.close()
# Utilisez sync_playwright pour démarrer la session Playwright et exécuter le script.
with sync_playwright() as playwright:
run(playwright)
Le web scraping avec Python est une méthode puissante pour récolter des données sur les sites web. Les outils présentés facilitent l'extraction, le traitement et le stockage des données web à des fins diverses. Dans ce processus, l'utilisation de proxies pour alterner les adresses IP et la mise en place de délais entre les requêtes sont essentiels pour contourner les blocages. Beautiful Soup est convivial pour les débutants, tandis que lxml est adapté au traitement de grands ensembles de données grâce à son efficacité. Pour des besoins de scraping plus avancés, en particulier avec des sites web JavaScript chargés dynamiquement, Playwright s'avère très efficace.
Lorsque les sites filtrent fortement la réputation des IP, un proxy residentiel peut réduire les blocages en utilisant des adresses associées à des réseaux domestiques.
Ce tutoriel Python sur le web scraping présente des méthodes pratiques pour l'extraction automatisée de données à l'aide de bibliothèques telles que Beautiful Soup, lxml et Playwright. En termes techniques, qu'est-ce que le web scraping? Python fait référence à l'utilisation d'outils basés sur Python pour récupérer et traiter systématiquement des données structurées à partir de sites web.
Que vous travailliez avec du contenu statique ou des pages rendues en JavaScript, il existe un outil Python pour ce travail. En apprenant les requêtes HTTP, en maîtrisant l'analyse syntaxique et en comprenant l'extraction de données, vous êtes prêt à construire des scrapers fiables.
Au fur et à mesure que vous progressez, n'oubliez pas de suivre des pratiques de scraping éthiques: respectez le fichier robots.txt, évitez de surcharger les serveurs et manipulez toujours les données de manière responsable. Avec une base solide en place, vous pouvez maintenant commencer en toute confiance à développer vos propres projets de scraping et libérer tout le potentiel des données web.
Commentaires: 0