Extraire les commentaires Meta avec Sélénium

E

Introduction

L’objectif de cet article est de montrer comment se connecter à Méta avec la bibliothèque Selenium pour exporter les commentaires. Autant l’annoncer tout de suite, le script fonctionne et récupère l’article qui fait le buzz en générant des commentaires, mais je n’ai pas réussi à extraire les commentaires. La balise « commentaire » dans le code source de Méta est illisible (volontairement) pour empêcher l’extraction de ces commentaires.
Ainsi, l’article précédent montrant une application (payante) pour extraire les commentaires semble être la méthode la plus simple et la plus efficace pour atteindre cet objectif.
J’ai utilisé à nouveau l’article comportant 25 commentaires pour les tests de scraping, comme lors de l’essai de l’application.
Voici l’url du post à scraper : https://www.facebook.com/groups/722944715998047/permalink/810420960583755/

Et voici le résultat avec mon script 😉

Même si je n’ai pas atteint mon objectif (je scrape le post mais pas les commentaires), j’ai rédigé cet article pour montrer que la méthode de « scraping » à l’aide de Selenium est très intéressante pour des pages web statiques.
Elle nécessite quelques prérequis (je précise que je travaille avec un Mac M2) :

  1. Installer Chrome en version « stable »
  2. Installer ChromeDriver
  3. S’authentifier sur Facebook avant de lancer le script
  4. Lancer le script

Je dirais que l’étape 2, celle de l’installation de ChromeDriver, a été celle que j’ai trouvée la plus délicate. En effet, il faut impérativement faire correspondre la version de Chrome avec celle de ChromeDriver. Il ne s’agit pas de télécharger au hasard une version de ChromeDriver, mais bien de se référer à la documentation avant de choisir la version.

 

Fonctionnement de Selenium

Selenium est une bibliothèque utilisée pour automatiser les navigateurs web.
Elle permet d’écrire des scripts en divers langages de programmation (comme Python, Java, C#, etc…) pour interagir avec des pages web de la même manière qu’un utilisateur humain le ferait.

Quelles différences entre Selenium et l’utilisation de l’API de Méta ?

Selenium travaille directement avec le navigateur web en simulant les actions de l’utilisateur.
En revanche, l’API de Méta permet d’interagir directement avec les services de la plateforme. Les API sont conçues pour accéder aux fonctionnalités spécifiques offertes par Méta, mais… problème !
L’API de Méta ne permet pas l’export des commentaires.
Selenium est donc idéal pour les scripts où l’automatisation de l’interface utilisateur est nécessaire.
L’interface utilisateur désigne l’ensemble des éléments visuels et interactifs d’un logiciel, d’un site web ou d’une application avec lesquels un utilisateur interagit, comme les boutons, les menus, les formulaires,…

Toutefois, Selenium est particulièrement utile pour tester un site web ou pour scraper des données de sites web qui ne fournissent pas d’API.
Dans le terminal de Python, vous devrez simplement installer la bibliothèque Selenium en utilisant la commande :

pip install selenium pandas

 

Installer ChromeDriver sur MAC

ChromeDriver est un pont entre le code Selenium et le navigateur Google Chrome. Selenium utilise divers drivers pour contrôler différents navigateurs, et ChromeDriver est spécifiquement conçu pour interagir avec Chrome. Ainsi le script utilisant Sélénium, à besoin de de ChromeDriver pour piloter Chrome de manière automatisée, simulant les actions d’un utilisateur humain, comme cliquer sur des boutons, remplir des formulaires et naviguer à travers des pages (scroller par exemple).

Pour installer ChromeDriver sur votre Mac, il faut s’assurer de disposer d’une version stable de Google Chrome et obtenir le numéro de cette version afin de télécharger la version adéquate de ChromeDriver.
Pour les Mac M1, M2, et M3, vous devez télécharger la version « mac-arm64« .

Voici les étapes :

  1. Télécharger la version correcte de ChromeDriver pour votre navigateur Chrome
  2. Installer ChromeDriver à partir du Terminal
  3. Décompresser et déplacer ChromeDriver dans /usr/local/bin/ de votre Mac
  4. Vérifier la version de ChromeDriver

Voici les commandes complètes à exécuter dans l’ordre  :

1. Accédez au répertoire contenant le fichier ZIP :
Une fois enregistré, vous devez repérer le répertoire de votre DD dans lequel vous avec avez enregistré ChromeDriver, pour cela c’est plutôt simple glissez/déposez le répertoire dans le terminal vous obtiendrez le chemin 😉
Ensuite dans le terminal vous allez accéder au répertoire cible dans lequel se trouve ChromeDirver.
Exemple : /Users/Le nom de votre Mac/Documents/chromedriver/
La suite des instructions se feront dans à partir du terminal du Mac et dans le répertoire dans lequel est situé ChromeDrive.

2. Décompressez le fichier ZIP :
Tapez la commande pour décompresser l’archive de chromedriver.

unzip chromedriver-mac-arm64.zip

3. Accédez au répertoire décompressé :

cd chromedriver-mac-arm64

4. Attribuez les permissions d’exécution au fichier chromedriver :

chmod +x chromedriver

5. Déplacez le fichier chromedriver vers /usr/local/bin/ :
Cette étape est primordiale, car le script va appeler le fichier depuis cet emplacement

sudo mv chromedriver /usr/local/bin/chromedriver

6. Vérifiez la version de chromedriver :
A ce stage il faut vérifier la version de ChromeDriver et être sur qu’elle est compatible avec la version de Google Chrome.>

chromedriver --version

 

Le script

Au lancement du script, je me dis « Eureka ! » mais, alors que je suis déjà connecté à Facebook via Google Chrome, le script lance la boîte de dialogue pour s’authentifier et il m’est impossible de saisir mon mot de passe ; le script s’arrête !
Il faut donc utiliser les cookies de session pour maintenir la connexion et pour automatiser les interactions avec le site web Facebook nécessitant une authentification.
Cela permet de contourner les problèmes de connexion manuelle.

Dans un premier temps il est impératif de se connecter manuellement à partir de Google Chrome à Facebook.
Ensuite, il faut utiliser une extension de navigateur comme EditThisCookie pour exporter les cookies de session.
Pour ce faire, il faut ajouter l’extension à votre navigateur (Chrome). Après vous être connecté à Facebook, cliquez sur l’icône de l’extension et exportez les cookies au format JSON.
Enregistrez le fichier nommé facebook_cookies.json dans le répertoire de votre projet.

Voici le script, avec des commentaires décrivant les différentes étapes.

#pip install selenium pandas
####
import json
import re
import requests
import pandas as pd
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# Chemin vers le fichier chromedriver installé dans /usr/local/bin/
chrome_service = Service('/usr/local/bin/chromedriver')

# Chemin vers le fichier de cookies exporté --> à remplacer
cookies_file = '/Users/stephanemeurisse/Documents/Recherche/ScrapFacebook/facebook_cookies.json'

######
# Charger les cookies depuis le fichier JSON
def load_cookies(driver, cookies_file):
    with open(cookies_file, 'r') as file:
        cookies = json.load(file)
        for cookie in cookies:
            # Certains champs ne sont pas acceptés par Selenium, les filtrer
            if 'sameSite' in cookie:
                del cookie['sameSite']
            if 'priority' in cookie:
                del cookie['priority']
            driver.add_cookie(cookie)

# Initialiser le WebDriver pour Chrome
driver = webdriver.Chrome(service=chrome_service)

# URL de la page d'accueil Facebook
login_url = 'https://www.facebook.com'

# Naviguer vers la page d'accueil
driver.get(login_url)

# Charger les cookies pour maintenir la session
load_cookies(driver, cookies_file)

# Rafraîchir la page pour appliquer les cookies
driver.refresh()

# Attendre que la page se charge complètement
time.sleep(5)

# URL du post Facebook --> à remplacer
post_url = 'https://www.facebook.com/groups/722944715998047/permalink/810420960583755/'

# Naviguer vers le post
driver.get(post_url)

# Attendre que la page se charge
time.sleep(5)  # Ajustez en fonction de votre connexion Internet

# Faire défiler pour charger tous les commentaires
scroll_pause_time = 2
while True:
    last_height = driver.execute_script("return document.body.scrollHeight")
    driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
    time.sleep(scroll_pause_time)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break

# Extraire les commentaires
comments = []
try:
    comment_elements = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div[data-ad-preview='message']"))
    )
    for comment in comment_elements:
        comments.append(comment.text)
