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

To take bulk website screenshots, put your URLs in a file, loop over them with a browser automation tool such as Playwright, wait for each page to reach the state you need, and save one image per URL. The example below captures either the visible viewport, the full scrollable page, or a selected element, while reporting failures instead of silently skipping them.

Choose the capture workflow before writing code

Bulk capture is not one fixed screenshot setting. Decide what every image must contain, where the work may run, and how you will handle pages that fail.

Viewport, full page, or one element

  • Viewport: records only the pixels currently visible in the browser window. Use it for responsive-layout checks or above-the-fold previews.
  • Full page: Playwright captures the entire scrollable page as if it were displayed in one tall image. This is useful for documentation and visual archives, but very long pages can create large files.
  • Element: capture a component identified by a CSS selector, such as main article or #pricing, when browser chrome and unrelated page content are not wanted.

Playwright’s screenshots API accepts parameters for image format, clip area, quality and other output controls. You can save directly to disk or request image bytes for later processing.

Files or bytes

Saving each result to a predictable directory is simplest for an archive. Returning bytes is better when a later step uploads images, computes differences, or stores them in object storage without creating temporary files.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Sale
Philips 24 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 241V8LB
  • CRISP CLARITY: This 23.8″ Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
  • WORK SEAMLESSLY: This sleek monitor is virtually bezel-free on three sides, so the screen looks even bigger for the viewer. This minimalistic design also allows for seamless multi-monitor setups that enhance your workflow and boost productivity
  • A BETTER READING EXPERIENCE: For busy office workers, EasyRead mode provides a more paper-like experience for when viewing lengthy documents

Local browser or hosted batch service

Local automation gives you control over browser state, authentication, headers, JavaScript, post-processing and where page data is handled. You must install browsers, maintain the script and decide how to limit load on target sites. A hosted service removes that browser setup, but you must review its current batch limits, privacy terms, failure reporting and pricing for your workload. The available descriptions do not establish a universal winner on cost, privacy or reliability.

Prepare a URL list and output policy

Create a UTF-8 text file named urls.txt, with one absolute URL per line:

https://example.com
https://example.org/docs
https://www.example.net/pricing

Blank lines and lines beginning with # can be ignored. Use HTTPS where the site supports it, and keep URLs that contain query strings intact. Decide in advance:

  • the output format (PNG for lossless comparison, JPEG or WebP for smaller files);
  • viewport dimensions and whether a retina scale is required;
  • whether the page must be full length or clipped to an element;
  • how long navigation may wait before it is considered failed;
  • the maximum number of pages captured at once;
  • whether authenticated pages need cookies, headers or a separate browser context.

Do not assume one fixed delay works on every site. A page may load content after navigation through JavaScript, an API call, a selector becoming visible, or a user interaction. Wait for the condition that represents the state you actually want.

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

Build a dependable Playwright batch script

Install Playwright

  1. Install a current Node.js release for your operating system.
  2. Create a project and add Playwright:
mkdir bulk-shots
cd bulk-shots
npm init -y
npm install playwright
npx playwright install chromium

The browser download is required on a new machine. In a restricted environment, install the browser through your organization’s approved image or cache and ensure the executable is available to the process.

Rank #2
Philips 22 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 221V8LB
  • CRISP CLARITY: This 22 inch class (21.5″ viewable) Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • 100HZ FAST REFRESH RATE: 100Hz brings your favorite movies and video games to life. Stream, binge, and play effortlessly
  • SMOOTH ACTION WITH ADAPTIVE-SYNC: Adaptive-Sync technology ensures fluid action sequences and rapid response time. Every frame will be rendered smoothly with crystal clarity and without stutter
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors

Runnable Node.js example

Save this as bulk-screenshots.mjs. It reads urls.txt, captures pages sequentially by default, creates safe filenames, and writes a CSV-style result log. Change FULL_PAGE or ELEMENT_SELECTOR to select the output you need.

import { chromium } from 'playwright';
import { readFile, mkdir, appendFile } from 'node:fs/promises';
import path from 'node:path';

