Retour au blog
Guides
Raluca PenciucLast updated on Apr 28, 202617 min read

Web Scraping avec Python : Le guide ultime pour construire votre scraper

Web Scraping avec Python : Le guide ultime pour construire votre scraper

Si, au XXe siècle, nous étions imprégnés de la mentalité « le temps, c'est de l'argent », aujourd'hui, tout tourne autour des données. Plus de données signifie plus d'informations, donc de meilleures décisions et plus d'argent.

Le web scraping et les web scrapers ont connu un essor considérable au cours de la dernière décennie. De plus en plus d’entreprises ont besoin d’une stratégie marketing précise, ce qui implique de collecter de grandes quantités d’informations en peu de temps.

Avec l'intérêt croissant pour l'extraction de données, les entreprises commencent à voir comment elles peuvent en tirer profit. Pour les développeurs, cela peut être un bon moyen de dynamiser leur activité ou simplement un projet intéressant pour perfectionner leurs compétences en codage.

Même si votre travail n'a rien à voir avec le web scraping, mais que vous faites partie d'une équipe Python, à la fin de cet article, vous découvrirez un nouveau créneau où vous pourrez mettre vos compétences à profit. Nous verrons comment créer notre propre outil de web scraping avec Python.

Comprendre le web scraping avec Python

Mais tout d'abord, qu'est-ce que le web scraping ? À la base, un web scraper extrait les données d'un site web, étant donné que tous ne proposent pas leurs données via une API publique.

Ce processus est plus utile qu'il n'y paraît si l'on considère que plus vous disposez d'informations, meilleures seront les décisions que vous prendrez pour votre entreprise.

De nos jours, les sites web contiennent de plus en plus de contenu, il n’est donc pas du tout judicieux d’effectuer ce processus entièrement à la main. C’est là qu’intervient la création d’un outil automatisé de scraping.

« À quoi me servent ces données ? », vous demandez-vous peut-être. Eh bien, examinons quelques-uns des principaux cas d'utilisation où le web scraping est une véritable bouée de sauvetage :

  • Veille tarifaire : une entreprise de commerce électronique aura besoin d’informations sur les prix de ses concurrents pour prendre de meilleures décisions en matière de tarification et de marketing.
  • Études de marché : l'analyse de marché requiert des informations de haute qualité, en grande quantité et pertinentes.
  • Immobilier : les particuliers ou les entreprises ont besoin de regrouper des offres provenant de multiples sources.
  • Génération de prospects : trouver des clients pour votre entreprise en pleine croissance.
  • Surveillance de la marque : les entreprises analysent les forums, les réseaux sociaux et les avis pour suivre la perception de leur marque.
  • La surveillance du prix minimum annoncé (PMA) garantit que les prix en ligne d'une marque correspondent à sa politique tarifaire.
  • Apprentissage automatique : les développeurs doivent fournir des données d'entraînement pour que leurs solutions basées sur l'IA fonctionnent correctement.

Vous trouverez d'autres cas d'utilisation et une description plus détaillée de ceux-ci ici.

« Super, c'est parti ! », direz-vous peut-être. Pas si vite.

Même si vous comprenez comment fonctionne le web scraping et comment il peut améliorer votre activité, il n’est pas si facile de créer un outil de web scraping. Pour commencer, certaines personnes ne veulent pas de scraper sur leurs sites web pour différentes raisons.

L'une d'entre elles est que le scraping implique l'envoi de nombreuses requêtes en une seconde, ce qui peut surcharger le serveur. Les propriétaires de sites web peuvent parfois considérer cela comme une attaque de pirates informatiques (déni de service), c'est pourquoi les sites web adoptent des mesures pour se protéger en bloquant les robots.

