Le scraping web avec NODRIVER en 2025

Maîtrisez le scraping web avec NODRIVER. Ce guide couvre l’installation, les fonctionnalités clés et les méthodes pour rationaliser vos flux d’extraction de données.
11 min de lecture
web scraping with NODRIVER blog image

Pendant des années, Undetected Chromedriver a été un élément essentiel de la navigation sécurisée et du contournement des robots. Le développeur derrière Undetected Chromedriver a depuis créé NODRIVER. Avec NODRIVER, vous n’êtes plus dépendant de Selenium ou Webdriver. Une simple installation par pip et tout devrait être prêt à fonctionner.

Dans ce guide, vous apprendrez :

  • Qu’est-ce que NODRIVER ?
  • En quoi est-il différent des autres navigateurs sans tête ?
  • Comment utiliser NODRIVER ?
  • Quelles sont les limites de NODRIVER ?
  • Comment utiliser NODRIVER avec un proxy ?
  • Des alternatives solides à NODRIVER

Qu’est-ce que NODRIVER et pourquoi s’en préoccuper ?

Qu’est-ce que NODRIVER ?

NODRIVER est le successeur entièrement asynchrone de Undetected Chromedriver. En utilisant les “meilleures pratiques” comme valeur par défaut pour tous les kwargs, cette chose a été conçue pour fonctionner dès la sortie de la boîte avec seulement une petite quantité de code.

NODRIVER présente les caractéristiques suivantes :

  • Performance
  • Aucune dépendance externe (pas même Chromedriver)
  • Contournement d’Antibot
  • Cookies de session persistants
  • Une nouvelle instance du navigateur à chaque utilisation

Qu’est-ce qui différencie NODRIVER ?

NODRIVER utilise une architecture radicalement différente de Undetected Chromedriver et même d’autres navigateurs sans tête. Traditionnellement, ces autres navigateurs dépendent de Selenium ou de Chrome DevTools Protocol (CDP).

NODRIVER utilise sa propre implémentation du protocole DevTools. Dans la documentation, il est en fait appelé “chrome (-ish) automation library”. Avec NODRIVER, vous ne dépendez pas de Selenium, ni directement de CDP. NODRIVER utilise une implémentation personnalisée de CDP. Pour utiliser NODRIVER, tout ce dont vous avez besoin est Pip et un navigateur basé sur Chrome.

Scraping avec NODRIVER

1. Démarrage de l’activité

Avant de commencer, vous devez vous assurer que Python et un navigateur sont installés. Si vous lisez cet article, je suppose que vous les avez déjà. Vous pouvez installer NODRIVER directement avec pip.

pip install nodriver

2. Structure de base

Notre structure de base est vraiment similaire à ce que vous obtiendriez avec Playwright ou Puppeteer. Si vous souhaitez utiliser Playwright en Python, vous pouvez consulter un guide complet sur le scraping des listes Amazon ici. NODRIVER est très similaire à Playwright, mais il est encore en plein développement.

Voici notre structure de base.

import nodriver

async def main():
    #start the browser
    browser = await nodriver.start()

    base_url = "https://quotes.toscrape.com"

    #navigate to a page
    page = await browser.get(base_url)

    ###logic goes here###

    #close the browser
    await page.close()

if __name__ == '__main__':

    #in their docs, they advise directly against asyncio.run()
    nodriver.loop().run_until_complete(main())

3. Obtenir une page

Comme vous l’avez probablement remarqué dans notre squelette de base ci-dessus, browser.get() renvoie un objet page. Vous pouvez même ouvrir plusieurs pages simultanément. Si vous êtes prêt à faire preuve de créativité, vous pouvez réaliser des opérations hautement concurrentes.

L’extrait ci-dessous n’est que théorique.

#navigate to a page
page_1 = await browser.get(base_url)
page_2 = await browser.get(a_different_url)

####do stuff with the different pages#####

4. Contenu dynamique

Pour gérer le contenu dynamique, deux options s’offrent à vous. Vous pouvez utiliser la méthode .sleep() pour attendre une durée arbitraire, ou vous pouvez utiliser .wait_for() pour attendre un sélecteur spécifique sur la page.

#wait an arbitrary amount of time
await tab.sleep(1)

#wait for a specific element
await tab.wait_for("div[data-testid='some-value']")

REMARQUE : dans l’extrait ci-dessus, j’ai utilisé tab au lieu de page comme nom de variable. Ces deux objets sont interchangeables. Il s’agit dans les deux cas d’objets tab. Pour en savoir plus sur les onglets dans NODRIVER , cliquez ici.

5. Recherche d’éléments

