Data science, NLP

Introduction à Selenium : Web Scraping avec Python

Le Web Scraping est un ensemble de techniques permettant d’extraire des données d’un site web dynamique. Selenium est (avec BeautifulSoup) la bibliothèque...

Écrit par Adib Habbou · 3 min lecture >
Introduction à Selenium : Web Scraping avec Python

Le Web Scraping est un ensemble de techniques permettant d’extraire des données d’un site web dynamique. Selenium est (avec BeautifulSoup) la bibliothèque Python la plus utilisée lorsqu’il s’agit de Web Scraping. Elle permet d’interagir avec plusieurs navigateurs web comme Chrome ou Firefox.

Web scraping avec Selenium
Web scraping avec Selenium

Dans cet article nous allons voir comment fonctionne le Web Scraping en Python avec Selenium. Nous verrons comment on peut l’appliquer pour extraire des données sur les articles de la revue IA.

Si vous vous demandez comment peut on peut utiliser Selenium pour récupérer d’autres types de données sur d’autres types de sites web n’hésiter pas à regarder la documentation qui est très bien rédigée et assez explicite.

Vous pourrez retrouver l’ensemble des codes de cet article sur Google Colab.

Introduction à Selenium : Web Scraping avec Python

Prérequis pour l’utilisation de Selenium

Afin de pouvoir utiliser Selenium il faut d’abord installer le Web Driver associé au navigateur que l’on souhaite utiliser. Dans mon cas, je vais utiliser le Web Driver de Chrome que vous pouvez télécharger ici.

Vous devez ensuite installer Selenium et le Web Driver dans votre environnement. Pour ce faire, on va utiliser dans notre notebook les commandes suivantes :

!pip install selenium
!apt install chromium-chromedriver
!cp ...\chromedriver.exe

On importe les modules dont on aura besoin :

from selenium import webdriver
import pandas as pd

Enfin, on modifie quelques options du Chrome Driver pour pouvoir l’utiliser depuis un notebook :

options = webdriver.ChromeOptions()
options.add_argument('-headless')
options.add_argument('-no-sandbox')
options.add_argument('-disable-dev-shm-usage')

Instanciation du chrome driver

Une fois qu’on a installé tout ce dont on avait besoin, et que les paramètres du Chrome Driver ont été modifiés, on peut accéder au site web à scraper :

driver = webdriver.Chrome('chromedriver', options = options)
website = 'https://larevueia.fr/'
driver.get(website)

Web Scraping des liens des articles

Pour pouvoir faire correctement du Web Scraping, il faut se poser deux questions :

  • Comment est construit le site web ?
  • Quelles données souhaite-t-on récupérer ?

Pour pouvoir avoir une idée de l’architecture du site web que l’on étudie on peut utiliser une fonctionnalité très utile disponible dans tous les navigateurs : Inspecter l’élément.

Web scraping avec Selenium
Web scraping avec Selenium
Web scraping avec Selenium
Web scraping avec Selenium

Dans notre cas, on se rend vite compte que les articles sont répartis en catégories et que chaque catégorie contient plusieurs pages. On peut donc commencer par récupérer tout d’abord les liens des articles pour ensuite pouvoir récupérer les données article par article.

Pour ce faire, on va tout d’abord créer une liste contenant l’ensemble des catégories de notre site :

categories = ['ethique', 'nlp', 'evenements', 'ml-dl', 'data-science', 'vision']

On peut donc facilement explorer le site en parcourant les liens des pages des différentes catégories :

articles_links = []
for category in categories:
  category_link = website + category
  driver.get(category_link)
  href_links = driver.find_elements_by_xpath('//h2/a[@href]')
  for href_link in href_links:
    articles_links.append([href_link.get_attribute('href'), category])

Pour expliquer plus précisément ce que fait le code ci-dessus, on peut dire que l’on parcourt tout d’abord la liste des catégories, pour chaque catégorie on crée une variable, qui contient son URL. Puis on ouvre la page avec la fonction get() de notre driver.

On utilise ensuite la fonction find_elements_by_xpath() pour rechercher les liens href se trouvant à l’intérieur de balise h2 (ceci découle directement de notre analyse du site avec la fonctionnalité Inspecter l’élément de notre navigateur, vous pouvez copier le xpath directement sur le navigateur).

Finalement, on ne récupère que le lien de l’article avec la fonction get_attribute(), et on ajoute donc à notre liste le lien de l’article ainsi que la catégorie à laquelle il correspond (ce qui peut être utile plus tard pour faire du NLP avec un modèle de classification par exemple).

On pourrait aller plus loin et rajouter une deuxième boucle pour incrémenter à chaque fois le nombre de pages afin de parcourir tous les articles de chaque catégorie, et pas seulement ceux présents sur la première page.

Web Scraping du contenu des articles avec Selenium

Une fois l’ensemble des liens d’articles récupérés, la prochaine étape est d’analyser le contenu de la page pour chaque article. Encore une fois, on utilise la fonctionnalité Inspecter l’élément, afin d’identifier la structure de la page et de retrouver les éléments à scraper.

On se rend vite compte que dans notre cas le contenu de l’article est stocké dans une classe nommée article-post. On va donc récupérer le contenu texte de cette classe et tout stocker dans un data frame avec Pandas :

df_articles = pd.DataFrame()
for article_link in articles_links:
  driver.get(article_link[0])
  content_scrap = driver.find_elements_by_class_name('article-post')
  if (len(content_scrap) != 0):
    content = content_scrap[0].text
  article = {'category' : article_link[1], 'content' : content}
  df_article = pd.DataFrame(article, index = [0])
  df_articles = df_articles.append(df_article, ignore_index=True)

On se retrouve donc avec un data frame contenant nos articles, avec à chaque fois la catégorie à laquelle il correspond. On peut finalement transformer ce data frame en fichier csv, afin de stocker les données :

df_articles.to_csv('la_revue_ia_articles.csv')

À vous de jouer maintenant ! N’hésitez pas à demander en commentaire si vous avez besoin d’aide 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.