Le scraping de texte : Un tutoriel étape par étape

Ce guide vous accompagne dans le scraping de texte avec Python, depuis la configuration jusqu’à l’archivage des données, tout en fournissant des conseils pratiques sur l’utilisation de proxys pour contourner les blocages d’IP.
15 min de lecture
Text scraping tutorial blog image

Le web scraping consiste à extraire des données directement à partir des pages web. Étant donné que les données peuvent se présenter sous diverses formes, le terme « text scraping » fait spécifiquement référence à l’extraction de données textuelles à partir de pages web.

Disposer d’un accès à une grande quantité de données pertinentes est essentiel pour prendre des décisions commerciales éclairées. L’extraction d’informations à partir des sites web de vos concurrents peut vous fournir des insights précieux sur leur stratégie commerciale, vous donnant ainsi un avantage concurrentiel. Dans ce tutoriel, vous vous apprendrez à créer un scraper de texte en Python, facilitant ainsi l’extraction et l’exploitation des données web.

Prérequis

Avant de commencer ce tutoriel, veuillez vous assurer que les prérequis suivants sont remplis :

  • La dernière version de Python et Pip installée sur votre machine.
  • Un environnement virtuel Python. Veillez à installer les paquets requis dans votre environnement virtuel, notamment requests pour récupérer le contenu HTML d’une page, BeautifulSoup pour analyser et extraire les données pertinentes du HTML, et pandas pour organiser et stocker les données extraites dans un format structuré, tel qu’un fichier CSV.

Pour obtenir plus d’informations afin de commencer le web scraping avec Python, vous pouvez consulter cet article.

Comprendre la structure du site web

Avant de commencer le scraping, il est crucial d’analyser la structure du site web cible. Les sites web utilisent le langage de balisage HTML, pour organiser et structurer la présentation du contenu.

Que ce soit un titre, un paragraphe ou un lien, chaque élément de contenu est encapsulé dans des balises HTML Ces balises vous permettent de repérer l’emplacement précis des données à extraire. Par exemple, dans ce cas, vous extrayez les citations du site fictif « Quotes to Scrape ». Pour visualiser la structure de ce site web, ouvrez-le dans votre navigateur, puis accédez aux Developer Tools en cliquant avec le bouton droit de la souris sur la page et en sélectionnant « Inspect » ou « Inspect Element ». Le code HTML de la page s’affiche :

Analyser l’élément dans un navigateur web

Prenez le temps d’analyser la structure du site en recherchant des balises telles que  <div><span><p>, and <a> , qui contiennent souvent le texte ou les liens que vous souhaitez extraire. Il est également important de noter que les balises incluent généralement un attribut class . Son objectif est de définir une classe spécifique pour l’élément HTML, ce qui facilite son stylisme avec CSS ou son ciblage avec JavaScript.

Remarque : L’attribut class est particulièrement utile pour le web scraping, car il permet de cibler des éléments spécifiques d’une page qui partagent le même style ou la même structure, facilitant ainsi l’extraction précise des données nécessaires.

Dans cet exemple, chaque citation est encapsulée dans un élément div ayant pour classe quote. Si vous souhaitez extraire à la fois le texte et l’auteur de chaque citation, le texte se trouve dans un élément div avec la classe text, tandis que l’auteur est situé dans un élément small portant la classe author:

Structure HTML d’une citation

Si vous n’êtes pas familier avec le HTML, nous vous recommandons de consulter cet article sur le web scraping en HTML pour approfondir vos connaissances.

Extraction de texte à partir d’un site web

Une fois la structure du site web comprise, l’étape suivante consiste à rédiger le code nécessaire pour extraire les citations du site Quotes to Scrape .

Python est un choix privilégié pour le web scraping en raison de sa simplicité d’utilisation et de la richesse de ses bibliothèques, telles que requests et BeautifulSoup.. Vous utilisez la bibliothèque requests pour récupérer le contenu HTML d’une page web. Cela est essentiel car vous devez d’abord obtenir les données brutes sous forme de HTML avant de pouvoir les analyser et en extraire les informations pertinentes. Une fois que vous avez récupéré le contenu HTML, vous pouvez le transformer en une structure plus facile à manipuler en utilisant BeautifulSoup.