Voici quelques-unes de ces mesures :

  • Le blocage d'IP : cela se produit lorsqu'un site web détecte un nombre élevé de requêtes provenant de la même adresse IP ; le site web peut vous interdire totalement l'accès ou ralentir considérablement votre connexion.
  • CAPTCHA (tests de Turing publics entièrement automatisés pour distinguer les ordinateurs des humains) : il s'agit de problèmes logiques assez simples à résoudre pour les humains, mais qui constituent un casse-tête pour les scrapers.
  • Honeypot : liens intégrés invisibles pour les humains mais visibles pour les robots ; une fois qu'ils tombent dans le piège, le site web bloque leur adresse IP.
  • Connexion requise : les sites web peuvent cacher certaines informations dont vous avez besoin derrière une page de connexion ; même si vous vous authentifiez sur le site, le scraper n'a pas accès à vos identifiants ni aux cookies de votre navigateur.

Certains sites web n'utilisent peut-être pas ces techniques, mais le simple fait qu'ils souhaitent offrir une meilleure expérience utilisateur grâce à Javascript complique la tâche des scrapers.

Lorsqu'un site web utilise JavaScript ou un framework de génération HTML, une partie du contenu n'est accessible qu'après certaines interactions avec le site ou après l'exécution d'un script (généralement écrit en JavaScript) qui génère le document HTML.

Considérons également la qualité des données extraites. Par exemple, sur un site de commerce électronique, vous pouvez voir des prix différents selon la région où vous vivez. Ces données ne sont pas très précises, le bot doit donc trouver un moyen de les extraire avec la plus grande précision possible.

Même si vous parvenez à surmonter tous ces obstacles, vous devez également tenir compte du fait que la structure d'un site web peut toujours subir des modifications. Après tout, un site web doit être convivial pour les utilisateurs, pas pour les bots, et notre outil automatisé doit donc s'adapter à ces changements.

Dans cette guerre sans fin du scraping, les bots trouvent eux-mêmes des solutions. Leur objectif commun est de reproduire au mieux le comportement humain sur Internet.

Par exemple, vous pouvez éviter le blocage d'IP en utilisant des services de proxy IP. Il est préférable d'utiliser des services payants, car les services gratuits rendent leurs adresses IP publiques, ce qui peut amener un site web à les bloquer.

Vous pouvez également intégrer des solveurs de CAPTCHA. Ils vous aideront à obtenir des flux de données continus, mais ralentiront légèrement le processus de scraping.

Pour contourner les pièges de type « honeypot », vous pouvez utiliser XPath (ou même des expressions régulières si vous êtes assez audacieux) pour extraire des éléments spécifiques plutôt que l'intégralité du document HTML.

Prendre en compte tous ces problèmes et trouver des solutions pour les surmonter peut s'avérer fastidieux et chronophage. C'est pourquoi, au cours de la dernière décennie, les API de web scraping ont suscité de plus en plus d'intérêt.

Ici, sur WebScrapingAPI, nous collectons le contenu HTML de n'importe quel site web, en gérant tous les défis possibles (comme ceux mentionnés plus haut). De plus, nous utilisons Amazon Web Services, donc la vitesse et l'évolutivité ne posent aucun problème. Vous avez envie d'essayer ? Vous pouvez commencer avec un compte gratuit, qui vous offre 1 000 appels API par mois. Génial, non ?

Comprendre le Web

Mais revenons-en maintenant à l'objet de cet article. Nous voulons apprendre à créer un scraper web à l'aide de Python.

Le premier concept à connaître est le protocole HTTP (Hypertext Transfer Protocol), qui régit la communication entre un serveur et un client. Le principe est assez simple. Le client (l'application) envoie un message (une requête HTTP) au serveur, et le serveur renvoie une réponse.

Le message contient plusieurs informations qui décrivent le client et la manière dont il va traiter les données : la méthode, la version HTTP et les en-têtes.

En web scraping, la méthode la plus utilisée pour une requête HTTP est GET. Cela signifie que vous allez récupérer les données que vous demandez. Si vous souhaitez en savoir plus à ce sujet, vous trouverez ici une liste complète et détaillée.

Les en-têtes contiennent des informations supplémentaires sur la requête ou la réponse HTTP. Nous aborderons les plus pertinents pour le web scraping, mais vous pouvez consulter la liste complète.

  • User-Agent : utilisé pour identifier l'application, le système d'exploitation, le logiciel et sa version ; un web scraper utilise cet en-tête pour rendre les requêtes plus réalistes.
  • Cookie : contient des informations d'état concernant la requête (par exemple, le jeton d'authentification).
  • Host : spécifie le nom de domaine du serveur et, éventuellement, le numéro de port sur lequel le serveur est à l'écoute.
  • Referrer : contient le site d'origine de l'utilisateur ; en fonction de cela, le contenu affiché peut varier, un web scraper doit donc également en tenir compte.
  • Accept : indique au serveur quel type de contenu peut être renvoyé en réponse ; cet en-tête est souvent négligé dans le web scraping, bien qu'il puisse permettre une communication plus fluide entre le client et le serveur.

