Scraping avec Python

Dans ce tutoriel, vous allez voir comment Scraper un site web, en l’occurence, la page d’accueil de ce blog, vous allez voir comment récupérer les noms des articles et leurs catégories.

Le code est disponible ici.

Scraping ?

Le Scraping est un moyen pour extraire des données de pages web pour les réutiliser, en effet, tous les sites web ne fournissent pas une API permettant de récupérer les infos dont vous avez besoin.

Prérequis

  • Python 3.x
  • pip, normalement installé par défaut avec Python
  • Un éditeur de texte

Inspection de la page à scraper

Afin de pouvoir récupérer les titres et les catégories des posts, il va falloir les inspecter pour savoir comment ils sont regroupés, et comment les récupérer automatiquement.

Ouvrez votre navigateur préféré et allez sur la page d’accueil de ce site.
Faites un click-droit sur le titre d’un post puis faites Examiner l’élément ou Inspecter ou autre selon votre navigateur.

Vous devriez voir quelque chose qui ressemble à ça:
Inspect post title

On peut voir que les titres se trouvent dans un élément p de classe article-headline-p.

Inspectez maintenant une catégorie, vous devriez voir:
Inspect post category

Les catégories sont dans des éléments a de classe post_category-link.

Librairies

Vous allez avoir besoin de deux librairies

  1. urllib qui vous permettra de récupérer une page web, elle est intégrée à Python par défaut
  2. BeautifulSoup qui vous permettra de parser des pages web, installez la avec : pip install beautifulsoup4

Code, code, code

Créez un nouveau fichier, appelé par exemple main.py puis ouvrez le avec votre éditeur de texte et écrivez ceci dans ce fichier :

from bs4 import BeautifulSoup #import de bs4.BeautifulSoup
from urllib import request #import de urllib.request

def main(): #fonction principale
soup = get_parsed_page("http://www.notabug.fr") #récupération de la page parsée
print_post_titles(soup) #affichage des titres des posts
print('') #pour un retour à la ligne entre les titres et les catégories
print_post_categories(soup) #affichage des catégories des posts

def get_parsed_page(url): #fonction qui retourne une page parsée à partir d'une url
with request.urlopen(url) as page:
html = page.read()
return BeautifulSoup(html, 'html.parser') #parse la page avec BeautifulSoup

def print_post_titles(soup):
print('Titles:')
post_titles = soup.find_all('p', class_='article-headline-p') #find_all retourne toutes les occurences, utiliser "find" pour n'en récupérer qu'une seule
print_html_elements_text(post_titles)

def print_post_categories(soup):
print('Categories:')
post_categories = set(soup.find_all('a', class_='post_category-link')) #utilisation d'un set pour ne pas avoir de doublons
print_html_elements_text(post_categories)

def print_html_elements_text(html_elements):
for html_element in html_elements:
print(html_element.getText()) #utilisation de getText() pour récupérer le texte affiché

main()

Et pour terminer, lancez python main.py, les noms des articles et des catégories devraient s’afficher dans votre console !