Bypassing Cloudflare Error with Python

Oct 4, 2023 ยท 3 min read

Have you ever tried to scrape or automate interactions with a website, only to be stymied by Cloudflare bot protection? Those impenetrable CAPTCHAs and browser checks can bring your web scraping efforts to a halt.

But what if you could bypass Cloudflare altogether? In this article, we'll explore how to use Python and libraries like undetected-chromedriver to stealthily scrape sites protected by Cloudflare.

Overview of Cloudflare Bot Protection

Cloudflare is a content delivery network and DDoS protection service used by millions of websites. It also provides bot detection and mitigation capabilities, presenting challenges for scrapers.

When you try to interact with a Cloudflare-enabled site, it can detect bots through JavaScript challenges and browser fingerprinting. If it determines you are a bot, you may face infinite CAPTCHAs or find yourself blocked entirely.

Stealthily Bypassing Cloudflare with undetected-chromedriver

To bypass Cloudflare's protections, we need to fool it into thinking our scraper is a real human visitor. Here's where the Python library undetected-chromedriver comes in handy.

undetected-chromedriver is a Selenium-based Chrome driver that can mimic real human browser behaviors and evade bot mitigation services.

from undetected_chromedriver import Chrome

chrome = Chrome()

By using undetected-chromedriver instead of regular chromedriver, our script can stealthily navigate Cloudflare-protected sites without raising any red flags.

Some key advantages of undetected-chromedriver include:

  • Evades JavaScript challenges and browser fingerprinting checks
  • Spoofs a legitimate browser's User-Agent string
  • Implements mouse movements and clicks to appear human
  • Runs an actual Chrome browser in the background (no headless mode)
  • Putting It All Together to Bypass Cloudflare

    Let's walk through an example script leveraging undetected-chromedriver to scrape a Cloudflare-protected site:

    from undetected_chromedriver import Chrome
    import time
    chrome = Chrome()
    # Navigate to target url
    # Wait for some time to avoid bot detection
    # Extract data from site using Selenium
    data = chrome.find_element_by_id("data")

    The key steps are:

    1. Import undetected-chromedriver and create a Chrome instance
    2. Navigate to the target URL
    3. Wait briefly to appear human
    4. Use Selenium to extract data from the site
    5. Close the browser

    Because we are using undetected-chromedriver instead of regular chromedriver, Cloudflare sees us as a real visitor and does not block our scraping efforts.


    By leveraging tools like undetected-chromedriver, we can scrape and automate websites protected by Cloudflare's bot mitigation systems. The techniques covered in this article should give you a template for stealthy and stable web scraping, even on heavily fortified sites.

    Rather than building and managing your own cloudfare bypassing infrastructure, services like Proxies API handle all of this complexity for you.

    With Proxies API, you make a simple API request with the target URL. It will handle:

  • Rotating proxies and IP addresses
  • Rotating user agents
  • Solving captchas
  • Running JavaScript
  • And return the rendered HTML. No need to orchestrate the numerous steps required for reliable captcha solving.

    For example:

    curl ""

    This takes care of all the headaches of automation. No proxies, browsers, or captcha solving services to manage.

    Proxies API offers 1000 free API calls to get started. Check it out if you need to integrate robust captcha solving and proxy rotation in your projects.

    Browse by tags:

    Browse by language:

    The easiest way to do Web Scraping

    Get HTML from any page with a simple API call. We handle proxy rotation, browser identities, automatic retries, CAPTCHAs, JavaScript rendering, etc automatically for you

    Try ProxiesAPI for free

    curl ""

    <!doctype html>
        <title>Example Domain</title>
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />


    Don't leave just yet!

    Enter your email below to claim your free API key: