What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Use one Puppeteer browser, open a page for each URL, and call page.screenshot() after navigation. For a large URL list, put those jobs behind a bounded worker pool rather than launching every capture at once: Puppeteer does not prescribe a universal concurrency limit, so measure the right bound for your machine and target sites.
Set up a parallel capture workflow
Puppeteer supports multiple pages in one browser. The basic workflow is to launch the browser once, create a page per job, navigate to the URL, save a uniquely named screenshot, and close the page. The Puppeteer screenshots guide demonstrates Page.screenshot() and uses networkidle2 as an example navigation condition.
As an Amazon Associate I earn from qualifying purchases.
- Launch a browser with
puppeteer.launch(), or connect to an existing browser. - For each URL, open a page with
browser.newPage()or a page in a chosen context. - Navigate using a readiness condition suited to the site.
- Capture with
page.screenshot({path: ...}), giving every job a distinct output path. - Close each page when its job ends, then close the browser after the batch.
Here is a runnable Node.js example using a bounded worker pool. It creates one browser, limits the number of active captures, continues after individual URL failures, and prints a result for each URL.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Install Puppeteer
In an empty project directory, install Puppeteer:
npm install puppeteer
Capture a batch with bounded concurrency
Save this as capture.js and run it with node capture.js. The example uses three workers as a starting configuration, not a universal recommendation. Change the URLs and concurrency for your workload.
#1 Best Overall
- 14" diagonal, 1366x768 resolution, HD BrightView LED, Glossy NON-TOUCH Display
const puppeteer = require('puppeteer');
const path = require('path');
const urls = [
'https://example.com',
'https://www.wikipedia.org',
'https://nodejs.org',
];
const concurrency = 3;
function filenameFor(url, index) {
const host = new URL(url).hostname.replace(/[^a-z0-9.-]/gi, '_');
return path.resolve(`${String(index + 1).padStart(3, '0')}-${host}.png`);
}
async function main() {
const browser = await puppeteer.launch({ headless: true });
let nextIndex = 0;
const results = new Array(urls.length);
async function worker() {
while (true) {
const index = nextIndex++;
if (index >= urls.length) return;
const url = urls[index];
const page = await browser.newPage();
try {
const response = await page.goto(url, {
waitUntil: 'networkidle2',
timeout: 30000,
});
const output = filenameFor(url, index);
await page.screenshot({ path: output, fullPage: true });
results[index] = {
url,
status: response ? response.status() : null,
output,
};
} catch (error) {
results[index] = { url, error: error.message };
} finally {
await page.close();
}
}
}
try {
await Promise.all(
Array.from(
{ length: Math.min(concurrency, urls.length) },
() => worker()
)
);
} finally {
await browser.close();
}
for (const result of results) {
console.log(result);
}
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
The output path includes the URL host and its position in the list, avoiding collisions even when the same host appears more than once. The example takes full-page PNGs. Remove fullPage: true for a viewport-sized screenshot; set options such as type: 'jpeg' or type: 'webp' when the desired format is supported by the installed browser.
Choose page and browser-context boundaries
browser.newPage() creates a page in the browser’s default context. BrowserContext.newPage() creates one inside a specific context. Puppeteer’s BrowserContext.newPage() API documents that method, while its Browser.createBrowserContext() API and browser management guide describe context isolation.
| Need | Use | Effect |
|---|---|---|
| Pages should use shared login or browser state | Pages in the same context | They can use the context’s shared cookies and storage. |
| Jobs must not share authentication or storage | Separate browser contexts | Contexts isolate cookies and cache; the browser management guide also states local storage is not shared. |
Closing a context closes its pages. Use contexts deliberately: creating a separate context for every URL isolates state, while pages in one context are more appropriate when captures should share a session.
Rank #2
- 256 GB SSD of storage.
- Multitasking is easy with 16GB of RAM
- Equipped with a blazing fast Core i5 2.00 GHz processor.
Set concurrency and navigation readiness deliberately
There is no documented universal worker count
A worker pool is a practical way to keep an arbitrary batch from opening every page at once. The Puppeteer API documentation does not establish an optimal number of parallel captures or a throughput benchmark. Start with a modest bound, then measure memory, CPU, capture time, and failures in the environment where the batch will run. Also consider the target sites’ response behavior and any limits that apply to your use of them.
Choose a readiness condition for each type of page
The screenshots guide shows waitUntil: 'networkidle2', but that example is not a guarantee that every modern page is visually ready. Pages with persistent network traffic may never reach a network-idle condition, and pages that load images as the visitor scrolls may need additional handling before a full-page capture. If a page has a specific element that signals readiness, wait for that selector before capturing; otherwise, use a navigation condition that suits the site’s behavior and validate the resulting image.
Account for screenshot lifecycle coordination
Puppeteer’s Page API notes that during a screenshot in a browser context, calls to BrowserContext.newPage(), Browser.newPage(), and Page.close() wait for the screenshot to finish. Avoid treating those lifecycle operations as guaranteed independent work while a capture is in progress, and close each page in a finally block so errors do not leave pages open.
Rank #3
- WINDOWS 11 | STABLE PERFORMANCE: Powered by Intel Celeron N4020 processor and Windows 11 system, this laptop delivers stable performance for everyday computing tasks. It supports web browsing, online learning, document editing, email communication, and basic office work with optimized power efficiency, providing a practical and reliable experience for essential daily use for daily use.
- 15.6” FHD IPS DISPLAY: Features a 15.6-inch Full HD IPS display with narrow bezels, offering wider viewing angles and clearer image details compared to standard panels. The improved screen-to-body ratio enhances visual experience for study, reading, document work, and video playback, making it suitable for both productivity and entertainment use.
- 4GB DDR4 + 128GB eMMC STORAGE: Equipped with 4GB DDR4 memory and 128GB eMMC storage for everyday basics such as browsing, documents, email, and online learning platforms. The built-in TF card slot supports storage expansion up to 1TB, giving you more flexibility for files, photos, videos, and daily documents. TF card not included.
- CONNECTIVITY & PORTS: Includes 1× TF card slot, 2× USB 3.2 Gen1 ports, and 2× full-featured Type-C ports (USB 3.2 Gen1). The Type-C ports support data transfer, charging, and video output, enabling flexible connection with external devices such as monitors, storage, and peripherals for daily work and study use.
- LIGHTWEIGHT DESIGN | ONLINE COMMUNICATION: Designed with a slim, portable profile, this laptop is easy to carry for school, commuting, and travel. A built-in 1MP front camera supports online classes, video meetings, remote communication, and everyday conferencing. The 3300mAh battery works with the low-power system design to support practical daily use, while thermal optimization helps maintain quieter operation during extended tasks.
Handle failures without losing the batch
A URL can fail to load or a screenshot operation can throw. Catch errors inside each worker, record them with the URL, and let other workers continue. The sample reports HTTP status when navigation returns a response, but an HTTP error status does not necessarily make page.goto() throw; decide whether your application should keep or reject such captures.
Free tools Windows power users keep installed
One-click scans. No signup required.
- Navigation timeout: increase or otherwise adjust the timeout for slow sites, or select a readiness condition that does not wait on activity the page never finishes.
- Overloaded machine: lower the worker count and compare memory use and completion times before increasing it again.
- Missing or incomplete lazy content: wait for the relevant content or trigger the page behavior that loads it before the screenshot.
- Unexpected shared login state: create separate contexts for jobs that must not share cookies, cache, or local storage.
- Overwritten images: include a stable unique identifier or index in each output filename, rather than naming files only by hostname.
- One failure stops the whole run: catch exceptions per job and store a result for each URL instead of allowing one rejected capture to discard the batch.
Or skip the browser setup
If you need an HTTP call rather than managing Chromium pages, ScreenshotNeo is a website screenshot API. One GET request returns an image or PDF, and its options include bulk capture of up to 100 URLs per call. See the ScreenshotNeo API documentation for request parameters and response details.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
ScreenshotNeo accepts cookie and consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. It also has an MCP server with screenshot tools for AI agents. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Sign up for ScreenshotNeo’s free plan.
Sources and version scope
The Puppeteer documentation cited here includes the Screenshots guide, BrowserContext.newPage and Browser.createBrowserContext API documentation, the Page API, and the browser management guide. The cited guide and API pages identify documentation version 25.12.0 where specified; the Page API is the Next API documentation, so its content may change independently.
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.




