// stealth-first browser automation for python

Automate the browser.
Stay invisible.

Pydoll speaks the Chrome DevTools Protocol directly, so there is no WebDriver binary and no navigator.webdriver flag. It clicks and types like a person and injects a consistent fingerprint, so the anti-bot that stops ordinary scrapers waves it through.

Get started
$pip install pydoll-python
7,034 stars MIT python 3.10+ 0 detections · CreepJS · SannySoft · BrowserScan · BrowserLeaks
fingerprint · your browser×
+
about:your-fingerprint
detection surfacereading live
navigator.webdriverhuman
Every row above is a signal a site reads.
apply_fingerprint() overrides all of them as one identity that agrees with itself, and survives toString and prototype checks.
Your real browser passes. Pydoll makes an automated one look identical.

* clearing Cloudflare also depends on IP reputation and a matched profile

window closed — click to reopen
// why scrapers get blocked

The code is usually fine. The signals are not.

Sites profile three layers: what your browser says it is, how it behaves, and how it answers a challenge. Pydoll gives you a real answer for each, switchable exactly where you need it.

Send an automated visit through a real site's checks, and flip Pydoll's stealth.
01IdentityPASSED

User-Agent, navigator, WebGL, screen, timezone and locale, aligned into one identity that survives toString and reaches Web Workers.

navigator.webdriverfalse
webgl renderermatched
ua & client hintsaligned
await tab.apply_fingerprint(profile)
02BehaviorPASSED

Center-clicks and 50ms keystrokes are a fingerprint. Pydoll curves the cursor along a Bezier path and types with a human rhythm.

await el.click(humanize=True)
03ChallengePASSED

When a protected page throws the Turnstile checkbox, Pydoll detects and clicks it. Honest caveat: clearing it still leans on your IP.

verified — human
async with tab.expect_and_bypass_cloudflare_captcha():
site response: 200 OK — request allowed
// pydoll vs the webdriver stack

What a direct CDP connection buys you

Selenium-style tools drive Chrome through a WebDriver binary that announces itself. Pydoll removes that layer and builds the stealth in.

PydollSelenium / WebDriver tools
navigator.webdriverfalsetrue
Driver binarynonerequired, version-matched
Fingerprint injectionbuilt inmanual or none
Humanized inputbuilt innone
TransportCDP over WebSocketWebDriver HTTP
Concurrencynative asynciosync + threads
Setuppip installdriver download + PATH
// zero to automation

Install, import, automate

No drivers, no PATH, no version-matching. A full async session in a dozen lines.

search.py
import asyncio
from pydoll.browser import Chrome
from pydoll.constants import Key

async def main():
  async with Chrome() as browser:
    tab = await browser.start()
    await tab.go_to('https://google.com')

    box = await tab.find(name='q')
    await box.type_text('Pydoll', humanize=True)
    await tab.keyboard.press(Key.ENTER)

asyncio.run(main())
$python search.py
google.com
what search.py does, live
// beyond stealth

A full automation toolkit

Everything you reach for on a real scraping job, in one typed, async-native library.

network.py01 / 06
// sponsors

The companies keeping Pydoll alive

Their support keeps the project maintained and growing, and every deal below is exclusive to Pydoll users.

The Web Scraping Club

The #1 newsletter dedicated to web scraping. Read their full, independent review of Pydoll.

read the review →
NodeMaven

High-quality proxies for scraping and automation. ZIP targeting, 99.9% uptime, no KYC.

PYDOLL3535% offPYDOLL4040% off ISP
NiuProxy

Rotating residential proxies: 10TB at $0.35/GB or 1TB at $0.50/GB for Pydoll users.

PAY210% off recharge
Proxy-Seller
Premium proxies · code PYDOLL 15% off
Thordata
190+ locations · 1GB free
TestMu AI
AI-native testing by LambdaTest
Swiftproxy
Proxies for automation
+ Your logo
Become a sponsor

Help us reach 10k stars

The next milestone unlocks Firefox support, a big step that opens a whole new range for the library. Momentum is the incentive that makes a feature that large worth taking on.

7,034 / 10,00070%
// faq

Questions, answered

Why does Pydoll avoid WebDriver?
WebDriver adds a binary that sets navigator.webdriver to true and needs version-matching to your browser. Pydoll connects straight to Chrome over the DevTools Protocol, removing that layer, that flag, and the whole class of driver-mismatch errors, while giving direct access to events, network interception and JS execution in the real tab.
Does it really pass bot detection?
Out of the box it reports navigator.webdriver: false and shows no automation flags. With apply_fingerprint() and humanize=True it scores zero detections across CreepJS, SannySoft, BrowserScan and BrowserLeaks. Honest caveat: clearing challenges like Cloudflare Turnstile also depends on your IP reputation and on the profile matching your host OS and Chrome version. Pydoll gives you the tools, not a magic bypass.
What is fingerprint injection?
apply_fingerprint() overrides User-Agent, Client Hints, navigator, WebGL, screen, fonts, timezone and locale as one coherent identity. The point is consistency: a single overridden signal that contradicts the others is a stronger giveaway than an untouched browser, so Pydoll changes them together.
How does concurrent automation work?
Pydoll is async-first, so you create tabs with await browser.new_tab() and run them together with asyncio.gather. Each tab keeps its own session and state, giving true parallel automation without threads.

Open source, and staying that way

Pydoll is MIT licensed. Read the source, ship with it, contribute, or sponsor a maintainer doing this mostly solo.

7,034+stars on GitHub
MITopen source license
Firefoxnext, at 10k stars