NODRIVER nous offre une variété de méthodes pour trouver des éléments sur la page. Il semble qu’ils soient en train de gérer certaines méthodes anciennes.

Il existe quatre méthodes textuelles différentes pour trouver des éléments. Deux d’entre elles sont appelées à disparaître à l’avenir.

#find an element using its text
my_element = page.find("some text here")

#find a list of elements by their text
my_elements = page.find_all("some text here")

#find an element using its text
my_element = page.find_element_by_text("some text here")

#find a list of elements using their text
my_elements = page.find_element_by_text("some text here")

Comme les méthodes ci-dessus, il existe également quatre méthodes de recherche d’éléments basées sur des sélecteurs. Deux d’entre elles sont appelées à disparaître. Si les développeurs de NODRIVER veulent s’aligner clairement sur la CDP, les méthodes query_selector survivront probablement.

#find a single element using its css selector
my_element = page.select("div[class='your-classname']")

#find a list of elements using a css selector
my_elements = page.select_all("div[class='your-classname']") 

#find a single element using its css selector
my_element = page.query_selector("div[class='your-classname']")

#find a list of elements using a css selector
my_elements = page.query_selector_all("div[class='your-classname']") 

Comme vous pouvez le voir ci-dessus, quelle que soit la manière dont vous voulez trouver des éléments sur la page, il y a probablement plusieurs façons de le faire. Avec le temps, les développeurs de NODRIVER pourraient améliorer la situation. Cela dit, pour l’instant, leurs méthodes d’analyse sont comme une tronçonneuse de l’armée suisse.

6. Extraire leurs données

NODRIVER propose plusieurs méthodes pour extraire des données. Vous pouvez utiliser le trait .attributes pour extraire les attributs directement – ce n’est pas très convivial – il renvoie un tableau, pas un objet JSON.

Voici une solution de contournement que j’ai trouvée pour extraire le href d’un objet lien. C’est moche, mais ça marche. Je m’attends à ce que la méthode des attributs soit bientôt remplacée par quelque chose d’un peu plus fonctionnel.

next_button = await page.select("li[class='next'] > a")

#this returns an array
attributes = next_button.attributes

#use array indexing to find the href object and its value
for i in range(len(attributes)):
    if attributes[i] == "href":
        next_url = attributes[i+1]

NOTE : La plupart des autres navigateurs headless contiennent une méthode get_attribute(). Cependant, cette méthode ne fonctionne pas encore dans NODRIVER.

Voici comment nous extrayons des données textuelles. Comme vous pouvez le remarquer, nous n’utilisons pas de await ici. Je pense que cela changera à l’avenir pour s’aligner sur les autres navigateurs de type CDP. Dans sa forme actuelle, text est juste un attribut, pas une méthode – await lèvera en fait une erreur lorsqu’il est utilisé avec des attributs. Cela semble contraire à Puppeteer et Playwright, mais c’est l’état actuel de NODRIVER – toujours en cours de développement.

#find the quote element
quote_element = await quote.query_selector("span[class='text']")
#extract its text
quote_text = quote_element.text

7. Stockage des données

Nous stockerons nos données dans un petit fichier JSON. Lors de l’extraction des citations, chaque citation comporte une liste de balises et les listes ne se présentent pas très bien sous forme de CSV.

import json

with open("quotes.json", "w", encoding="utf-8") as f:
    json.dump(scraped_data, f, ensure_ascii=False, indent=4)

8. Tout assembler

Maintenant, mettons tous ces concepts ensemble dans un script fonctionnel. Dans l’exemple ci-dessous, nous utilisons les concepts ci-dessus pour extraire des données de Qutoes to Scrape – un site conçu spécialement pour les tutoriels de scraping. Copiez et collez le code ci-dessous pour vous faire une idée du fonctionnement de NODRIVER.

import nodriver
import json

async def main():

    #list to hold scraped data
    scraped_data = []


    browser = await nodriver.start()

    next_url = "/"

    base_url = "https://quotes.toscrape.com"

    #while we still have urls to scrape
    while next_url:

        #go to the page
        page = await browser.get(f"{base_url}{next_url}")

        #find quote divs using a selector
        quotes = await page.select_all("div[class='quote']")

        #iterate through the quotes
        for quote in quotes:

            #find the quote element and extract its text
            quote_element = await quote.query_selector("span[class='text']")
            quote_text = quote_element.text

            #find the author and extract the text
            author_element = await quote.query_selector("small[class='author']")
            author = author_element.text

            #find the tag elements
            tag_elements = await quote.query_selector_all("a[class='tag']")
            tags = []

            #iterate through the tags and extract their text
            for tag_element in tag_elements:
                text = tag_element.text
                tags.append(text)

            #add our extracted data to the list of scraped data
            scraped_data.append({
                "quote": quote_text,
                "author": author,
                "tags": tags
            })

        #check the page for a "next" button
        next_button = await page.select("li[class='next'] > a")

        #if it doesn't exist, close the browser and break the loop
        if next_button == None:
            await page.close()
            next_url = None

        #if it does, follow this block instead
        else:
            attributes = next_button.attributes

            #loop through the attributes to find your desired attribute, its value is the next index
            for i in range(len(attributes)):
                if attributes[i] == "href":
                    next_url = attributes[i+1]

    #write the data to a json file
    with open("quotes.json", "w", encoding="utf-8") as f:
        json.dump(scraped_data, f, ensure_ascii=False, indent=4)