Comprendre Python

Python est un langage de programmation polyvalent et de haut niveau qui parvient à rester dans les préférences des développeurs pour plusieurs raisons :

  • Code lisible : sa syntaxe simple en fait un choix idéal pour les débutants.
  • Paradigmes de programmation : la programmation orientée objet, structurée, fonctionnelle et orientée aspect ne sont que quelques exemples.
  • Bibliothèque standard robuste : large gamme de modules pour tous les besoins
  • Une communauté active : de nombreuses bibliothèques et outils open source

Bon, cela étant dit, préparons notre environnement de travail. Tout d'abord, nous avons besoin de Python 3. Vous pouvez le télécharger et l'installer à partir d'ici.

Ce tutoriel est indépendant de l'IDE, vous pouvez donc choisir celui qui vous convient le mieux. Nous préférons Visual Studio Code car il est léger et disponible pour plusieurs langages.

Nous allons également utiliser plusieurs bibliothèques Python :

  • requests : pour effectuer une requête HTTP
  • beautifulsoup : pour analyser le document HTML
  • selenium : pour extraire du contenu dynamique
  • nltk (facultatif) : pour traiter le langage naturel

Vous n'avez pas besoin de toutes les installer à l'avance, car vous trouverez plus de détails et des instructions d'installation à chaque étape.

Maintenant, commençons à extraire des données sur le Web !

Créer votre propre outil de scraping

Pour vous faciliter la tâche, ce tutoriel sera divisé en étapes. Vous verrez également des étapes supplémentaires marquées d'un .1 après le numéro. Il s'agit d'alternatives qui pourraient vous intéresser.

Étape 1 : Inspectez la page que vous souhaitez scraper

Bon, assez bavardé, passons aux choses sérieuses.

Tout d'abord, nous devons choisir un site Web à scraper. Afin d'illustrer les principes, choisissons un site Web éducatif simple : https://en.wikipedia.org/wiki/Beer.

À cette étape, nous voulons simplement examiner le document HTML de la page pour avoir une idée générale de sa structure. Peu importe le navigateur ou le système d'exploitation que vous utilisez à cette étape ; le processus est le même. Faites un clic droit n'importe où, sur une image, un lien ou un simple bloc de texte, puis choisissez l'option « Inspecter l'élément ».

L'onglet « Éléments » est le seul qui nous intéresse. Selon le site web, vous verrez s'afficher une grande quantité de code HTML. Il est important de ne pas se laisser submerger par cette quantité, mais de ne vérifier que les données qui vous intéressent.

Étape 2 : Envoyer une requête HTTP

Nous pouvons maintenant commencer à écrire le code de notre scraper web. Nous commençons simplement par envoyer une requête HTTP à notre site web pour récupérer le code HTML complet que nous venons de voir dans le navigateur. À quoi cela ressemblerait-il en code ? Eh bien, c'est génial ! Après tout, nous parlons de Python.

Installons la bibliothèque requests pour effectuer la requête HTTP :

pip install requests

Écrivons maintenant le code :

import requests
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)

Assez simple, non ? Nous avons importé la bibliothèque que nous avons installée plus tôt. Nous avons ensuite défini l'URL du site web que nous voulons scraper, puis nous avons envoyé une requête GET. Si vous voulez voir le résultat, n'hésitez pas à l'afficher. Pour l'instant, vous ne verrez qu'une chaîne de caractères désordonnée censée représenter le code HTML que vous avez vu dans votre navigateur. Cela ne nous aide pas beaucoup, nous devons donc la traiter.

