Nous allons diviser notre code en deux sections : une pour l'extraction des données et une pour la manipulation des données. La première partie est gérée par le module Requests, tandis que la seconde est gérée par BeautifulSoup. Sans plus attendre, passons au codage, en commençant par la partie extraction :
import requests
def scrape( url = None ):
# if there is no URL, there is no need to use Python HTTP clients
# We will print a message and stop execution
if url == None:
print('[!] Please add a target!')
return
response = requests.get( url )
return response
Dans cette section, nous définissons une fonction avec un seul paramètre : l’URL ciblée. Si l’URL n’est pas fournie, nous affichons un message et arrêtons l’exécution. Sinon, nous utilisons la méthode get de Requests pour renvoyer la réponse. Or, nous savons que les clients HTTP Python prennent en charge davantage de méthodes ; ajoutons donc un paramètre conditionnel :
import requests
def scrape( method = 'get', url = None, data = None ):
# if there is no URL, there is no need to use Python HTTP clients
# We will print a message and stop execution
if url == None:
print('[!] Please add a target!')
return
if method.lower() == 'get':
response = requests.get( url )
elif method.lower() == 'post':
if data == None:
print('[!] Please add a payload to your POST request!')
return
response = requests.post( url, data )
return response
Comme vous pouvez le voir, nous avons ajouté quelques paramètres supplémentaires à notre fonction. Le paramètre `method` spécifie la méthode à utiliser pour notre requête. Le paramètre `data` représente la charge utile que nous envoyons avec la requête POST. Par défaut, la méthode est GET, le paramètre `method` n'est donc pas obligatoire.
Défi : Ajoutez d’autres méthodes à cette fonction et enrichissez les capacités de notre scraper. Non seulement c’est amusant, mais c’est aussi une bonne approche d’apprentissage. De plus, vous pouvez vous approprier le code afin de l’ajouter à votre portfolio.
Jusqu'à présent, nous avons abordé l'extraction de données. Analysons le code HTML et exploitons-le :
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None):
if data == None:
print('[!] Please add some data!')
return
if el == None:
print('[!] Please specify which elements you are targeting!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el)
return elements
Mais un scraper web devrait être capable d'extraire des données plus spécifiques. Par exemple, il devrait pouvoir localiser et renvoyer des éléments en fonction de leur sélecteur CSS. Ajoutons donc la logique qui gère cette partie :
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None, attr = None, attr_value = None):
if data == None:
print('[!] Please add some data!')
return
if el == None:
print('[!] Please specify which elements you are targeting!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el, { attr : attr_value })
return elements
BeautifulSoup nous permet d'extraire des données spécifiques en fonction de leurs attributs. Nous avons donc ajouté ici deux nouveaux paramètres qui nous aideront à localiser et à extraire des éléments en fonction de leurs attributs.
Nous avons désormais tout ce dont nous avons besoin. Il ne reste plus qu’à combiner les deux sections pour obtenir notre scraper web. Une fois votre code assemblé, il suffit de :
- Créez une nouvelle variable qui contiendra les données extraites avec Requests
- Affichez les éléments renvoyés par BeautifulSoup
Voici les deux éléments manquants de votre code :
data = scrape('GET', 'https://webscrapingapi.com')
print( extract_elements(data, 'ul') )
Je suis sûr que vous avez déjà compris le fonctionnement de chaque élément et qu'une explication n'est plus nécessaire à ce stade. Tout comme pour notre scraper, je vous mets au défi d'expérimenter avec la fonction `extract_elements` et de lui faire faire plus que simplement renvoyer des éléments.