What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Puppeteer and Playwright can collect information from pages that render in a browser, but no plugin or setting makes a scraping session reliably invisible. Before automating a site, check its terms and robots.txt, prefer an approved API or export, and stop if the site denies access or presents a challenge. The guide below shows how to collect permitted page data without trying to conceal automation or defeat access controls.
What “stealth scraping” can—and cannot—mean
“Stealth” is not a dependable property you can switch on. Browser automation may be recognized through multiple signals. Browserless, a hosted browser provider, describes detection involving mismatches among browser fingerprints, network hints, and behavior, and cautions against assuming a plugin solves advanced detection. That is Browserless’s characterization, not an independent benchmark. Its article is dated January 23, 2026: Browserless on stealth scraping.
As an Amazon Associate I earn from qualifying purchases.
This guide does not provide instructions for disguising automation, bypassing CAPTCHAs, or evading a site’s controls. A technical ability to automate a browser is not permission to access or copy its content. Puppeteer’s security policy says the calling code is responsible for ensuring its capabilities are used safely and as intended: Puppeteer security policy.
Free tools Windows power users keep installed
One-click scans. No signup required.
Check permission and access rules first
- Look for an approved route. Check whether the site offers a documented API, data export, or permission process. Prefer that route when it meets your needs.
- Read the site’s current terms. Requirements differ by site and can change. This guide cannot determine whether scraping a particular site is lawful or permitted in your jurisdiction.
- Check
robots.txt. RFC 9309 specifies crawler instructions that crawlers are requested to honor. Check those instructions alongside the site’s terms and other applicable requirements; robots.txt alone does not settle legal permission. See RFC 9309. - Identify your automation honestly, collect only what you need, and use conservative request rates. No universal numeric rate is established here; follow the site’s published access instructions.
- Stop on denial or challenge. If the site returns a denial, CAPTCHA, or other access challenge, do not try to defeat it. Seek authorization or use an approved access method.
Cloudflare’s sample terms language, updated May 5, 2026, addresses automated scraping for AI development under stated conditions. It is an example for site operators, not a universal rule for scrapers or every website; Cloudflare says the language is informational and not legal advice. Read Cloudflare’s sample terms.
#1 Best Overall
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
Choose an API, local browser, or hosted browser
Use an API or export when available
A documented API or export is usually the first route to evaluate because it gives you an approved interface rather than requiring a browser to interpret the page. Confirm that its scope and terms cover the fields and frequency you need.
Use Puppeteer or Playwright when rendering is necessary
Browser automation is useful when the permitted information appears only after client-side rendering or interaction. Keep the job narrow: visit only authorized pages, extract only necessary fields, and avoid parallelism or repeated requests beyond the site’s instructions.
Consider hosted infrastructure for operational needs
Browserless documents connections for Puppeteer and Playwright, browser sessions, content scraping, and crawl APIs in its API overview. Those documented capabilities may be relevant if you need hosted browser infrastructure, but the available evidence does not establish comparative performance or pricing. Compare providers on authorization, data handling, session requirements, concurrency, reliability, observability, and cost before choosing one.
Rank #2
- Brand: Wiley
- Set of 2 Volumes
- A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers
Collect permitted data with Puppeteer
The example below visits one page, reads its title and headings, and closes the browser. Replace the example URL and selector with a page and fields you are authorized to access. Install Puppeteer in your project with npm install puppeteer, then save this as an ES module such as scrape.mjs and run node scrape.mjs.
import puppeteer from 'puppeteer';
const url = 'https://example.com/';
const browser = await puppeteer.launch({ headless: true });
try {
const page = await browser.newPage();
const response = await page.goto(url, {
waitUntil: 'domcontentloaded',
timeout: 30000,
});
if (!response || !response.ok()) {
throw new Error(`Page did not load successfully: ${response?.status() ?? 'no response'}`);
}
const result = await page.evaluate(() => ({
title: document.title,
headings: [...document.querySelectorAll('h1')].map((node) => node.textContent.trim()),
}));
console.log(JSON.stringify(result, null, 2));
} finally {
await browser.close();
}
domcontentloaded waits for the document to be parsed, not for every image or late-loading component. If the specific authorized data appears later, wait for a relevant selector with a bounded timeout rather than sleeping for an arbitrary long period. If the page is denied, challenged, or fails to load, stop the job rather than attempting to circumvent the response.
Collect permitted data with Playwright
Install the library with npm install playwright and install its browser with npx playwright install chromium. Save the following as scrape.mjs and run node scrape.mjs. As with the Puppeteer example, use only a URL and data you are permitted to access.
Rank #3
import { chromium } from 'playwright';
const url = 'https://example.com/';
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage();
const response = await page.goto(url, {
waitUntil: 'domcontentloaded',
timeout: 30000,
});
if (!response || !response.ok()) {
throw new Error(`Page did not load successfully: ${response?.status() ?? 'no response'}`);
}
const result = await page.evaluate(() => ({
title: document.title,
headings: [...document.querySelectorAll('h1')].map((node) => node.textContent.trim()),
}));
console.log(JSON.stringify(result, null, 2));
} finally {
await browser.close();
}
The two examples deliberately use ordinary browser automation and report unsuccessful responses. Neither attempts to hide its identity or evade a site’s access controls. For a multi-page task, add only authorized URLs, keep concurrency conservative, and stop when access is refused.
Reliability, performance, and cost decisions
- Wait for the right condition. A fixed delay can waste time or still finish too early. Prefer a specific selector for data that loads after the initial document, with a timeout that lets your job fail clearly.
- Keep the workload bounded. Browser sessions consume resources, and repeated navigation can burden the target. Process only the pages and fields needed, and follow published rate limits rather than guessing a universal safe rate.
- Make failures visible. Record the URL, response status, and failure reason for your own operational diagnosis. Do not treat a block or CAPTCHA as a prompt to retry through another identity or technique.
- Compare local and hosted operation on your constraints. Local execution gives you control over the runtime; hosted browser services can provide managed sessions and APIs. The cited Browserless documentation confirms those categories of capability, but does not establish which option is faster, cheaper, or more reliable for your workload.
Troubleshooting common failures
Navigation times out
The page may be slow, unavailable, or waiting on resources beyond the chosen load condition. Check that the URL is correct and that the site permits the request. Use a bounded timeout and a narrower readiness condition appropriate to the authorized data. Do not respond to a timeout by trying to bypass the site’s controls.
The script reports no successful response
The example throws if navigation yields no response or a non-success status. Check the printed status and distinguish an unavailable page from a denial. If access is denied, stop and seek permission or an approved channel.
Rank #4
The page loads but the field is missing
The selector may not match the current page, or the data may be rendered after the document event. Inspect the page structure for the authorized field and wait for its specific selector with a finite timeout. If the site requires a login or other authorization, use only an approved account and method.
A CAPTCHA or challenge appears
Stop. Do not automate a solution, disguise the browser, or keep retrying. Contact the site owner or use a documented API or other approved access method.
The browser will not launch
Confirm that the package is installed in the project and that the browser installation completed. For Playwright, run npx playwright install chromium. If the environment restricts browser processes, use an environment the site and your organization authorize, or evaluate a hosted browser option.
Best Value
- JavaScript Jquery
- Introduces core programming concepts in JavaScript and jQuery
- Uses clear descriptions, inspiring examples, and easy-to-follow diagrams
Or skip the browser setup
If your goal is a clean image or PDF rather than extracting structured page data, ScreenshotNeo can return a screenshot or PDF with one GET request. Its pre-capture cleanup accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server offers take_screenshot, get_page_info, and capture_pdf for AI agents and MCP clients. The Free plan includes 1,000 shots per month without a card; paid plans start at $5 for 3,000 shots. See ScreenshotNeo and the API documentation.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
This captures a visual page output; it is not a substitute for a permitted data-extraction API. Sign up for 1,000 free screenshots a month with no card.
Frequently Asked Questions
Does robots.txt give permission to scrape a website?
No. RFC 9309 describes crawler instructions requested to be honored; check the site’s terms and applicable requirements as well.
Can Puppeteer or Playwright guarantee that a scraper will not be detected?
No. Detection may use multiple signals, and no plugin or setting guarantees an undetected session.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