Étape 3 : Extraire le code HTML de la page

Pour extraire des informations utiles de notre résultat, nous allons installer la bibliothèque BeautifulSoup :

pip install beautifulsoup4

Commençons par mettre en forme notre résultat :

import requests
from bs4 import BeautifulSoup
 
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)
 
soup = BeautifulSoup(page.content, 'html.parser')
prettyHTML = soup.prettify()
print(prettyHTML)

Nous convertissons le résultat précédent en un objet BeautifulSoup. Grâce à l'attribut .content, vous pouvez accéder aux données HTML. En appliquant la méthode .prettify(), vous pouvez voir le même format que celui que vous aviez vu précédemment dans votre navigateur.

Malheureusement, tous les sites web ne vous fourniront pas leur code HTML complet de cette manière. Comme indiqué précédemment, les scrapers web rencontrent certaines difficultés.

Étape 3.1 : Contenu dynamique

Par exemple, certaines pages ne sont visibles qu'après connexion. Même si vous vous authentifiez depuis votre navigateur, votre script Python ne pourra pas accéder aux données.

Une autre situation courante concerne les sites web dynamiques. Cela signifie que la réponse à la requête GET n'est pas un document HTML, mais un script JavaScript. Même si vous pouvez voir le code HTML dans le navigateur, c'est parce que le script s'exécute. Mais dans votre code, vous devez exécuter le script localement pour obtenir le code HTML.

Mais voyons cette situation en pratique. Nous allons choisir un exemple minimaliste de site web rapidement construit, tiré d'un ancien exercice universitaire : https://dynamic-website.surge.sh.

Vous pouvez voir le code HTML complet dans votre navigateur. Dans cet exemple, il s'agit d'un tableau contenant des images dans ses cellules.

import requests
from bs4 import BeautifulSoup
 
URL = 'https://dynamic-website.surge.sh'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

Extrayons maintenant ce code HTML. Pour cela, nous allons exécuter le même code que précédemment, avec quelques modifications : nous avons mis à jour l'URL et ouvert un fichier texte pour stocker notre résultat. Nous exécutons le programme et vérifions le fichier page.txt pour trouver la même section de tableau.

Qu'est-ce que c'est ? Où est le tableau ? Eh bien, il est là, sauf que personne ne l'a encore généré. Vous pouvez consulter la balise <head> du document HTML pour voir si des scripts sont utilisés :

Et oui, nous utilisons bien un script.

Pour résoudre ce problème, nous avons besoin de Selenium, une bibliothèque utilisée pour les tests web et l'automatisation des activités du navigateur. Nous l'utiliserons en mode headless, ce qui signifie qu'il se comportera comme un navigateur classique qui exécutera le code JavaScript, mais sans interface utilisateur visible.

pip install selenium

Dans ce tutoriel, nous utiliserons ChromeDriver pour configurer le pilote Web pour Selenium. N'oubliez pas de noter le chemin d'accès où vous l'avez téléchargé ! Nous l'avons enregistré dans le répertoire C, mais n'importe quel emplacement fera l'affaire.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
 
CHROMEDRIVER_PATH = "your/path/here/chromedriver_win32/chromedriver"
URL = "https://dynamic-website.surge.sh"
 
options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, options=options)
 
