Recommended Free Tools
Use a controlled Playwright worker on a VPS in an Indian cloud region: read URLs from a file, capture each page with a bounded number of workers, and save a separate result for every URL. Playwright provides the browser screenshot operation; you must design the queue, retries, naming, and storage around it. AWS lists Mumbai (ap-south-1) and Hyderabad (ap-south-2) as India regions, but confirm that the VM and any other services you need are available before choosing one.
Plan the batch before launching browsers
A bulk screenshot job is an application workflow, not a built-in Playwright queue. Start with a plain-text file containing one public URL per line or a CSV with a URL column. If the input comes from a sitemap, extract and validate its page URLs before running captures; do not assume every sitemap entry is suitable for a screenshot.
Choose input and output conventions
- Normalize and validate each URL, and decide how to handle duplicate URLs. Deduplicating avoids repeated work; preserving duplicates may be appropriate if the input represents distinct requests.
- Use a stable per-URL filename. A hash of the normalized URL avoids unsafe characters and collisions caused by similar page paths. Keep a manifest mapping the original URL to its output filename and status.
- Write each run into its own directory, such as
run-2026-10-03/, so reruns do not silently overwrite earlier artifacts. - Decide whether output stays on the VPS or is copied to object storage. Persist the manifest and logs as well as images, so a failed process does not erase the record of completed work.
These are implementation choices, not behavior specified by Playwright’s screenshot API.
Capture one page with Playwright Python
Install Python and Playwright on the VPS, install a supported browser, and write a small capture function. Playwright’s Python page API saves an image with page.screenshot(path="screenshot.png"); set full_page=True when you want the full scrollable page rather than only the visible viewport. Its screenshot API also supports buffers, element or locator screenshots, and format and quality parameters. See the Playwright Python screenshot documentation.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Repair Windows errors before they cause bigger problems3Fix the driver behind crashes, sound loss and screen glitches#1 Best Overall
- TRUE PLUG-AND-PLAY HOME SERVER: Forget complex VPS setups or command lines. Simply connect power and Ethernet to start hosting immediately with zero technical skills required. This managed, all-in-one appliance is the easiest way to run blogs (compatible with WordPress), private applications, and bots directly from home using your own domain.
- NO MONTHLY SUBSCRIPTION FEES: Stop renting server space. Enjoy a one-time hardware purchase model with absolutely no recurring hosting fees for typical usage. The system includes a generous monthly traffic allowance that covers the needs of almost all personal and small business websites, allowing the device to pay for itself quickly.
- INSTANT ONE-CLICK APP LIBRARY: Instantly deploy over 50 curated open-source applications without hassle. The diverse ecosystem includes essential tools, compatible with WordPress, Ghost, Nextcloud (for private cloud storage), Joomla, and OpenClaw. Perfect for content management, e-commerce, private email, and business tools.
- INCLUDES FREE SSL & ENTERPRISE SECURITY: Get professional performance and safety without the extra costs. Seamlessly integrate your existing custom domain or utilize the included free subdomain. Your sites are automatically secured with free SSL certificates, built-in DDoS protection, and global CDN acceleration.
- TOTAL DATA PRIVACY & OWNERSHIP: Keep your digital assets secure on your own local hardware, not on third-party "big tech" servers. Designed for privacy-conscious individuals, creators, and small businesses seeking platform independence. Includes an intuitive web management portal for complete peace of mind.
from pathlib import Path
from playwright.sync_api import sync_playwright
url = "https://example.com"
out = Path("screenshot.png")
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(url, wait_until="domcontentloaded", timeout=60_000)
page.screenshot(path=str(out), full_page=True)
browser.close()
This minimal example demonstrates a single capture, not a tested VPS setup or a bulk-processing guarantee. A page may continue rendering after DOM content loads; sites with dynamic content can need a different wait condition, an explicit selector wait, or a short delay chosen for that site. Full-page screenshots can also take longer and use more memory for very tall pages.
Wrap captures in a bounded worker loop
For a batch, reuse a browser process and create a page for each URL, while limiting how many captures run at once. The following synchronous example keeps execution sequential, which is a conservative starting point: it reads one URL per line, skips blank lines, assigns collision-resistant names, retries each capture a bounded number of times, and records success or failure in a CSV manifest. Increase concurrency only after observing memory use, CPU load, network behavior, and target-site responses on your chosen VM.
Rank #2
from pathlib import Path
from urllib.parse import urlsplit
import csv
import hashlib
import time
from playwright.sync_api import sync_playwright
INPUT = Path("urls.txt")
OUT_DIR = Path("screenshots")
MANIFEST = OUT_DIR / "manifest.csv"
MAX_ATTEMPTS = 3
TIMEOUT_MS = 60_000
OUT_DIR.mkdir(parents=True, exist_ok=True)
urls = [line.strip() for line in INPUT.read_text(encoding="utf-8").splitlines() if line.strip()]
with MANIFEST.open("w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["url", "file", "status", "attempts", "error"])
writer.writeheader()
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
for url in urls:
key = hashlib.sha256(url.encode("utf-8")).hexdigest()[:16]
filename = f"{key}.png"
status, error, attempts = "failed", "", 0
for attempts in range(1, MAX_ATTEMPTS + 1):
page = browser.new_page()
try:
response = page.goto(url, wait_until="domcontentloaded", timeout=TIMEOUT_MS)
if response is not None and response.status >= 400:
raise RuntimeError(f"HTTP {response.status}")
page.screenshot(path=str(OUT_DIR / filename), full_page=True)
status = "success"
break
except Exception as exc:
error = str(exc)
time.sleep(min(attempts, 5))
finally:
page.close()
writer.writerow({"url": url, "file": filename, "status": status,
"attempts": attempts, "error": error})
f.flush()
browser.close()
For production use, add URL scheme validation, structured logs, a run identifier, and explicit handling for partial outputs. The example retries all exceptions for simplicity; a robust worker should distinguish transient navigation or network errors from permanent failures such as invalid URLs, access denials, or authentication requirements. Use a bounded retry count and backoff rather than retrying indefinitely. A process supervisor or job runner can restart a crashed worker, but completed URLs should be detectable from the manifest so they are not needlessly repeated.
Concurrency, memory, and storage
Do not launch an unbounded number of browsers or pages. Browser processes and large pages consume RAM and CPU, and parallel navigation can overload a small VPS or trigger target-site rate limits. The cited Playwright screenshot documentation does not prescribe a concurrency limit or VPS size, so choose both from measured workload behavior rather than treating a particular instance size as universally sufficient.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchRank #3
- TRUE PLUG-AND-PLAY HOME SERVER: Forget complex VPS setups or command lines. Simply connect power and Ethernet to start hosting immediately with zero technical skills required. This managed, all-in-one appliance is the easiest way to run blogs (compatible with WordPress), private applications, and bots directly from home using your own domain.
- NO MONTHLY SUBSCRIPTION FEES: Stop renting server space. Enjoy a one-time hardware purchase model with absolutely no recurring hosting fees for typical usage. The system includes a generous monthly traffic allowance that covers the needs of almost all personal and small business websites, allowing the device to pay for itself quickly.
- INSTANT ONE-CLICK APP LIBRARY: Instantly deploy over 50 curated open-source applications without hassle. The diverse ecosystem includes essential tools, compatible with WordPress, Ghost, Nextcloud (for private cloud storage), Joomla, and OpenClaw. Perfect for content management, e-commerce, private email, and business tools.
- INCLUDES FREE SSL & ENTERPRISE SECURITY: Get professional performance and safety without the extra costs. Seamlessly integrate your existing custom domain or utilize the included free subdomain. Your sites are automatically secured with free SSL certificates, built-in DDoS protection, and global CDN acceleration.
- TOTAL DATA PRIVACY & OWNERSHIP: Keep your digital assets secure on your own local hardware, not on third-party "big tech" servers. Designed for privacy-conscious individuals, creators, and small businesses seeking platform independence. Includes an intuitive web management portal for complete peace of mind.
- Start with one worker and a small representative URL set; observe memory, CPU, execution time, and failure patterns.
- Raise concurrency gradually and stop increasing it if the VM runs short of memory, pages become less reliable, or destination sites start refusing requests.
- Keep captures and manifests on persistent storage. For long jobs, copy artifacts to object storage or another durable destination during or after the run.
- Use per-job directories and write status incrementally. This makes a restart recoverable and keeps one run’s output from mixing with another’s.
Choose an Indian cloud region carefully
A capture worker’s region determines its network path to sites and may affect how a site presents content. It does not grant permission to bypass a site’s access rules, bot checks, or geographic restrictions.
AWS
AWS lists Asia Pacific (Mumbai), ap-south-1, with opt-in not required, and Asia Pacific (Hyderabad), ap-south-2, with opt-in required. Check the AWS Regions and Availability Zones table and enable Hyderabad for the account if you select it. AWS also advises considering service and feature availability and proximity to the majority of users. A listed region does not establish that every VM type or supporting service is offered there.
Rank #4
Azure
Azure’s geography page lists Central India, South India, West India, and India South Central among regions available or coming soon. The status can vary, and not every VM family or dependent service should be assumed available in every region. Check the current Azure geography and regional service availability information for the exact VM and storage services you need.
Choose only after checking the actual service matrix, capacity, account access, and the capture origin your workflow requires. Neither provider’s regional listing alone is a sizing recommendation.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Handle failures and imperfect pages
Navigation success and screenshot-file creation do not prove that a page rendered as a human visitor would see it. Timeouts, JavaScript-heavy pages, anti-bot controls, authentication walls, consent prompts, and exceptionally long pages can change the result. Treat these as operational possibilities, not guarantees about Playwright or any cloud provider.
Common symptoms and fixes
- Navigation timeout: Check whether the destination is slow or never reaches the selected load condition. Use a suitable timeout and wait strategy for that site; record failures rather than blocking the entire batch indefinitely.
- Blank or incomplete capture: The page may render content after navigation completes. Wait for a meaningful selector or a site-appropriate delay before taking the screenshot.
- Access denied, CAPTCHA, or bot check: The destination is restricting automated access. Respect its rules and seek authorized access; moving the VPS to another region is not a legitimate bypass.
- Authentication wall: Public-page capture code will not produce authenticated content. If you are authorized to capture it, supply an appropriate authenticated browser context and protect credentials; do not put secrets in logs or output names.
- Missing browser executable or launch failure: Confirm that the Playwright browser installation matches the installed Playwright package and that the VPS has the runtime dependencies needed by that browser.
- Memory exhaustion or worker crash: Reduce concurrent pages, limit very large full-page captures, and persist progress frequently. Resume from recorded outcomes rather than restarting blindly.
- Repeated failures or duplicate artifacts: Keep retries bounded, record the final outcome and attempt count, and use deterministic filenames plus a run manifest.
Managed options when you do not want to operate the worker
For a screenshot API alternative to running browser infrastructure, ScreenshotNeo is the first service to try: it removes consent banners, popups, and chat widgets before capture, bills only clean shots, and offers a paid plan starting at $5 for 3,000 screenshots.
Other managed approaches exist, but verify current availability and terms before adopting them. AddScreenshots describes asynchronous bulk capture for URL lists, sitemaps, and domains, with output stored in the customer’s cloud repository; its API reference may be an older-crawled page, so confirm the live endpoint and terms. See AddScreenshots API reference. Microsoft Playwright Workspaces is described as managed cloud browser infrastructure; its cited overview lists Australia East, East Asia, East US, Japan East, Switzerland North, West Europe, and West US 3, but not India in that displayed list. That is a snapshot, not a promise about future availability. See Microsoft Playwright Workspaces overview.
Or skip the browser setup
ScreenshotNeo takes a screenshot through one GET request. The Python example below saves the returned image; use the ScreenshotNeo API documentation for parameters and response details.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Quick Recap
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com"},
timeout=90,
)
open("shot.webp", "wb").write(r.content)
Cookie banners, popups, and chat widgets are removed before the shot. Bot checks, blank pages, and failed loads are never billed. Its MCP server lets AI agents take screenshots, and 1,000 screenshots a month are free with no card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month, with no card required.
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.

