Aller au contenu
Retour au blog

Tutoriel Python Nodriver : extraction de données de navigateur en mode furtif, du premier script à la mise en production

Suciu DanDernière mise à jour le 16 min read
Tutoriel Python Nodriver : extraction de données de navigateur en mode furtif, du premier script à la mise en production
En bref : Nodriver est une bibliothèque Python asynchrone qui pilote Chromium via le Chrome DevTools Protocol, sans Selenium ni binaire chromedriver. Utilisez-la lorsqu'un navigateur furtif auto-hébergé, plus proche d'une vraie session Chrome, convient mieux qu'une pile WebDriver, mais sachez qu'elle ne supprime pas à elle seule les risques liés à l'IP, au TLS ou au comportement. Ce tutoriel va d'un premier script à la production en conteneur et à une Browser API hébergée.

Nodriver est une bibliothèque Python asynchrone qui pilote Chromium via le protocole Chrome DevTools — sans Selenium ni binaire chromedriver. On y a recours lorsqu’un navigateur furtif auto-hébergé, qui se rapproche davantage d’une véritable session Chrome, s’avère plus performant qu’une configuration WebDriver classique. Ce guide commence par un scraper fonctionnel sur un environnement de test public, passe ensuite par un environnement de production en conteneur, et se termine par le cas où ce même flux relève plutôt d’une API de navigateur hébergée.

Points clés à retenir

  • Nodriver communique directement avec le CDP ; il n’élimine pas en soi les risques liés à l’adresse IP, au protocole TLS ou au comportement.
  • Fixez la version. À partir de la version 0.50.3 avec Chrome 154 (06/10/2026), select renvoie None en cas d’échec, wait_for lance une exception et xpath a échoué avec DOM.enable manquant.
  • Préférez uc.loop() à asyncio.run pour un arrêt propre ; browser.stop() est en mode synchrone.
  • Pour les tâches nécessitant une grande discrétion, privilégiez Chrome en mode « headless » sous Xvfb : le mode « headless » peut toujours afficher HeadlessChrome dans l’en-tête UA.
  • C’est en production que les scrapers tombent en panne : conteneurs, concurrence limitée, tentatives de réessai, vérifications de l’adresse IP de sortie, validation des résultats.
  • Mettez en correspondance les temps d’attente/actions avec les paramètres de l’API du navigateur (wait_for_css, wait_until, js_instructions, …) lorsque l’auto-hébergement ne suffit plus.

Ce qu’est nodriver (et ce qu’il n’est pas)

CDP direct vs WebDriver

Parcours Selenium classique :

Your script  →  WebDriver protocol  →  chromedriver  →  Chrome

Parcours Nodriver :

Your script  →  Chrome DevTools Protocol (websockets)  →  Chrome

En supprimant le binaire du pilote, on élimine les marqueurs d’automatisation spécifiques à WebDriver ainsi qu’une catégorie entière d’échecs liés aux divergences de version. Cela ne rend pas votre adresse IP résidentielle, votre pile TLS unique, ni le timing de vos clics « humain ».

Issu de « undetected-chromedriver »

Nodriver est le successeur asynchrone et axé sur le CDP issu de la même lignée d’auteurs que undetected-chromedriver. Le modèle passe de « patcher le pilote » à « ne jamais utiliser le pilote ». Navigateurs de la famille Chromium uniquement ; API asynchrone uniquement.

Quelles couches de détection prend-il en charge ?

Couche

Ce que les défenseurs examinent

Ce que modifie Nodriver (modèle)

Environnement JS

navigator.webdriver, particularités de l’objet Chrome

Améliore l’empreinte d’automatisation JS par défaut par rapport à WebDriver brut (à vérifier tout de même pour chaque cible)

Protocole / pilote

Empreintes de Chromedriver

Contourne WebDriver en utilisant CDP

TLS / HTTP2

Empreintes JA3 / ALPN / HTTP2

Ne remplace pas la pile réseau du navigateur

IP / ASN / géolocalisation

Plages de centres de données, réputation

Ne résout pas le problème ; nécessite des proxys / un routage résidentiel

Comportement

Synchronisation, trajectoires de la souris, schémas de défilement

N'invente pas de comportement humain à votre place

Signaux « headless »

HeadlessChrome UA, plugins manquants, etc.

Dépend du mode ; consultez notre section « Headless »