driver.get(URL)
soup = BeautifulSoup(driver.page_source, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

Le reste du processus est pratiquement identique, sauf que nous n'utilisons plus la bibliothèque requests pour effectuer la requête HTTP.

Nous relançons le programme, et…

... Et voilà ! Nous disposons désormais du code HTML complet.

Étape 4 : Extraire des sections spécifiques

Bon, revenons à nos moutons.

Disposer du code HTML complet est un excellent progrès, mais le processus n'est pas terminé. La plupart du temps, nous avons besoin d'informations spécifiques provenant d'un site web, voyons donc comment les extraire.

Commençons par quelque chose de simple : le titre du site web. Vous le trouverez dans la section <head> du code HTML, sous une balise &lt;title>.

Nous savons qu’un site web n’a qu’un seul titre, nous allons donc utiliser la méthode .find(). Elle prend le nom de la balise en entrée et renvoie l’élément HTML ; si vous avez besoin de son contenu, il vous suffit d’y accéder via l’attribut .text. Nous allons également ajouter un peu de structure à notre petit scraper.

def extract_title(soup):
    title = soup.find('title')
 
    #output: <title>Beer - Wikipedia</title>    
    print('Title element: ', title)
 
    #output: Beer - Wikipedia
    print('Title: ', title.text)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_title(soup)
 
main()

Rien de sorcier ici. BeautifulSoup est une bibliothèque puissante qui prend en charge divers modèles d’extraction de données spécifiques. Vous pouvez récupérer des éléments HTML par leur nom, leur identifiant et leur attribut de classe, ou même utiliser des sélecteurs CSS. Les possibilités sont infinies !

Allons plus loin, par exemple en extrayant les éléments qui apparaissent plusieurs fois. Dans ce cas, nous utilisons la méthode .find_all(). La seule différence est qu’elle renvoie une liste d’éléments au lieu d’un seul. C’est pourquoi, ensuite, nous parcourons cette liste et affichons les attributs de chaque élément. À titre d’exemple, nous avons extrait toutes les images de l’article :

def extract_images(soup):
    images = soup.find_all('img')
    for image in images:
        imageAlt = image.get('alt')
        imageSrc = image.get('src')
        print("ALT: ", imageAlt, "SRC: ", imageSrc)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_images(soup)
 
main()

Étape 5 : Passer des fonctions pendant le scraping

Une situation courante en web scraping est celle où la liste des résultats d'analyse est très longue et contient des informations hétérogènes.

Par exemple, vous avez peut-être remarqué que nos images précédentes peuvent contenir ou non un attribut alt.

Ou imaginez que nous extrayions tous les liens de l'article. Nous savons tous qu'un article Wikipédia contient BEAUCOUP de liens, et nous ne souhaitons peut-être pas en obtenir la liste complète. Le résultat comprendra des liens externes et internes, des références et des citations ; nous devons donc les classer en plusieurs catégories.

Pour résoudre ce problème, nous allons utiliser une fonction lambda. En gros, la fonction lambda prendra comme paramètre chaque élément de la liste de résultats et appliquera la condition que nous définissons, tout comme si nous utilisions un filtre.

À titre d'exemple pratique, supposons que nous devions extraire tous les liens internes, accéder à leur article et en faire un résumé. Étant donné que l'un des cas d'utilisation de Python est l'intelligence artificielle, cet exemple pourrait constituer une excellente application pour obtenir des données d'entraînement.

Tout d'abord, nous devrons installer la bibliothèque NLTK, car le calcul d'un résumé implique le traitement du langage humain.

pip install -U nltk

Et, bien sûr, l'importer dans notre code :

import re
import nltk
import heapq
# need to download only for the first execution
# warning: the size of the dataset is big; hence it will take time
nltk.download()

Remarque : si vous utilisez macOS, vous risquez d’obtenir une erreur « SSL : certificate verify failed ». Cela peut être dû au fait que Python 3.6 utilise une version intégrée d’OpenSSL. Il vous suffit d’ouvrir le répertoire où vous avez installé Python et d’exécuter ce fichier :

/Your/Path/Here/Python 3.6/Install Certificates.command

Comme vous pouvez le voir, nous avons également importé la bibliothèque re, utilisée pour les opérations avec les expressions régulières, et heapq, une implémentation de la file d’attente heap.

Parfait, nous avons tout ce qu'il faut pour commencer à écrire le code. Commençons par extraire les liens internes. Si vous retournez dans le navigateur, vous remarquerez plusieurs choses concernant les éléments qui nous intéressent.

Ces éléments sont les suivants :

  • L'attribut href a une valeur ;
  • La valeur de l'attribut href commence par « /wiki/ » ;
  • Le parent du lien est une balise ;

Ces caractéristiques nous aideront à distinguer les liens dont nous avons besoin de tous les autres.

Maintenant que nous savons comment trouver les liens, voyons comment les extraire.

count = 0
 
def can_do_summary(tag):
    global count
    if count > 10: return False
 
    # Reject if parent is not a paragraph
    if not tag.parent.name == 'p': return False
 
    href = tag.get('href')
    # Reject if href is not set
    if href is None: return False
 
    # Reject is href value does not start with /wiki/
    if not href.startswith('/wiki/'): return False
 
    compute_summary(href)
    return True
 
 
def extract_links(soup):
    soup.find_all(lambda tag: tag.name == 'a' and can_do_summary(tag))
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_links(soup)
 
main()

Bon, que s’est-il passé ici ? En examinant la fonction extract_links(), nous pouvons voir qu’au lieu du nom d’une balise, nous avons passé une fonction lambda en paramètre à la méthode .find_all(). Cela signifie que nous ne sélectionnons que celles qui correspondent à notre condition parmi toutes les balises du document HTML.

Comme vous pouvez le voir, la condition d’une balise est d’être un lien et d’être acceptée par la fonction can_do_summary() définie ci-dessus. À cet endroit, nous rejetons tout ce qui ne correspond pas aux caractéristiques observées précédemment. De plus, nous avons utilisé une variable globale pour limiter le nombre de liens extraits à 10. Si vous avez besoin de tous les liens, n’hésitez pas à supprimer la variable count.

Enfin, nous appelons la fonction compute_summary() pour le lien nouvellement trouvé. C'est là que l'article est résumé.

def compute_summary(href):
    global count
    full_link = 'https://en.wikipedia.org' + href
    page = requests.get(full_link)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    # Concatenate article paragraphs
    paragraphs = soup.find_all('p')
    article_text = ""
    for p in paragraphs:
        article_text += p.text
 
    # Removing Square Bracket, extra spaces, special characters and digits
    article_text = re.sub(r'\[[0-9]*\]', ' ', article_text)
    article_text = re.sub(r'\s+', ' ', article_text)
    formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text)
    formatted_article_text = re.sub(r'\s+', ' ', formatted_article_text)
 
    # Converting text to sentences
    sentence_list = nltk.sent_tokenize(article_text)
 
    # Find frequency of occurrence of each word
    stopwords = nltk.corpus.stopwords.words('english')
 
    word_frequencies = {}
    for word in nltk.word_tokenize(formatted_article_text):
        if word not in stopwords:
            if word not in word_frequencies.keys():
                word_frequencies[word] = 1
            else:
                word_frequencies[word] += 1
 
    maximum_frequency = max(word_frequencies.values())
 
    for word in word_frequencies.keys():
        word_frequencies[word] = (word_frequencies[word] / maximum_frequency)
 
    # Calculate the score of each sentence
    sentence_scores = {}
    for sent in sentence_list:
        for word in nltk.word_tokenize(sent.lower()):
            if word in word_frequencies.keys():
                if len(sent.split(' ')) < 30:
                    if sent not in sentence_scores.keys():
                        sentence_scores[sent] = word_frequencies[word]
                    else:
                        sentence_scores[sent] += word_frequencies[word]
 
    # Pick top 7 sentences with highest score
    summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)
    summary = '\n'.join(summary_sentences)
    count += 1