const INPUT = 'urls.txt';
const OUTPUT_DIR = 'shots';
const FULL_PAGE = true;
const ELEMENT_SELECTOR = '';       // e.g. '#pricing'; empty means the page
const FORMAT = 'png';              // 'png' or 'jpeg'
const NAVIGATION_TIMEOUT = 45_000;
const READY_TIMEOUT = 15_000;

function fileName(rawUrl, index) {
  const u = new URL(rawUrl);
  const host = u.hostname.replace(/[^a-z0-9.-]/gi, '_');
  const slug = (u.pathname.replace(/^/+|/+$/g, '') || 'home')
    .replace(/[^a-z0-9.-]+/gi, '-').slice(0, 90);
  return `${String(index).padStart(4, '0')}-${host}-${slug}.${FORMAT}`;
}

const lines = (await readFile(INPUT, 'utf8')).split(/r?n/)
  .map(s => s.trim()).filter(s => s && !s.startsWith('#'));
await mkdir(OUTPUT_DIR, { recursive: true });
await appendFile(path.join(OUTPUT_DIR, 'results.csv'), 'index,url,status,file,errorn');

const browser = await chromium.launch();
const context = await browser.newContext({ viewport: { width: 1440, height: 900 } });
const page = await context.newPage();
page.setDefaultNavigationTimeout(NAVIGATION_TIMEOUT);

for (let i = 0; i < lines.length; i++) {
  const url = lines[i];
  const file = fileName(url, i + 1);
  try {
    await page.goto(url, { waitUntil: 'domcontentloaded' });
    // Replace this with a site-specific selector when possible.
    await page.waitForLoadState('networkidle', { timeout: READY_TIMEOUT }).catch(() => {});
    if (ELEMENT_SELECTOR) {
      const element = page.locator(ELEMENT_SELECTOR).first();
      await element.waitFor({ state: 'visible', timeout: READY_TIMEOUT });
      await element.screenshot({ path: path.join(OUTPUT_DIR, file), type: FORMAT });
    } else {
      await page.screenshot({
        path: path.join(OUTPUT_DIR, file),
        type: FORMAT,
        fullPage: FULL_PAGE
      });
    }
    await appendFile(path.join(OUTPUT_DIR, 'results.csv'), `${i + 1},"${url}",ok,"${file}",n`);
    console.log(`OK ${url} -> ${file}`);
  } catch (error) {
    const message = String(error.message || error).replace(/[rn,]/g, ' ');
    await appendFile(path.join(OUTPUT_DIR, 'results.csv'), `${i + 1},"${url}",failed,,"${message}"n`);
    console.error(`FAILED ${url}: ${message}`);
  }
}
await browser.close();

Run it with:

node bulk-screenshots.mjs

Each successful image goes in shots/. The results.csv file lets you retry only failed URLs instead of recapturing the entire list.

Wait for the page state you need

domcontentloaded means the initial document is parsed; it does not prove that images, client-rendered components or late API responses are ready. networkidle can be useful for quiet pages but may never occur on sites with analytics, polling or streaming connections. A more reliable pattern is to wait for a meaningful selector:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
await page.goto(url, { waitUntil: 'domcontentloaded' });
await page.locator('[data-test="report-ready"]').waitFor({ state: 'visible', timeout: 15000 });

If the site has no readiness marker, combine a bounded timeout with a condition you can observe, such as a heading becoming visible. A fixed delay is a fallback, not a universal guarantee.

Load lazy images before a full-page shot

Some pages request images only when their containers approach the viewport. For those pages, scroll in increments and return to the top before capturing:

