Web Scraping Python avec Selenium

Aujourd’hui on va voir comment faire du web scraping avec Selenium. Pour ceux qui ne savent pas ce que c’est que le web scraping cliquez ici.

Selenium est un outil d’automatisation de test pour le web. Il permet de créer des « robots » qui naviguent dans des pages webs comme le ferait un vrai utilisateur. Bien que le premier rôle de Selenium soit le testing de pages webs (développement web), cet outil est beaucoup utilisé pour l’extraction de données.

Pourquoi utiliser Selenium pour scraper?

La démarche habituelle pour scraper est : une requête suivie du parsing de la réponse. Dans la plupart des cas cela marche bien. Mais lorsque l’on a affaire à des sites avec plusieurs redirections ou avec des pop-ups avec lesquels il faut interagir avant d’avoir la page qu’on veut, cette démarche devient beaucoup moins amusante. Car il faut analyser le réseau et simuler les requêtes dans le bon ordre avec les bons arguments. Et parfois il est carrement impossible d’accéder à une page via une simple requête.

L’avantage de Selenium c’est que l’on (notre script) peut naviguer sur les pages. Du coup, si on voit la donnée dans notre navigateur, on peut la scraper via Selenium. Avec selenium, on peut remplir des formulaire, cliquer sur des boutons, scroller, parser des pages etc.

Exemple : Scraper une page eBay avec Selenium

Je vous propose un petit exemple. Disons que nous voulons les prix, titres d’offre et images pour toutes les offres concernants les IPhones. Pour cela nous allons juste faire une recherche du mot clé « iphone » puis récupérer les informations. Simple non ?

On commence par importer les modules dont on aura besoin. Le webdriver est l’objet qui gère le navigateur utilisé par Selenium. La classe « Keys » permet d’utiliser les touches du clavier. Et la fonction sleep pour mettre le scripte en « pause » pour les chargement de page.


from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

On utilise le driver Firefox mais il en existe d’autres celui de Chrome et PhantomJS par exemple.


# On crée une instance du web-driver Firefox et on va sur la page de eBay.fr
driver = webdriver.Firefox()driver.get("http://www.ebay.fr")

# En fonction de notre connection et des performance de notre machine il faudra attendre

# que la page charge avant de passer à la suite
sleep(10)

On recupère, grâce au selecteur de Selenium, l’élément qui correspond au champ « recherche ». Pour trouver le bon élément il faut inspecter la page. Si vous ne savez pas le faire, allez voir ça.


# On recupere la bar de recherche, on la remplit avec "iphone" puis on appuie "Entrez"
search_bar = driver.find_element_by_name("_nkw")
search_bar.send_keys("iphone")
search_bar.send_keys(Keys.ENTER)

Et la dernière étape est constituée de deux boucles. Une boucle « for » qui itère sur les différentes offres d’une page et une boucle « while » qui itère sur les différentes pages qui correspondent à la recherche.


is_last_page = False
while not is_last_page:
    offers = driver.find_elements_by_css_selector("div#ResultSetItems > ul > li.sresult")
    for offer in offers:
        title = offer.find_element_by_css_selector("h3.lvtitle a").get_attribute("title")
        print("Titre : ",title)
        image = offer.find_element_by_css_selector("div.lvpicinner img.img").get_attribute("src")
        print("Image : ",image)
        price = offer.find_element_by_css_selector("li.lvprice span").text
        print("Prix : ",price)
        print("")
    next_page = driver.find_element_by_css_selector("table#Pagination a.next")
    is_last_page = next_page.get_attribute("arial-disabled")
    if is_last_page == "true" or is_last_page == "True":
        is_last_page = True
    else:
        next_page.click()
    sleep(10)

Et voilà!

On pourrait bien-sûr, plutôt que de « print » la donnée, l’enregistrer dans une BD ou dans des fichiers structurés, mais gardons ça pour un autre article.

N’hesitez pas à laisser un message si vous avez des questions ou remarques, elles seront les bienvenues. À bientôt!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.