En résumé, nous effectuons une requête HTTP vers la nouvelle URL et convertissons le résultat en un objet BeautifulSoup, comme nous l’avons fait au début de l’article.

Pour calculer un résumé, nous extrayons tous les paragraphes de l'article et les concaténons. Ensuite, nous supprimons tous les caractères spéciaux susceptibles d'interférer avec les calculs.

En termes simples, un résumé est établi en calculant les mots les plus fréquents et en attribuant à chaque phrase un score basé sur la fréquence de ses mots. À la fin, nous sélectionnons les 7 phrases ayant le score le plus élevé.

Ce n'est pas le sujet de notre article, mais vous pouvez en savoir plus ici si vous êtes curieux ou même passionné par le traitement du langage naturel.

Étape 6 : Générer un fichier CSV pour stocker vos données

Passons à la dernière étape de ce guide : nous devons examiner les résultats du scraping. Jusqu'à présent, nous les avons simplement affichés dans le terminal, car il n'y avait que quelques lignes de données.

Mais dans la réalité, le scraping implique une quantité considérable d'informations, nous devons donc voir comment enregistrer les résultats dans un fichier.

Utilisons la bibliothèque native csv (il n'est donc pas nécessaire d'installer quoi que ce soit d'autre) et ouvrons un fichier nommé summaries.csv.

import csv
summaries_file = open('summaries.csv', mode='a', encoding='utf-8')

La bibliothèque créera le fichier s'il n'existe pas. De plus, nous l'ouvrons en mode « append » car chaque lien est traité séquentiellement, un par un.

    summaries_writer = csv.writer(summaries_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    summaries_writer.writerow([full_link, summary])

À la fin de la fonction compute_summary(), nous initialisons simplement l'éditeur et commençons à ajouter les données. Une ligne est composée de l'URL de l'article et de son résumé.

Étape 6.1 : Générer un fichier JSON

Un autre format de sérialisation des données qui s'est popularisé ces dernières années est le JavaScript Object Notation (JSON). Il est facilement lisible par l'homme et pratique si vous souhaitez transmettre les données extraites à une API ou à une autre application.

En Python, la manière la plus simple d'écrire un fichier JSON consiste à transmettre les données à un objet dict.

import json
 
summaries_file = open('summaries.json', mode='a', encoding='utf-8')
data = {}
data['summaries'] = []

Nous utiliserons la bibliothèque native pour les fichiers JSON et ouvrirons un nouveau fichier, comme nous l'avons fait précédemment avec notre fichier CSV. Ensuite, nous initialisons un objet dict vide et une liste vide qui contiendra nos résumés.

data['summaries'].append({
'url': full_link,
      'summary': summary
})

À la fin de la fonction compute_summary(), à l'endroit même où nous avions écrit le CSV précédemment, nous ajoutons maintenant un nouvel objet dict à la liste finale.

json.dump(data, summaries_file, indent=4)

Enfin, dans notre fonction main(), après avoir exécuté le processus extract_links(), nous écrivons l'objet final dans le fichier. Le paramètre indent ne servira qu'à mettre en forme le résultat.

Conclusion et alternatives

Voilà, c'est tout, notre tutoriel est terminé. J'espère qu'il vous a été utile et qu'il vous a donné un bon aperçu du web scraping avec Python.

Nous avons découvert ses avantages et comment il peut améliorer votre entreprise ou votre application. Parallèlement, nous avons mis en balance ces informations avec certains des défis rencontrés dans le web scraping.

Si vous êtes développeur, vous trouverez peut-être passionnant de créer vous-même un scraper web en surmontant tous ces problèmes. Cela peut être une expérience d'apprentissage très enrichissante.

Mais en tant que chef d'entreprise (ou en tant que personne ayant besoin de données pour une application à grande échelle dans la vie réelle), vous souhaiterez peut-être éviter les coûts que cela implique (temps, argent, personnel).

Dans ce cas, l'utilisation d'une API dédiée résoudra le problème. WebScrapingAPI surmonte tous les obstacles possibles : rendu Javascript, proxys, CAPTCHA, etc., et offre des fonctionnalités personnalisables. De plus, si vous n'êtes pas tout à fait convaincu, n'oubliez pas qu'il existe une formule gratuite, alors pourquoi ne pas l'essayer ?

À propos de l'auteur
Raluca Penciuc, Développeur full-stack @ WebScrapingAPI
Raluca PenciucDéveloppeur full-stack

Raluca Penciuc est développeuse Full Stack chez WebScrapingAPI ; elle conçoit des robots de collecte de données, améliore les techniques de contournement et recherche des moyens fiables de réduire le risque de détection sur les sites cibles.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.