The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →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 articleor#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.
#1 Best Overall
- 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.
Build a dependable Playwright batch script
Install Playwright
- Install a current Node.js release for your operating system.
- 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
- 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:
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
- 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.
Recommended Free Tools
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
- 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
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.
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.
Best Value
- 【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.
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.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →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.
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.