Votre équipe devrait-elle s'appuyer sur nodriver ? (tableau décisionnel)

Vérifié lors de la préparation de la publication le 06/10/2026 :

  • Licence : AGPL-3.0 sur le paquet PyPI que nous avons installé. Cela a de l’importance pour les services en ligne qui modifient et exécutent le code. Ceci ne constitue pas un avis juridique : demandez à un avocat de lire l’AGPL si vous proposez un SaaS basé sur un fork.
  • Formate de l’API : asynchrone uniquement ; navigateurs de la famille Chromium.
  • Maintenance : la dernière version PyPI vérifiée pour ce guide est la 0.50.3 (13/05/2026). Vérifiez à nouveau le nombre d’étoiles, les tickets et les commits le jour de la publication avant de vous engager sur plusieurs années avec cette plateforme.
  • Couverture des tests / classificateur alpha : PyPI indique toujours « Statut de développement :: 3 - Alpha ». Prévoyez des dysfonctionnements lorsque Chrome évoluera.
  • Fork : Zendriver et d’autres forks de CDP existent si vous avez besoin d’une approche de maintenance différente — consultez la matrice des outils plus loin.

Vous avez besoin d’une prise en charge multi-navigateurs (Firefox/WebKit), d’API de synchronisation ou d’une licence permissive pour un produit commercial sans analyse AGPL ? Nodriver n’est peut-être pas la base qu’il vous faut.

Installation et vérification (épinglé)

python3 -m venv venv
source venv/bin/activate
pip install 'nodriver==0.50.3'

Liste de contrôle d’installation :

  1. Python ≥ 3.9.
  2. Une installation locale de Chrome/Chromium (à vérifier avec google-chrome --version).
  3. les dépendances d'exécution sont récupérées automatiquement : websockets>=14 , mss, deprecated.
  4. Ne nommez pas votre script nodriver.py (cela masquerait le paquet).
  5. Test de fonctionnement : ouvrez une page publique et attendez qu'un sélecteur soit détecté (script ci-dessous).

Votre premier scraper

Sandbox pour cet article : quotes.toscrape.com — une cible de démonstration différente de la vitrine utilisée dans plusieurs tutoriels concurrents.

# 01_first_scraper.py — verified 2026-10-06 on nodriver 0.50.3
import nodriver as uc

async def main():
    browser = None
    try:
        browser = await uc.start(headless=True)
        tab = await browser.get("https://quotes.toscrape.com/")
        await tab.select("div.quote", timeout=15)  # wait for state, not time
        quotes = await tab.select_all("div.quote")
        for q in quotes:
            text_el = await q.query_selector("span.text")
            author_el = await q.query_selector("small.author")
            print((text_el.text or "").strip(), "—", (author_el.text or "").strip())
    finally:
        if browser is not None:
            browser.stop()  # sync on 0.50.3 — do not await

if __name__ == "__main__":
    # Package README recommends uc.loop(); see event-loop notes below
    uc.loop().run_until_complete(main())

Sélectionner et extraire de manière fiable

Tableau de décision des méthodes de sélection (0.50.3)

Besoin

Méthode

En cas d’échec (0.50.3, 06/10/2026)

À utiliser lorsque

Attente + CSS

await tab.select(css, timeout=…)

