DriversRecommendedOutdated drivers can make a good PC feel brokenScan driver issues before chasing fixes manually.Scan NowHalloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan Now×
Skip to content
World desk5 min

How to Take Screenshots of Multiple URLs in Parallel with Puppeteer

Use one Puppeteer browser and a bounded worker pool to capture multiple URLs, with unique output paths, deliberate navigation waits, and isolated failure handling.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

  1. Launch a browser with puppeteer.launch(), or connect to an existing browser.
  2. For each URL, open a page with browser.newPage() or a page in a chosen context.
  3. Navigate using a readiness condition suited to the site.
  4. Capture with page.screenshot({path: ...}), giving every job a distinct output path.
  5. 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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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
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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Dell Latitude 5420 14" FHD Business Laptop Computer, Intel Quad-Core i5-1145G7, 16GB DDR4 RAM, 256GB SSD, Camera, HDMI, Windows 11 Pro (Renewed)
  • 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
15.6 Inch Win 11 Laptop Computer, N4020, 4GB DDR4 RAM, 128GB Storage | LPDDR4 RAM, 180° Lay-Flat, Dual-Band WiFi, Type-C PD Fast Charging, Thin & Lightweight for Students, Home & Office, Gray
  • 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.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • 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.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Leave a Reply

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

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.