Pour commencer, créez un fichier Python pour votre scaping de texte, en le nommant text-scraper.py. Ensuite, importez les bibliothèques BeautifulSoup et requests:

import requests
from bs4 import BeautifulSoup

Indiquez l’URL du site web à récupérer, puis envoyez une requête GET pour obtenir son contenu :

# URL of the quotes website
url = 'https://quotes.toscrape.com/'

# Send a GET request to the URL
response = requests.get(url)

Après l’envoi de la requête GET, vous recevrez le code HTML complet de la page demandée. Il est nécessaire d’analyser ce code HTML afin d’extraire uniquement les données pertinentes, telles que le texte et l’auteur de chaque citation dans ce cas précis. Pour ce faire, la première étape consiste à créer un objet BeautifulSoup pour analyser le HTML :

soup = BeautifulSoup(response.text, 'html.parser')

Cherchez tous les éléments div qui contiennent des citations, c’est-à-dire ceux ayant la classe quote :

quotes = soup.find_all('div', class_='quote')

Créez une liste pour stocker les citations extraites, comme suit :

data = []

Ensuite, extrayez le texte et l’auteur de chaque citation et stockez-les dans la liste data comme suit :

for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

Le script devrait avoir la structure suivante :

import requests
from bs4 import BeautifulSoup

# URL of the quotes website
url = 'http://quotes.toscrape.com/'

# Send a GET request to the URL
response = requests.get(url)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Find all quote containers
quotes = soup.find_all('div', class_='quote')

# Extract data from each quote
data = []
for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

print(data)

Vous pouvez maintenant exécuter le script depuis votre terminal :

# For Linux and macOS
python3 text-scraper.py

# For Windows
python text-scraper.py

Vous devriez voir s’afficher une liste des citations extraites, comme dans l’exemple ci-dessous :