Renvoie None (ne déclenche pas d'exception ; la chaîne de documentation est erronée)

Attente de disponibilité par défaut

CSS à utilisation unique

await tab.query_selector(css)

Renvoie None

Vous savez déjà que le DOM est prêt

Attente qui doit échouer de manière évidente

await tab.wait_for(selector=…)

Lance TimeoutError

Une barrière infranchissable avant de continuer

Recherche de texte

await tab.find(text, best_match=True)

Échec mineur après plusieurs tentatives

Boutons/libellés sans CSS stable

Nombreux nœuds

await tab.select_all(css)

Comportement de type « liste vide » lors des tentatives de réessai

Listes/cartes

XPath

await tab.xpath(…)

Problème rencontré avec la version 0.50.3 + Chrome 154 — ProtocolException: 'DOM.enable' wasn't found

Préférer les sélecteurs CSS

Aides pour le texte et les attributs

def attr_get(el, name: str):
    if el is None:
        return None
    attrs = el.attrs  # ContraDict in nodriver 0.50.3
    if attrs is None:
        return None
    try:
        return attrs.get(name)
    except Exception:
        try:
            return attrs[name]
        except Exception:
            return None

# Observed: element.text and element.text_all both return usable strings

État de XPath sur la version 0.50.3 + Chrome 154

Échec sur Chrome 154 + nodriver 0.50.3 (06/10/2026) lors de l'appel de DOM.enable. Ne déployez pas de scrapers dépendant d'XPath sur cette combinaison sans une nouvelle vérification.

Pages dynamiques

Attente d’un état, et non d’un délai

Attendre un sélecteur, du texte ou une condition d’inactivité du réseau. Corrigé sleep est destiné à un débogage visuel ponctuel — et non aux scrapers définitifs. Préférez select / wait_for à tab.sleep dans les chemins de production.

Une pagination qui résiste à la navigation

Lorsque vous cliquez sur « Suivant », les anciens identifiants d’éléments peuvent se détacher. Interrogez à nouveau le contrôle à chaque tentative ; attendez un changement d’URL ou un nouveau sélecteur de contenu.

# Pagination retry pattern for quotes.toscrape.com-style next links
async def click_next_with_retry(tab, max_attempts=3) -> bool:
    for _ in range(max_attempts):
        next_link = await tab.select("li.next > a", timeout=5)
        if next_link is None:
            return False
        before = tab.url
        try:
            await next_link.click()
        except Exception:
            continue
        for _ in range(20):
            await tab.sleep(0.25)
            await tab.select("div.quote", timeout=2)
            if tab.url != before:
                return True
        if tab.url != before:
            return True
    return False

Pages 1→2→3 : progression normale ; les auteurs ont changé comme prévu.

Défilement infini avec conditions d’arrêt

Pour les pages ne comportant pas de contrôle de lien « Suivant », faites défiler jusqu’à ce qu’une condition d’arrêt soit atteinte : un marqueur de fin, un nombre maximal de résultats ou un nombre maximal de boucles.

async def scroll_until_plateau(tab, max_rounds=20):
    history = []
    plateau = 0
    for round_i in range(1, max_rounds + 1):
        items = await tab.select_all("div.item")
        count = len(items)
        end = await tab.query_selector("#end-marker")
        history.append(count)
        if end is not None:
            return {"reason": "end_marker", "count": count}
        if len(history) >= 2 and history[-1] == history[-2]:
            plateau += 1
        else:
            plateau = 0
        if plateau >= 2:
            return {"reason": "count_plateau", "count": count}
        await tab.evaluate("window.scrollTo(0, document.body.scrollHeight)")
        await tab.sleep(0.4)
    return {"reason": "max_rounds", "count": history[-1] if history else 0}

Arrêt à end_marker 40 éléments après 4 cycles.

Clics, onglets, iframes et fonction evaluate (courte)

  • Nouvel onglet/nouvelle fenêtre : browser.get(url, new_tab=True) / new_window=True (API du package).
  • tab.evaluate(expr) pour les sondes de défilement/DOM — privilégiez les sélecteurs lorsque c’est possible.
  • Cookies : traitez les fichiers JAR comme des informations confidentielles ; masquez-les dans les journaux (remarque de sécurité, ce n’est pas un tutoriel approfondi sur les cookies).
  • Captures d’écran : await tab.save_screenshot(...) ont fonctionné lors de notre test de diagnostic.

Identité : agent utilisateur, mode headless et Xvfb

Une identité fixe ou une rotation

Faites correspondre l’agent utilisateur à la version de Chrome que vous lancez réellement. Une rotation aléatoire qui ne correspond pas à Chrome/154 (ou tout autre navigateur que vous utilisez) est un indice facile à repérer. Privilégiez une identité de bureau stable par profil de travailleur.

Signaux « headless » sur Chrome 154 (06/10/2026)

Uniquement sur les pages de diagnostic publiques (bot.sannysoft.com; areyouheadless renvoie une erreur 502 pour les deux modes) :

Mode

navigator.userAgent

navigator.webdriver

headless=True

contient HeadlessChrome/154.0.0.0

False

headless=False sous Xvfb

contient Chrome/154.0.0.0 (pas de mode sans affichage)

False

Le 154.0.0.0 chaînes de caractères intégrées correspondent à la forme abrégée de l'agent utilisateur de Chrome ; il ne s'agit pas d'une faute de frappe par rapport à la 154.0.8037.57 . Nodriver peut effacer navigator.webdriver dans les deux modes, tandis que le mode « headless » continue de s’identifier via la chaîne d’agent utilisateur. Cela suffit à lui seul pour de nombreuses vérifications simples.

En mode « headé » sous Xvfb, c'est le réglage par défaut pour les tâches nécessitant une discrétion maximale

Sur les serveurs Linux sans écran physique :

# pattern
xvfb-run -a python your_scraper.py
# or export DISPLAY to a running Xvfb and start(headless=False)

Utilisez le mode « headless » pour les sandbox internes et l’intégration continue (CI). Utilisez le mode « headed » avec Xvfb lorsque la cible analyse les chaînes d’agent utilisateur du mode « headless ».

Proxys sans divulgation de votre adresse IP

Proxys non authentifiés vs proxys authentifiés

Ne vous fiez pas aux configurations de drapeaux Chrome proposées par d’autres blogs. Avant d’automatiser les pages d’authentification derrière un proxy, vérifiez sur votre version de Chrome que l’adresse IP de sortie du navigateur correspond bien à celle du proxy — et non à celle de votre hôte.

Vérifiez toujours l’adresse IP de sortie

# Guard pattern — wire to your proxy stack; always assert exit IP before scraping
async def assert_exit_ip(tab, expected_subnet_prefix: str | None = None):
    tab2 = await tab.browser.get("https://httpbin.org/ip")  # or your IP echo
    await tab2.select("body", timeout=15)
    body = (await tab2.get_content()) if hasattr(tab2, "get_content") else None
    # parse JSON IP; compare to expected proxy IP; fail closed
    return body

Interrompez la tâche si l’adresse IP de sortie observée correspond à celle de votre hôte de centre de données. Effectuez cette vérification en production même lorsque le proxy « semble configuré ».

Proxys résidentiels et routage géographique

Lorsque le problème réside dans la réputation de l’adresse IP ou l’affinité avec un pays — et non dans l’automatisation du DOM —, acheminez le trafic via des proxys résidentiels ou transférez le travail du navigateur vers une requête via l’API du navigateur avec country set.

Exécution de nodriver en production

La plupart des tutoriels s’arrêtent avant cette étape. C’est là que les scrapers échouent.

Recette de conteneur (plan)

# Outline only — adapt paths and package names for your base image
FROM python:3.13-slim-bookworm
RUN apt-get update && apt-get install -y --no-install-recommends \
    wget gnupg ca-certificates fonts-liberation xvfb \
    && install Google Chrome / Chromium per your distro docs \
    && useradd -m scraper
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
USER scraper
ENV DISPLAY=:99
CMD ["sh", "-c", "Xvfb :99 -screen 0 1920x1080x24 & python worker.py"]

Remarques : exécutez en tant qu’utilisateur non root ; comprenez les indicateurs de sandbox de Chrome dans les conteneurs restreints ; conservez les profils sur un volume accessible en écriture si vous réutilisez des cookies durement acquis ; et masquez ces cookies dans les journaux.

Modèle de concurrence

Unité

Isolation

Utilisation typique

Onglets dans un même navigateur

Processus/cookies/empreinte partagés

Étapes associées au cours d’une même session

Plusieurs navigateurs

Meilleur isolement, plus de RAM

Tâches parallèles

Processus/conteneurs multiples

Isolation maximale

Flottes de travailleurs

Concurrence limitée par un asyncio.Semaphore (ou des travailleurs en file d’attente). Mesurez la consommation de mémoire par navigateur sur des pages simulant des conditions de production, sur votre matériel.

Nouvelles tentatives, délais d’expiration et reprise après panne

  • Délai d’expiration par navigation avec wait_for / select budgets.
  • Classez les erreurs : délai d’expiration, page vide, page de vérification, plantage de Chrome.
  • Redémarrez le processus du navigateur après des erreurs de protocole répétées — et pas seulement l’onglet.
  • Limiter les tentatives de reconnexion grâce à un recul aléatoire.

Observabilité

  • Métriques : succès / blocage / délai d’expiration / vide par hôte.
  • Capture d’écran en cas d’échec vers un stockage d’objets.
  • Masquage des journaux : identifiant/mot de passe du proxy, Cookie en-têtes, les sauvegardes de stockage.

Validation de la sortie

Un « succès » de type HTTP affiché dans le navigateur ne constitue pas du code HTML exploitable. Détectez les titres de défi, les coques d’application vides et les sélecteurs obligatoires manquants avant d’écrire dans l’entrepôt. Associez cette approche à la logique de validation de votre pile logicielle de scraping globale (pour éviter d’être bloqué).

Vérification de la réalité anti-bot

Périmètre (06/10/2026) : pages publiques d’empreintes digitales/de diagnostic uniquement. Aucune cible commerciale Cloudflare ou DataDome (conformément à la politique éditoriale de cet article).

Cible

Résultat

bot.sannysoft.com

Chargé ; utile pour comparer les identifiants d'agent utilisateur (UA) et les données de WebDriver

arh.antoinevastel.com/bots/areyouheadless

502 Bad Gateway — résultat non concluant

Pages commerciales de Cloudflare / DataDome / Turnstile

Non couvert dans ce guide

Tab.verify_cf Aide

Présent dans la version 0.50.3 ; à considérer comme facultatif et à vérifier sur vos cibles

Considérez toute affirmation du type « nodriver contourne X » sans test daté et bien défini comme du marketing. Pour les cibles renforcées, consultez également les conseils sur la manière de contourner Cloudflare.

Choisissez votre outil (matrice par contrainte)

Versions vérifiées via l'index PyPI le 06/10/2026. Le niveau de discrétion est qualitatif, il ne s'agit pas d'un score.

Outil

Langage

Navigateurs

Synchrone/asynchrone

Licence (signal PyPI)

Mode furtif

Charge opérationnelle

nodriver 0.50.3

Python

Famille Chromium

asynchrone

AGPL-3.0

CDP, sans WebDriver

Vous exécutez Chrome + affichage

zendriver 0.17.1

Python

Famille Chromium

asynchrone

AGPL

Fourche de la lignée nodriver

Similaire

Playwright 1.63.0

nombreux

Chromium, Firefox, WebKit

les deux

Apache-2.0 (projet)

Automatisation poussée, plus facile à détecter en l'état

Gestion des pilotes allégée

Patchright 1.63.0

Python

Canal Chromium/Chrome

les deux

voir la licence

Playwright corrigé

Similaire à Playwright

Camoufox 0.5.7

Python

Firefox (personnalisé)

les deux

MIT (PyPI)

Angle d'empreinte digitale de Firefox

Opérations binaires du navigateur

SeleniumBase 4.55.1 (mode CDP)

Python

Chromium

les deux

MIT

Option mode CDP

Poids du framework

API du navigateur hébergé

n'importe quel (HTTP)

Géré

n/a

commercial

Exploité par le fournisseur

Coûts d’exploitation locaux minimaux

Choix en fonction des contraintes : licence, moteur de navigateur, besoins de synchronisation et responsable de la disponibilité.

Développement ou achat : nodriver auto-hébergé ou navigateur hébergé

Facteurs influant sur le coût

  • Problèmes d’affichage / Xvfb / GPU sur les machines virtuelles cloud
  • Mémoire vive et CPU par session Chrome simultanée
  • Proxys résidentiels ou mobiles
  • Temps d’ingénierie pour les mises à jour de Chrome et les sélecteurs défectueux
  • Gestion des blocages et astreinte
  • Stockage des captures d’écran et masquage des données personnelles
  • Vérification de la conformité à l’AGPL

Optez pour l’auto-hébergement lorsque vous avez besoin de longues sessions interactives, d’extensions personnalisées ou d’une intégration étroite avec vos réseaux internes. Achetez ce service si vous souhaitez vous décharger des SLA de requêtes/réponses, de la géolocalisation et de la maintenance des navigateurs.

Nodriver → Table de conversion de l’API du navigateur

L’API du navigateur est un appel REST vers https://api.webscrapingapi.com/v1— et non un socket CDP actif (confirmation du produit). Noms des paramètres vérifiés dans les paramètres de l’API le 06/10/2026 :

Modèle Nodriver

Paramètre de l’API du navigateur

Attente du CSS (select / wait_for)

wait_for_css

Préparation du cycle de vie

wait_until (domcontentloaded, load, networkidle0, networkidle2)

Délai supplémentaire

wait_for (ms)

Séquences de clics / défilement / saisie

js_instructions

Capture d'écran

screenshot=1 (+ screenshot_options)

Extraction de champs

extract_rules

Contexte géographique

country

Appareil / fenêtre d'affichage

device, window_width, window_height

Documentation : requête GET, rendu JavaScript.

Lorsque l'API Scraper ( render_js=1 ) suffit

render_js=1) suffit

Si vous avez uniquement besoin d'un instantané HTML rendu sans script d'interaction en plusieurs étapes, commencez par l'API Scraper et le rendu JavaScript. Passez à l'API Browser lorsque vous avez besoin d'actions ordonnées, d'attentes de sélecteur, de captures d'écran ou de règles d'extraction dans une seule requête. Comparez les options dans la section « API d'accès Web ».

Dépannage (symptôme → cause → solution)

D'après les erreurs que nous avons reproduites le 06/10/2026 :

Symptôme

Cause probable

Solution

select renvoie None après délai d'expiration

Sélecteur incorrect ou contenu jamais affiché

Corrigez le sélecteur ; effectuez une vérification avec wait_for si vous avez besoin d'un échec définitif

TimeoutError à partir de wait_for

Attendu — échec après le budget

Allongez le délai d'attente ou enregistrez une capture d'écran

ProtocolException: 'DOM.enable' wasn't found

xpath sur notre Chrome 154 + 0.50.3

Utiliser le CSS ; retester l'XPath après les mises à jour

UA contient HeadlessChrome

headless=True

Exécuter sous Xvfb pour les cibles sensibles

Tâches en attente / Event loop is closed après le script

asyncio.run arrêt vs écouteurs nodriver

Préférer uc.loop(); assurez-vous browser.stop() dans finally

Vider la liste des citations après « succès »

Navigation trop précoce / mauvaise page

Attendre à nouveau le sélecteur de contenu ; valider le nombre

Pagination bloquée

Référence du lien suivant obsolète

Re-select contrôle « Suivant » à chaque tentative

Le proxy « fonctionne », mais le site détecte l'adresse IP locale

Configuration incorrecte de l'authentification/du proxy

Protection de l'adresse IP de sortie avant le scraping

Utilisation responsable

N'effectuez le scraping que sur les pages publiques éligibles, respectez les fichiers robots.txt, les conditions d'utilisation et la législation en vigueur, limitez au maximum la collecte de données personnelles et sécurisez vos identifiants. Consultez la page « Utilisation responsable des données Web ». Pour en savoir plus sur le mode « headless » en général, consultez la page « Navigateur Python en mode headless ».

FAQ

Qu'est-ce que nodriver ?

Une bibliothèque Python asynchrone qui contrôle Chromium via CDP sans Selenium ni chromedriver. Ce guide utilise la version 0.50.3 (vérifiée le 06/10/2026).

En quoi nodriver diffère-t-il d’undetected-chromedriver et de Selenium ?

Selenium utilise WebDriver + un binaire de pilote. Undetected-chromedriver applique des correctifs à ce chemin d’accès. Nodriver contourne WebDriver et communique avec le CDP de manière asynchrone.

