Skip to content

pydoll

- - - None
0.0.0 (1 Feb 2025) Jun 01 2024

Pydoll is a Python library for browser automation that uses the Chrome DevTools Protocol (CDP) directly, designed to be undetectable by anti-bot systems. Unlike Selenium-based tools, Pydoll does not use WebDriver and avoids the common detection vectors that anti-bot systems look for.

Key features include:

  • Native CDP communication Connects directly to Chrome/Chromium via CDP websocket without intermediary drivers, avoiding the automation flags and fingerprints that WebDriver-based tools leave behind.
  • Event-driven architecture Built around an async event system that can listen for and react to browser events like network requests, console messages, and DOM changes.
  • Network interception Can intercept, modify, and mock network requests and responses, useful for blocking unnecessary resources or modifying API responses during scraping.
  • Async-first design Fully asynchronous API built on Python's asyncio for efficient concurrent automation.
  • Clean API Provides a high-level, Pythonic API for common browser automation tasks while still allowing direct CDP command execution for advanced use cases.
  • Multi-browser support Can manage multiple browser instances and pages concurrently.

Pydoll fills a similar niche to nodriver and camoufox — browser automation with a focus on avoiding detection — but takes a different approach by providing more granular control over CDP communication and network interception.

Highlights


anti-detectcdpasync

Example Use


```python import asyncio from pydoll.browser import Chrome from pydoll.constants import By

async def main(): async with Chrome() as browser: # Open a new page page = await browser.new_page() await page.go_to("https://example.com")

    # Find and interact with elements
    search_input = await page.find_element(By.CSS, "input[name='q']")
    await search_input.type_text("web scraping")

    submit_btn = await page.find_element(By.CSS, "button[type='submit']")
    await submit_btn.click()

    # Wait for results and extract content
    await page.wait_element(By.CSS, ".results")
    results = await page.find_elements(By.CSS, ".result-item")

    for result in results:
        title = await result.get_text()
        print(title)

    # Network interception example
    await page.enable_network_interception()
    # intercept and analyze API calls made by the page

asyncio.run(main()) ```

Alternatives / Similar


12,519 3.5.5 (2024-02-17 17:18:36 ago) Sep 04 2020 compare
camoufox new
7,089 0.4.11 (2025-01-29 09:33:18 ago) Mar 01 2024 compare
nodriver new
4,003 0.48.1 (2025-11-09 05:57:23 ago) Jan 15 2024 compare
718 1.9.4 (2024-10-22 01:41:19 ago) Jul 22 2022 compare
5,944 v0.6.1 (2024-03-02 18:08:29 ago) Feb 23 2022 compare
34,072 4.43.0 (2026-04-10 06:47:01 ago) Apr 25 2008 compare
14,506 1.58.0 (2026-01-30 15:09:24 ago) Feb 24 2021 compare
87,251 0.12.6 (2026-04-02 07:55:13 ago) Nov 01 2024 compare
primp new
504 1.2.2 (2026-04-03 07:11:15 ago) Jun 01 2024 compare
1,751 0.7.1 (2024-07-13 09:07:25 ago) Feb 23 2022 compare
skyvern new
21,046 1.0.29 (2026-04-02 14:42:44 ago) Feb 01 2024 compare
1,837 0.5.1 (2026-01-19 16:59:35 ago) Dec 28 2012 compare
4,321 4.0.97 (2026-01-06 07:45:54 ago) Oct 01 2023 compare
1,001 0.9.2 (2024-12-01 02:55:27 ago) Feb 23 2022 compare
4,193 3.5 (2020-06-16 13:27:02 ago) Apr 25 2014 compare

Other Languages

86,137 1.59.1 (2026-04-11 23:54:46 ago) Jan 23 2015 compare
rod new
6,853 v0.116.2 (2024-07-12 11:52:28 ago) Sep 23 2022 compare
94,086 2.11.2 (2023-04-11 04:13:00 ago) May 29 2018 compare
stagehand new
22,012 3.2.1 (2026-04-10 21:10:37 ago) Oct 29 2024 compare
7,293 3.3.6 (2023-03-01 12:19:02 ago) May 15 2018 compare
12,937 chromedp (2026-04-01 00:05:30 ago) May 10 2021 compare
3,062 v2.4.0 (2026-01-08 05:29:21 ago) Jul 17 2018 compare
Was this page helpful?