nodriver
nodriver is a Python library for browser automation that communicates directly with the browser via the Chrome DevTools Protocol (CDP), without relying on Selenium or chromedriver. It is the successor to undetected-chromedriver, created by the same author, and is designed from the ground up to be undetectable by anti-bot systems.
Key advantages over traditional browser automation:
- No chromedriver dependency Communicates directly with Chrome/Chromium via CDP websocket, eliminating the most common detection vector (chromedriver fingerprint).
- Undetectable by default
Does not set the
navigator.webdriverflag, does not inject automation-related JavaScript, and avoids CDP detection patterns that anti-bot systems look for. - Fast and lightweight Without the Selenium/WebDriver protocol overhead, nodriver is significantly faster at launching browsers and executing commands.
- Async-first Built entirely on Python's asyncio, enabling efficient concurrent browser automation.
- Simple API Clean, Pythonic API that is easier to use than raw CDP or Selenium.
nodriver is particularly useful for scraping websites protected by advanced anti-bot systems like Cloudflare, DataDome, or PerimeterX, where standard Selenium or Playwright setups get detected and blocked.
Highlights
anti-detectcdpasyncfast
Example Use
```python import nodriver as uc import asyncio
async def main(): # Launch browser - undetected by default browser = await uc.start()
# Open a new tab and navigate
tab = await browser.get("https://example.com")
# Wait for an element and interact with it
search_box = await tab.find("input[name='q']")
await search_box.send_keys("web scraping")
# Click a button
button = await tab.find("button[type='submit']")
await button.click()
# Wait for navigation and extract content
await tab.wait_for("div.results")
results = await tab.query_selector_all("div.result")
for result in results:
title = await result.query_selector("h3")
print(await title.get_text())
# Take a screenshot
await tab.save_screenshot("results.png")
browser.stop()
asyncio.run(main()) ```
Alternatives / Similar
camoufox
new
pydoll
new
browser-use
new
primp
new
skyvern
new
botasaurus
new