Nodriver est-il détectable ?

Il supprime certains signaux d’automatisation, mais ne masque pas les fuites d’adresse IP, de TLS, de comportement ou d’agent utilisateur en mode headless. Lors de nos tests, navigator.webdriver n'a False, mais le mode « headless » restait visible HeadlessChrome dans l’UA.

Nodriver fonctionne-t-il en mode « headless » ?

Oui, pour le scraping fonctionnel sur notre sandbox. Pour les cibles sensibles à la discrétion, privilégiez le mode « headed » + Xvfb compte tenu de la différence d’UA que nous avons mesurée.

Comment utiliser un proxy authentifié avec nodriver sans divulguer mon adresse IP ?

Configurez le proxy pour votre version de Chrome, puis vérifiez toujours l’adresse IP de sortie avant de lancer la tâche.

Nodriver peut-il contourner Cloudflare ou DataDome ?

Ne généralisez pas à partir des pages de diagnostic pour les produits de bots commerciaux. Si vous utilisez verify_cf la version 0.50.3, vérifiez-le sur vos propres cibles avant de vous y fier.

Nodriver, Playwright ou Zendriver : lequel choisir ?

Faites votre choix en fonction de la licence, du moteur de navigateur, des besoins en synchrone/asynchrone et de la responsabilité des opérations — consultez le tableau ci-dessus. Playwright s’impose pour la prise en charge de plusieurs moteurs ; nodriver/zendriver sont optimisés pour une approche furtive CDP sous licence AGPL ; l’API de navigateur hébergée est la solution idéale lorsque vous ne souhaitez pas utiliser de flottes Chrome.