[{'Author': 'Albert Einstein',
  'Text': '"The world as we have created it is a process of our thinking. It '
        'cannot be changed without changing our thinking."'},
 {'Author': 'J.K. Rowling',
  'Text': '"It is our choices, Harry, that show what we truly are, far more '
        'than our abilities."'},
 {'Author': 'Albert Einstein',
  'Text': '"There are only two ways to live your life. One is as though '
        'nothing is a miracle. The other is as though everything is a '
        'miracle."'},
 {'Author': 'Jane Austen',
  'Text': '"The person, be it gentleman or lady, who has not pleasure in a '
        'good novel, must be intolerably stupid."'},
 {'Author': 'Marilyn Monroe',
  'Text': ""Imperfection is beauty, madness is genius and it's better to be "
        'absolutely ridiculous than absolutely boring."'},
 {'Author': 'Albert Einstein',
  'Text': '"Try not to become a man of success. Rather become a man of '
        'value."'},
 {'Author': 'André Gide',
  'Text': '"It is better to be hated for what you are than to be loved for '
        'what you are not."'},
 {'Author': 'Thomas A. Edison',
  'Text': ""I have not failed. I've just found 10,000 ways that won't work.""},
 {'Author': 'Eleanor Roosevelt',
  'Text': '"A woman is like a tea bag; you never know how strong it is until '
        "it's in hot water.""},
 {'Author': 'Steve Martin',
  'Text': '"A day without sunshine is like, you know, night."'}]

Bien que ce scraping de texte semble relativement simple, vous pourriez rencontrer des obstacles tels que le blocage de l’IP si le site détecte trop de requêtes ou la présence de CAPTCHAs qui bloquent l’accès automatisé. Pour contourner ces problèmes, vous pouvez utiliser des proxies.

Utilisation de proxies pour un scraping de manière anonyme

Les proxies permettent de surmonter les restrictions liées aux blocages d’IP et aux CAPTCHA en modifiant fréquemment votre adresse IP, donnant ainsi l’apparence que les requêtes proviennent de diverses sources géographiques. Pour utiliser les proxys, vous devez configurer la méthode request.get() de manière à rediriger toutes les requêtes via un serveur proxy.

Dans ce cas, vous pouvez utiliser les proxies tournants de Bright Data, qui offrent un accès à plus de 72 millions d’adresses IP réparties dans plus de 195 pays. Pour commencer, créez un  compte gratuit sur Bright Data en cliquant sur Start Free Trial dans le coin supérieur. Ensuite, remplissez le formulaire d’inscription et cliquez sur Create Account :

Formulaire d’inscription de Bright Data

Configurer un proxy résidentiel de base

Une fois votre compte Bright Data créé, connectez-vous et accédez à la section Proxies & Scraping . Dans la section Proxy networks, trouvez Residential proxies et cliquez sur Get Started :

Tableau de bord Bright Data : Rubrique **Proxies & Scraping**

Vous serez invité à ajouter une nouvelle zone pour le proxy résidentiel. Maintenez les valeurs par défaut, attribuez un nom à la zone, puis cliquez sur Add :

Créez une nouvelle zone résidentielle de proxy

C’est tout ce qu’il faut pour créer une nouvelle zone de proxy résidentiel !

Pour utiliser le proxy, vous devrez obtenir vos informations d’identification (exemple : nom d’utilisateur, mot de passe et hôte). Pour obtenir ces informations d’identification, retournez dans la section Proxies & Scraping et sélectionnez la zone de proxy que vous venez de créer :

Liste des zones de proxy créées

En cliquant sur la zone de proxy, le panneau de configuration de cette zone s’affiche. Dans la section Authorization, vous verrez vos informations d’identification :

Identifiants de la zone proxy de Bright Data

Mise à jour du script de scraping

Dès que vous disposez de vos identifiants de proxy, vous pouvez passer à la configuration du proxy. Commencez par enregistrer vos identifiants dans des variables :

host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'

Ensuite, construisez une URL de proxy en utilisant les informations d’identification enregistrées :

proxy_url = f'http://{username}:{password}@{host}:{port}'

Créez une configuration de proxy pour gérer les requêtes HTTP et HTTPS :

proxies = {
    'http': proxy_url,
    'https': proxy_url
}

Intégrez ensuite la configuration du proxy dans l’appel actuel de requests.get() :

response = requests.get(url, proxies=proxies)

À ce stade, votre script devrait avoir la structure suivante :

import requests
from bs4 import BeautifulSoup

# BrightData credentials
host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'

# Compose a proxy URL
proxy_url = f'http://{username}:{password}@{host}:{port}'

# Create a proxy configuration
proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# URL of the quotes website
url = 'http://quotes.toscrape.com/'

# Send a GET request to the URL via the specified proxy
response = requests.get(url, proxies=proxies)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Find all quote containers
quotes = soup.find_all('div', class_='quote')

# Extract data from each quote
data = []
for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

print(data)

Lancer et tester le script

L’exécution de ce script donnera le même résultat que celui sans l’utilisation de proxy. La différence réside dans le fait que, grâce au proxy, le site web considère désormais que la requête provient d’une autre localisation, préservant ainsi votre adresse IP réelle et garantissant l’anonymat. Illustrons cela en élaborant un nouveau script simple.

Importez les bibliothèques requises et définissez  l’URL « http://lumtest.com/myip.json » dans le script :

import requests
from bs4 import BeautifulSoup

url = "http://lumtest.com/myip.json"

Envoyez une requête GET à l’URL sans utiliser de proxy, puis créez un objet BeautifulSoup pour analyser la réponse.

# Send a GET request to the URL
response = requests.get(url)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

Enfin, imprimez l’objet soup :

print(soup)

Exécutez ce script. En réponse, vous obtiendrez des informations sur votre adresse IP ainsi que sur votre localisation géographique.

Pour réaliser une comparaison, configurez la requête GET afin qu’elle passe par un proxy Bright Data, tout en laissant les autres paramètres inchangés :

# BrightData credentials
host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-hl_459f8bd4-zone-test_residential_proxy'
password = '8sdgouh1dq5h'

proxy_url = f'http://{username}:{password}@{host}:{port}'

proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# Send a GET request to the URL
response = requests.get(url, proxies=proxies)

Lorsque vous exécutez le script mis à jour, vous devriez constater que l’adresse IP retournée dans la réponse est différente. Il ne s’agit pas de votre adresse IP réelle, mais de celle du proxy que vous avez configuré. Vous masquez ainsi votre adresse IP en la substituant par celle d’un des serveurs proxy.

Conservation des données

Une fois les données extraites d’un site web, l’étape suivante consiste à les enregistrer dans un format structuré, afin de faciliter leur accès et leur analyse. Le format CSV est très populaire car il est largement compatible avec les outils d’analyse de données et les langages de programmation.

Pour enregistrer les données extraites dans un fichier CSV, commencez par importer les bibliothèques csv et pandas (en haut du script de scraping), car elles contiennent des méthodes permettant de convertir facilement les données au format CSV :

import pandas as pd

Ensuite, générez un objet pandas DataFrame à partir des données collectées :

df = pd.DataFrame(data)

Enfin, convertissez le DataFrame en fichier CSV et attribuez-lui un nom (par exemple quotes.csv) :

df.to_csv('quotes.csv', index=False)

Une fois ces modifications apportées, exécutez le script. Ensuite, les données extraites sont enregistrées dans le fichier CSV.

Dans cet exemple simple, les guillemets n’ont pas un rôle important à remplir. Cependant, selon les données que vous collectez, il existe de nombreuses méthodes pour les analyser et en extraire des informations pertinentes.

Vous pouvez commencer par explorer les statistiques descriptives en utilisant la fonction describe() de pandas. Cette fonction permet d’obtenir un aperçu rapide de vos données numériques, incluant des mesures telles que la moyenne, la médiane et l’écart-type. Vous pouvez visualiser vos données en utilisant Matplotlib ou Seaborn pour créer des histogrammes, des diagrammes de dispersion ou des diagrammes à barres, ce qui vous permettra d’identifier visuellement des schémas ou des tendances. Pour les données textuelles, des techniques de traitement du langage naturel, telles que l’analyse de la fréquence des mots ou l’analyse des sentiments, peuvent être appliquées afin d’identifier les thèmes dominants ou d’évaluer le sentiment général exprimé dans les avis ou commentaires.

Pour obtenir des informations plus approfondies, examinez les corrélations entre les différentes variables de votre ensemble de données. Par exemple, vous pouvez analyser la corrélation entre les évaluations des livres et la longueur des critiques, ou encore étudier les variations des notes en fonction du genre littéraire ou de l’auteur. Utilisez la fonction pandas groupby() pour agréger les données et comparer les mesures entre différentes catégories.

N’oubliez pas de tenir compte du contexte de vos données ainsi que des questions spécifiques que vous souhaitez explorer ou résoudre. Par exemple, si vous analysez des critiques de livres, vous pouvez identifier les facteurs qui influencent le plus l’attribution de bonnes notes ou encore étudier l’évolution des genres littéraires populaires au fil du temps. Restez toujours critique vis-à-vis de vos résultats et prenez en considération les biais potentiels dans votre méthode de collecte des données.

Conclusion

Dans ce tutoriel, vous avez appris à effectuer du web scraping avec Python, exploré les avantages de l’utilisation de proxies, et découvert comment les proxies rotatifs de Bright Data peuvent vous aider à contourner les blocages d’IP et à préserver votre anonymat.

Bien que créer vos propres solutions de scraping puisse être enrichissant, cela présente souvent des défis, tels que la maintenance du code, la gestion des CAPTCHA et le respect des politiques des sites web. C’est à ce niveau là que les API de scraping de données Bright Data peuvent s’avérer utiles Grâce à des fonctionnalités avancées telles que la résolution automatique des CAPTCHA, la rotation des adresses IP et une analyse de données optimisée, Bright Data simplifie le processus de scraping, vous permettant de vous concentrer sur l’analyse des données plutôt que sur la gestion de l’infrastructure.

Inscrivez-vous à l’essai gratuit de Bright Data pour découvrir comment cette plateforme peut optimiser vos projets de web scraping, en vous offrant des solutions de collecte de données fiables, évolutives et efficaces, adaptées à vos besoins professionnels.

Aucune carte de crédit requise