Pydoll connects directly to the Chrome DevTools Protocol. No WebDrivers, with human-like interactions, asynchronous performance and the ability to handle behavioral CAPTCHAs (e.g., Cloudflare Turnstile, reCAPTCHA v3), depending on IP reputation and interaction patterns.
Cloudflare captcha bypass example
Direct CDP integration to reduce complexity and increase reliability.
Clicks, navigation and typing that simulate human behavior.
Automate multiple tabs and tasks in parallel with asyncio.
Use tab.request
to automatically inherit cookies, CORS and session state.
Monitor, modify and fulfill requests with flexibility.
React to page, network and runtime events in real-time.
No complex setup. Install, import and automate.
pip install pydoll-python
Quick example:
import asyncio
from pydoll.browser.chromium import Chrome
async def main():
async with Chrome() as browser:
tab = await browser.start()
await tab.go_to('https://example.com')
title = await tab.execute_script('return document.title')
print(title)
asyncio.run(main())
Key capabilities with simple examples.
Process multiple tabs in parallel with a straightforward API.
import asyncio
from pydoll.browser.chromium import Chrome
async def scrape_page(url, tab):
await tab.go_to(url)
return await tab.execute_script('return document.title')
async def main():
browser = Chrome()
tab1 = await browser.start()
tab2 = await browser.new_tab()
titles = await asyncio.gather(
scrape_page('https://google.com', tab1),
scrape_page('https://github.com', tab2),
)
print(titles)
asyncio.run(main())
Multiple tabs: create and manage tab1
and tab2
in the same browser.
Parallel execution: use asyncio.gather
to run tasks simultaneously.
Consistent API: same API per tab, no boilerplate.
Make HTTP calls that inherit session, cookies and CORS from the browser.
from pydoll.browser.chromium import Chrome
async def main():
async with Chrome() as browser:
tab = await browser.start()
await tab.go_to('https://example.com/login')
# ... realize o login ...
response = await tab.request.get('https://example.com/api/user/profile')
print(response.json())
Shared session: browser cookies and auth automatically.
CORS respected: same policies as the browser.
Direct JSON: access response.json()
effortlessly.
Fine-grained Chrome behavior control with handy helpers.
from pydoll.browser.options import ChromiumOptions
options = ChromiumOptions()
options.set_default_download_directory('/tmp/downloads')
options.set_accept_languages('en-US,en,pt-BR')
options.prompt_for_download = False
Silent downloads: no prompts or dialogs.
Language and locale: adjust accept_languages
.
Less friction: disable download prompts and distractions.
Top questions about Pydoll, its features and use cases.
Pydoll is a Python library that controls the browser via the Chrome DevTools Protocol (CDP), eliminating WebDrivers. This reduces layers, improves reliability and gives direct access to advanced capabilities like page events, network interception and JavaScript execution in the real tab context.
It provides human-like interactions (movement, click, typing) and a helper to attempt Turnstile bypass. Effectiveness depends on IP reputation and interaction patterns. For critical flows, combine with quality proxies and good browsing practices.
With tab.request
you perform HTTP in the same context as the tab: cookies, session, headers and CORS are automatically inherited. Ideal for hybrid automation: log in via UI and then call the app's authenticated APIs with simplicity and speed.
- Concurrency: multiple tabs/processes with asyncio.gather
.
- Reactive events: listen to Page
, Network
and Runtime
to react in real-time.
- Browser preferences: control silent downloads, languages and internal policies via ChromiumOptions
.
Star it, contribute to the repo or sponsor the development.