if __name__ == '__main__':

    nodriver.loop().run_until_complete(main())

Si vous exécutez le script ci-dessus, vous obtiendrez un fichier JSON contenant des objets tels que ceux présentés ci-dessous.

[
    {
        "quote": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”",
        "author": "Albert Einstein",
        "tags": [
            "change",
            "deep-thoughts",
            "thinking",
            "world"
        ]
    },
    {
        "quote": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”",
        "author": "J.K. Rowling",
        "tags": [
            "abilities",
            "choices"
        ]
    },

Limites actuelles de NODRIVER

Actuellement, NODRIVER présente de sérieuses limitations qui méritent d’être soulignées. Passons-les en revue.

Mode sans tête

NODRIVER génère une erreur chaque fois qu’il est exécuté en mode headless. Nous ne savons pas si cela est intentionnel (comme un contournement de l’antibot) ou si c’est un problème légitime.

Error message displayed in a terminal, indicating a recursionError with the message 'maximum recursion depth exceeded', showing file paths and lines related to Python code execution.

Interactions des pages

Bien que NODRIVER propose de nombreuses interactions de pages dans sa documentation, la plupart d’entre elles ne fonctionnent que partiellement – ou pas du tout. Comme vous pouvez le voir, ceci est documenté dans la capture d’écran ci-dessous pour click_mouse() et mouse_click().

Extrait de code montrant les paramètres et l'utilisation des fonctions asynchrones mouse_click et click_mouse, y compris des détails sur la sélection des boutons, les touches de modification et un événement interne pour l'attente.

Extraction d’attributs

Le plus gros problème avec NODRIVER est l’extraction d’attributs. Comme nous l’avons déjà mentionné, cela produit un tableau et c’est extrêmement archaïque comme vous l’avez vu dans notre solution de contournement de href. Voici la sortie littérale de l’attribut. Pour le scraping au niveau de la production, ce problème doit être résolu.

Un extrait de code montrant un attribut de lien hypertexte avec la valeur '/page/2/' dans un format de tableau.

Utilisation d’un proxy avec NODRIVER

Actuellement, le support proxy de NODRIVER est au mieux limité. Ils fournissent une méthode create_context() pour la connexion au proxy.

L’extrait ci-dessous provient directement de leur page de problèmes. Cependant, après avoir essayé pendant des heures cette méthode et d’autres, je n’arrivais toujours pas à me connecter.

tab = await  browser.create_context("https://www.google.nl", proxy_server='socks5://myuser:mypass@somehost')

# or add  new_window=True if you would like a new window

Si vous regardez leur documentation, ils ont une section sur les proxys[1]. Bien qu’il y ait une section officielle sur les proxys, il n’y a pas de documentation réelle. Nous supposons que cela sera corrigé dans un futur proche.

Alternatives viables

Bien qu’il ne soit pas encore prêt pour une utilisation en production, je m’attends à de grandes choses de la part de NODRIVER dans le futur. Si vous recherchez quelque chose de plus robuste, jetez un coup d’œil aux navigateurs ci-dessous.

  • Sélénium: En plein essor depuis 2004. Selenium dépend de Chromedriver, mais il a été testé et est prêt pour la production. En savoir plus sur Selenium web scraping.
  • Playwright: Playwright ressemble à une version peaufinée et prête à l’emploi de ce que vous avez vu dans ce tutoriel avec NODRIVER. Apprenez à utiliser Playwright pour le scraping web.

Conclusion

NODRIVER est un nouvel outil passionnant pour l’automatisation des navigateurs, mais son développement rapide signifie que certaines fonctionnalités sont encore en cours de maturation. Pour un scraping web fiable et à grande échelle, il est préférable d’utiliser des solutions robustes telles que :

Inscrivez-vous pour un essai gratuit et commencez dès aujourd’hui !

Aucune carte de crédit requise