Web scraping avec Python

Web scraping

Le web scraping est une technique qui consiste à extraire des données d’un site web.

Les données peuvent être de toute sorte, des titres, des articles, des URLs, des adresses mails, etc… . Le web scraping est souvent utilisé par les sites e-commerce pour surveiller les prix des sites concurrents.

Le web scraping peut être utilisé dans toute sortes de projets divers.

Librairies requises

Tu auras besoin des librairies Requests et BeautifulSoup.

Pour les installer :

pip install beautifulsoup4
pip install requests

Le module Requests sert à envoyer des requêtes à l’URL de son choix, on peut également lui fournir des paramètres.

Il fonctionne avec toutes sortes de requête comme GET,POST,PUT,DELETE, et d’autres.

Le module BeautifulSoup va nous servir de filtrer la page html récupérée avec requests.

Comment ça marche ?

Pour servir d’exemple on va mettre en pratique sur ce site (choisi totalement par hasard, j’ai 0 imagination sur ce coup).

On commence par importer les modules :

import requests 
from bs4 import BeautifulSoup 

On initialise la variable « url » qui contiendra l’URL cible :

url = "https://www.learn-html.org/en/Hello%2C_World%21"

La requête

Puis on va utiliser cette variable comme url pour notre requête :

response = requests.get(url)

Notre variable « response » contient maintenant le retour de notre requête.

Parser avec BeautifulSoup

C’est à ce moment que BeautifulSoup entre en jeu, BeautifulSoup va parser (analyser) le html :

parser = BeautifulSoup(response.content, 'html.parser')

A partir de là, on peut afficher l’html et/ou naviguer à travers les balises.

Par exemple on peut afficher le contenu du Header comme ça :

print(parser.header)

Idem avec le body :

print(parser.body)

Maintenant que l’on sait afficher le contenu des balises, on peut affecter ce contenu à des variables ou extraire les balises de notre choix dans des variables.

On va commencer par extraire la balise H1 :

Pour plus de faciliter on commence par récupérer la balise body :

body = parser.body 

Pour afficher H1, on peut alors faire un :

print(body.h1)

On peut afficher H1 de cette manière seulement parce que la variable H1 se situe juste après Body. Dans l’arborescence H1 est un fils de Body.

On peut naviguer de cette manière dans l’HTML mais cette façon de faire est très limité puisque l’on ne peut naviguer ainsi qu’avec la première occurrence de balise. Si l’on souhaite atteindre par exemple le 3ème H2 de cette manière ça ne fonctionnera pas.

Web scraping avec find

La méthode correcte si l’on souhaite extraire une balise est d’utiliser la méthode find().

Par exemple si l’on veut récupérer la première balise « p » :

p = body.find('p')

La méthode find récupère la première section qui match.

Web scraping avec find_all

Comment faire alors si l’on souhaite récupérer la seconde balise « p » ? Avec la méthode find_all(). Cette méthode récupère chaque balise et les assigne une par une dans une liste

les_p = body.find_all('p')

La variable « les_p » est une liste qui contient toutes les balises « p ». On peut lire la liste via une boucle for :

les_p = body.find_all('p')
for p in les_p:
   print(p)

Et si on veut une balise en particulier, par exemple la 4ème balise, on a juste à faire :

les_p = body.find_all('p')
print(les_p[3])

3 car une liste python commence à 0 😉

find by id

Bon, maintenant que tu sais extraire une balise simple on va apprendre à extraire une balise avec son ID :

On va extraire la balise « div » qui possède l’id « main » :

div_main = body.find("div", id="main")
print(div_main)

Tout simplement 😁

find by class

Toutes les balises ne possèdent pas d’ID, elles peuvent aussi posséder des classes, voici comment procéder pour récupérer une balise par sa classe :

ul_breadcrumb = body.find("ul", {"class":"breadcrumb"})
print(ul_breadcrumb)

Ici j’ai récupérer la balise « ul » avec la classe « breadcrumb ».

Ces façons de recherche par id, class et autres fonctionnent également avec la méthode find_all()

Jusqu’ici on à récupérer des balises mais avec BeautifulSoup on peut aussi utiliser différentes méthodes sur nos balises.

On peut par exemple n’afficher que le texte avec la méthode text :

p = body.find('p')
print(p.text)

Ici on affiche uniquement le texte de la première balise « p ».

On peut également lire les attributs avec get(), si on veut connaître l’attribut (id, class ou autres) d’une div :

print(div.get("id"))

Toutes les méthodes sont référencé dans la doc de BeautifulSup.

Tu es maintenant en mesure d’extraire n’importe quelles données du site que tu veux, si tu à une astuce ou tu penses que j’ai oublié quelques choses n’hésites pas à l’indiquer en commentaire.

Laisser un commentaire