Rank #3
Sale
Dell 24 Monitor - SE2426H - 23.8-inch FHD (1920x1080) 144Hz 1ms Display, in-Plane Switching (IPS) Technology, AMD FreeSync™, TÜV 3-Star 2X HDMI, Tilt
  • Clear visuals. Fluid motion: A 144Hz refresh rate and 1ms MPRT deliver smooth, tear‑free motion across work, gaming, and streaming for clearer, more fluid viewing.
  • Eye comfort: TÜV Rheinland 3‑star* certification reduces harmful blue light while preserving stunning color quality without compromise. *TÜV Rheinland 3-star eye comfort certification.
  • Wide viewing angle: Get consistent views across a wide 178° /178° viewing angle.
  • In-Plane Switching (IPS): See excellent color accuracy and consistency across wide viewing angles with In-plane Switching (IPS) technology.
  • Ultra-thin bezels: Maximize your viewing experience with thin bezels.
await page.evaluate(async () => {
  await new Promise(resolve => {
    let y = 0;
    const step = Math.max(400, window.innerHeight);
    const timer = setInterval(() => {
      window.scrollBy(0, step);
      y += step;
      if (y >= document.body.scrollHeight) {
        clearInterval(timer);
        window.scrollTo(0, 0);
        resolve();
      }
    }, 150);
  });
});
await page.screenshot({ path: 'page.png', fullPage: true });

This triggers common viewport-based lazy loading, but a site can use a different mechanism. Confirm a representative page before applying the method to thousands of URLs.

Control concurrency without overloading sites

Multiple Playwright Page instances can run in one browser. Parallel workers reduce wall-clock time but consume CPU, memory, bandwidth and file descriptors, and increase simultaneous requests to every target host. There is no generally correct concurrency number in the available documentation. Start conservatively, measure resource use and server responses, and lower it when you see timeouts, throttling or high memory use.

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

A practical design is one browser context per account or cookie set, with a small worker pool. Give each worker its own page, record the URL and error, and retry only transient failures with an increasing delay. Do not retry a permanent 404 or a page that explicitly blocks automation indefinitely.

Timing and politeness controls

  • Use a per-navigation timeout so one broken URL cannot stall the queue forever.
  • Insert a delay between requests to the same host when the site is sensitive to bursts.
  • Respect robots policies, terms of service and any rate limits that apply to your use case.
  • Keep the browser window and device emulation consistent when images will be compared over time.

Authentication, headers and reproducibility

For private pages, create a browser context with the required cookies or use an approved login flow. Avoid putting passwords in urls.txt or source control. If a site varies by user agent, timezone, locale or viewport, set those values explicitly so a later run represents the same state. When a page depends on a custom request header, configure it at the context level and treat the header as a secret if it contains credentials.

Consent dialogs, newsletter prompts and chat widgets can obscure the page. You can dismiss them through a scripted click, hide known selectors with injected CSS, or capture only the relevant element. Keep these rules versioned alongside the script because a selector can change.

Rank #4
Samsung 27" Essential S3 (S36GD) Series FHD 1800R Curved Computer Monitor
  • CURVED FOR ENHANCED ENGAGEMENT: An immersive viewing experience with a curved monitor that wraps more closely around your field of vision; It creates a wider view, enhancing depth perception and minimizing peripheral distraction
  • SMOOTH PERFORMANCE FOR SEAMLESS CONTENT: Stay in the action when playing games, watching videos, or working on creative projects; The 100Hz refresh rate reduces lag and motion blur so you don't miss a thing in fast-paced moments¹
  • MORE GAMING POWER: Gain the edge with optimizable game settings; Color and image contrast can be adjusted to see scenes more vividly and spot enemies hiding in the dark; Game Mode adjusts any game to fill the screen so you can view every detail²
  • KEEP IT EASY ON THE EYES: Care for your eyes and stay comfortable, even during long sessions; Advanced eye comfort technology certified by TÜV reduces eye strain by minimizing blue light and reducing irritating screen flicker²
  • INCREASED VERSATILITY: Connect to more; Plug devices straight into your monitor for increased flexibility, making your computing environment even more convenient
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Failure handling and troubleshooting

Navigation timeout

Cause: the host is slow, unreachable, continually requests resources, or the timeout is too short. Fix: test the URL manually, raise the timeout for that class of page, wait for a specific selector instead of network idle, and retry transient network errors. Do not hide the failure in the output log.

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

Blank or partially rendered image