Comment exécuter Nodriver dans Docker ou sur un serveur Linux ?

Installez Chrome, exécutez-le en mode « headed » sous Xvfb (ou acceptez les compromis liés au mode « headless »), en tant qu’utilisateur non root, avec des workers limités. Utilisez le modèle de Dockerfile comme point de départ et validez l’image dans votre environnement.

Combien de navigateurs nodriver puis-je exécuter en parallèle ?

Testez-le sur votre matériel et avec vos pages cibles. Ne vous fiez pas aux affirmations concernant la concurrence sans disposer de vos propres chiffres.

L'utilisation de nodriver à des fins commerciales est-elle sans risque (licence) ?

Le paquet que nous avons installé est sous licence AGPL-3.0. Faites-le examiner par un conseiller juridique avant de l’intégrer à un service réseau. Ceci ne constitue pas un avis juridique.

Quand dois-je utiliser une API de navigateur hébergée plutôt que nodriver ?

Lorsque vous souhaitez des attentes/actions/données géographiques REST sans avoir à faire fonctionner Chrome, ou lorsque les coûts liés au proxy et à la maintenance sont prépondérants. Convertissez vos attentes nodriver en wait_for_css / js_instructions et comparez une requête.

Étape suivante

Choisissez une page déjà gérée par votre script nodriver et envoyez-la via une seule requête API de navigateur avec wait_for_css (et js_instructions si vous faites défiler la page ou cliquez). Comparez le temps de développement, les modes de défaillance et le format des résultats. Pour les volumes importants, les données géographiques ou la livraison gérée, contactez l’équipe WebScrapingAPI.


À propos de l'auteur

Suciu Dan, cofondateur @ WebScrapingAPI

Suciu Dan

cofondateur

Suciu Dan est le cofondateur de WebScrapingAPI et rédige des guides pratiques destinés aux développeurs sur le web scraping avec Python et Ruby, ainsi que sur les infrastructures de proxy.

Comment gérer les URL de redirection Google /goto et les jetons CAES dans un outil de collecte de données SERP
Les techniques de web scraping

Comment gérer les URL de redirection Google /goto et les jetons CAES dans un outil de collecte de données SERP

TL;DR: En bref : Les URL Google /goto avec un jeton CAES, ainsi que les anciens wrappers /url, sont des couches de redirection, pas des destinations : un scraper de SERP qui traite chaque href comme final fausse le suivi de positions et les bases de liens. Préférez une API SERP structurée lorsqu'elle renvoie les liens de destination. Si vous devez analyser le HTML, classez chaque href, dédoublonnez les redirections et résolvez-les avec un simple GET. Ne déchiffrez pas CAES.

Suciu Dan14 min read
Lire l'article
En-têtes de réponse HTTP dans cURL : Tous les drapeaux, techniques et recettes de script
Les techniques de web scraping

En-têtes de réponse HTTP dans cURL : Tous les drapeaux, techniques et recettes de script

TL;DR: cURL cache les en-têtes de réponse par défaut. Utilisez -i pour voir les en-têtes avec le corps, -I pour une requête HEAD qui ne renvoie que les en-têtes, -v pour un débogage complet de la requête/réponse, et -D pour enregistrer les en-têtes dans un fichier. Pour les scripts modernes, cURL 7.83+ vous permet d'extraire des en-têtes individuels ou de les récupérer tous en JSON avec l'option -w write-out.

Suciu Dan13 min read
Lire l'article
Qu'est-ce qu'un navigateur sans tête ? Architecture, cas d'utilisation et principaux outils
Les techniques de web scraping

Qu'est-ce qu'un navigateur sans tête ? Architecture, cas d'utilisation et principaux outils

TL;DR: Un navigateur sans tête est un navigateur web qui fonctionne sans interface graphique visible, entièrement contrôlé par du code ou des instructions en ligne de commande. Les développeurs utilisent les navigateurs headless pour les tests automatisés, le web scraping, le contrôle des performances et, de plus en plus, pour alimenter les agents d'intelligence artificielle. Ce guide explique comment ils fonctionnent en interne, quand les choisir plutôt qu'un navigateur classique, et quels sont les frameworks qui valent la peine d'être utilisés.

Suciu Dan16 min read
Lire l'article

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.