except Exception as e:
    print(f"Erreur lors de l'extraction des commentaires: {e}")

# Fermer le navigateur
driver.quit()

# Sauvegarder les commentaires dans un fichier CSV
if comments:
    df = pd.DataFrame(comments, columns=['Comment'])
    df.to_csv('facebook_comments.csv', index=False)
    print(f'Commentaires extraits et sauvegardés dans {os.path.join(os.getcwd(), "facebook_comments.csv")}')
else:
    print("Aucun commentaire trouvé.")

 

Conclusion

Même si ce script n’a pas abouti à l’extraction des commentaires Facebook, mais uniquement à l’extraction du post, en raison du fait que les balises « commentaires » de Facebook sont générées dynamiquement sur leur serveur, cet article sensibilise à deux points importants.

Premièrement, il met en lumière l’utilisation et la mise en œuvre de Selenium, qui peut être exploitée pour scraper des sites internet « classiques ».
La mise en œuvre de Selenium dans ce contexte est applicable à de nombreux autres sites web. La compréhension de cette méthode offre une compétence précieuse pour l’automatisation des tâches web et le scraping de données.

Deuxièmement, face à la difficulté de recueillir des données auprès des géants du web, il est parfois plus efficace de débourser quelques dollars pour obtenir les commentaires via des services spécialisés. Adapter ensuite un script pour mettre en forme ces données en fonction du logiciel de traitement statistique que vous utilisez peut s’avérer plus rentable. Le temps, c’est aussi de l’argent,… et cette approche permet de gagner du temps précieux tout en obtenant des données fiables et bien structurées.

J’ai certainement été un peu optimiste et naïf en pensant que je pourrais scraper les commentaires Facebook aussi simplement. C’était sans compter que, pour les GAFA, la data c’est de l’argent.

En conclusion, même si toutes les tentatives de scraping ne réussissent pas toujours à extraire toutes les données souhaitées, elles offrent une précieuse expérience et des compétences en automatisation.
Et parfois, investir dans des outils spécialisés peut être la solution la plus efficace pour atteindre vos objectifs !

A propos de l'auteur

Stéphane Meurisse

Ajouter un commentaire

Stéphane Meurisse