Cause: capture occurred before client rendering or lazy resources finished. Fix: wait for a content selector, scroll to trigger lazy loading, or use a site-specific readiness check. A longer arbitrary sleep may still fail when network conditions vary.

Element not found

Cause: the selector is wrong, the element is inside an iframe, or the page uses a different layout at the selected viewport. Fix: inspect the live DOM, target the correct frame, and verify the selector at the same viewport and authentication state used by the script.

Consent banner, popup or chat covers the page

Cause: an overlay appears after navigation. Fix: click its accept or close control when permitted, inject CSS to hide the overlay, or capture the content element directly. Make the rule conditional so it does not hide legitimate page content.

Out-of-memory or crashed browser

Cause: too many concurrent pages, extremely long documents or large image buffers. Fix: lower concurrency, process the list in chunks, close pages promptly, use JPEG or WebP where lossless output is unnecessary, and avoid retaining screenshot bytes in an array.

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.
Best Value
Sale
Sceptre New 22-Inch Gaming Monitor, FHD 1080p, Up to 144Hz, HDMI, DisplayPort, Built-in Speakers, Machine Black (E225W-FW144 Series, 2026)
  • 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
  • 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
  • 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.

Repeated blocks or CAPTCHAs

Cause: the site detects automated traffic or requires an interactive challenge. Fix: stop increasing concurrency, follow the site’s access rules, use an authorized authenticated workflow, and record the URL as unavailable rather than attempting to defeat a challenge.

Hosted batch capture: when to use it

A hosted service can accept a pasted URL list, CSV or JSON array and operate real browsers for you. For example, url2image says its worker scrolls pages before capture so lazy-loaded images are in place. Treat those as vendor claims and verify current limits, retention, privacy, supported states and failure reporting before sending sensitive URLs. A hosted workflow is attractive when installing browsers and maintaining workers is more work than the capture itself; local Playwright is preferable when page data must stay in your environment or you need custom browser logic.

Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server for developers. Its batch capture accepts up to 100 URLs per call, while the API also supports full-page shots with lazy images loaded, element selectors, custom CSS and JavaScript, click actions, selector or network-idle waits, request blocking, headers, cookies, user agents, timezone and geolocation. You can choose PNG, JPEG or WebP, resize images, set a cache TTL, create signed links, submit asynchronous jobs with signed webhooks, and capture PDFs.

The one-call form is:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo documentation for the complete parameter list. Python and Node.js equivalents are below.

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.
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
const data = Buffer.from(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('shot.webp', data));

ScreenshotNeo accepts cookie and consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets before capture; each cleanup step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and response headers identify the page verdict and whether it was billed. An MCP server provides take_screenshot, get_page_info and capture_pdf tools to Claude, Cursor and other MCP clients. Every plan includes all features: 1,000 screenshots per month are free with no card, and paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.

Cost, privacy and reliability checklist

  • Volume: count successful captures, retries and any need for PDFs or multiple viewport variants.
  • Privacy: identify whether URLs, cookies, authenticated content and images may leave your network.
  • State: document viewport, device scale, locale, timezone, cookies, headers and readiness conditions.
  • Failures: preserve per-URL status, error text and retry history.
  • Maintenance: budget for browser updates and selector changes in a local script, or for reviewing hosted-service limits and terms.

Frequently asked questions

Can I capture 100 URLs in one run?

Yes. A local script can read any list size and process it in chunks. ScreenshotNeo supports bulk capture of up to 100 URLs per call; split larger lists into multiple calls.

Should I use PNG or JPEG?

Use PNG for pixel-accurate comparisons and text-heavy pages. Use JPEG or WebP when smaller files matter and minor compression is acceptable.

Why does full-page capture differ from a stitched scroll recording?

Full-page mode asks the browser to render the scrollable document as one image. Dynamic content, sticky elements and viewport-dependent scripts can still behave differently from a manual scroll, so validate the pages that matter most.

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

Can a screenshot script log in automatically?

It can use an authorized browser context with cookies or a scripted login, but credentials must be protected and the site’s terms and security controls followed.

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.