How to Use Puppeteer Stealth for Web Scraping

Puppeteer provides a powerful way to automate Google Chrome for web scraping and testing. But its headless nature also makes it easy for sites to detect and block.

This is where Puppeteer Stealth becomes invaluable. It hides signs of automation, preventing blocks and allowing unfettered scraping.

  • The scale of bot blocking across the web.
  • Technical details on how Puppeteer gets fingerprinted.
  • Using Puppeteer Stealth in Python and JavaScript scrapers.
  • Combatting blocks with proxies and human patterns.
  • Benchmarking and optimizing evasion strategies.
  • Limitations and superior alternatives.

The Growing Scale of Bot Blocking

Bot mitigation is a $7.5+ billion industry projected to surpass $19 billion by 2027 according to Grand View Research. Billions are invested in blocking automated scrapers and crawlers.

Over 30% of websites now block traffic from common scraping tools according to SiteLock. Nearly all mainstream sites utilize fingerprinting and behavior analysis to stop bots.

Without proper evasion, scrapers suffer blocked IPs, CAPTCHAs, and failed extractions. Mastering evasion is now mandatory.

Next, let’s examine how sites fingerprint Puppeteer itself before seeing how to combat this.

How Websites Fingerprint Headless Chrome & Puppeteer

To understand Puppeteer Stealth, we first need to grasp how sites identify Puppeteer automation. Common methods include:

User Agent Checks

The default Puppeteer user agent contains unique identifiers like “HeadlessChrome”. Trivial to detect.

Chrome Driver Detection

Puppeteer relies on ChromeDriver to control the browser. Its presence is easy to fingerprint.

Canvas and Font Fingerprinting

Headless Puppeteer lacks certain font and canvas rendering quirks that identify real browsers.

Navigator Properties

Properties like navigator.webdriver being truthy exposes Puppeteer and automation tools.

Headless Mode Detection

The headless flag set when launching Puppeteer is detectable.

Request Anomalies

Subtle differences in headers, SSL handshakes, and other metadata expose automation.

Crawler Traps

Hidden links and honeypots trigger scripts when crawled but not when rendered in a real browser.

These signals allow sites to discern Puppeteer crawlers from real user traffic quickly using fingerprinting and static detectors.

Now let’s examine how Puppeteer Stealth subverts this fingerprinting.

What Exactly is Puppeteer Stealth?

Puppeteer Stealth is a plugin for Puppeteer Extra that hides signs of headless automation.

It works by:

  • Spoofing or removing Puppeteer-specific navigator properties.
  • Masking the headless Chrome runtime flag.
  • Modifying the user agent string.
  • Hooking into render events to mimic real browser behaviors.

This makes Puppeteer extraordinarily hard to differentiate from real user-driven browsers.

Using Puppeteer Stealth in JavaScript Scrapers

Let’s see how to leverage Puppeteer Stealth within a Node.js scraper script.

First install the Extra and Stealth packages:

npm install puppeteer-extra puppeteer-extra-plugin-stealth

Now launch Puppeteer using Stealth:

const puppeteer = require('puppeteer-extra');

// Require stealth plugin
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Use stealth plugin

puppeteer.launch({headless: false}).then(async browser => {

  // Browser automation with stealth  

This configures Puppeteer with Stealth before launching the browser.

There are also customization options to tailor stealth functionality.

And now your JS scripts leverage Puppeteer Stealth for effective evasion!

Using Puppeteer Stealth with Python via Pyppeteer

For Python web scraping, we can control Puppeteer headless Chrome using the Pyppeteer package.

First install Pyppeteer:

pip install pyppeteer

Now use Pyppeteer to connect to a browser with Puppeteer Stealth enabled:

from pyppeteer import launch
from pyppeteer_stealth import stealth

async def main():

  browser = await launch(headless=False)
  page = await browser.newPage()

  # Enable stealth  
  await stealth(page)

  await page.goto('')
  # Extract data..

  await browser.close()


The stealth() method integrates Puppeteer Stealth before navigating to any pages.

This gives Python scripts enhanced evasion abilities alongside Node.js!

Enhancing Stealth Through Other Evasion Techniques

While Puppeteer Stealth provides powerful bot detection avoidance, combining it with additional techniques improves effectiveness even further against tough targets.

Residential Proxies

Proxify traffic through residential IP addresses to distribution requests and add IP diversity.

Randomized User Agents

Rotate randomized user agent strings on each request to mimic new users.

Human Behavior Patterns

Use random delays, mouse movements, clicks, and scrolls to appear human.

Disable Resource Loading

Prevent rendering unnecessary images, CSS, media files, etc to optimize performance.

Target Site Traffic Analysis

Fingerprint real visitor volumes, geo-sources, referrers, technologies etc. to blend in.

Layering tools like residential proxies on top of Puppeteer Stealth makes your web scrapers incredibly stealthy.

Limitations of Puppeteer Stealth Evasion

While Puppeteer Stealth provides excellent bot detection evasion, there are still limitations in some scenarios:

  • Stateful sites can detect automation from irregular cookie and storage access.
  • Advanced ML-based detection can still identify subtle patterns.
  • Doesn’t solve CAPTCHAs or additional challenges.
  • Fails to mask high volumes of requests from same IPs and accounts.
  • Unable to mimic complex browser rendering perfectly in all cases.

For these reasons, many scrapers turn to robust commercial proxy services in conjunction with Stealth:


Over 72M residential IPs with built-in browser automation. Powerful evasion but also expensive.


More affordable proxies starting at $300/month for 1M requests. Helpful toolkits.


Innovative “SurfResidence” IPs with highly realistic behavior. Prices start at $999/month.

These services hide the underlying traffic itself while Stealth masks the automation scripts, providing full coverage.

Benchmarking and Optimizing Evasion Strategies

There is no one-size-fits-all evasion strategy. Effectiveness varies site-by-site.

Analyze success metrics like pages scraped, blocks encountered, and IPs banned. Based on results, tweak techniques:

  • Use different proxy providers – Evaluate which networks see fewer blocks on the target site.
  • Adjust user agents – Try altering user agent format, order, and values to minimize anomalies.
  • Customize delays – Tune delay patterns and volumes to find the ideal human-like cadence.
  • Modify geolocation – Shift proxy geo targeting closer to expected visitor profiles.

Iteratively optimizing your evasion configuration maximizes scraping success and minimizes costs.


With dedication, savvy scraper engineers can achieve high success rates even on robustly protected sites.

Combining Puppeteer Stealth with commercial proxies, human-like behaviors, and constant iteration makes scraping confidently at scale possible.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *