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 DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PC×
FREEDOM251

Freedom251 › Blog › CSV

How to Bulk Capture Screenshots from a CSV of URLs with PagePeeker

By Freedom251 Team · · 7 min read

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

You can process a CSV with PagePeeker by running a script that sends one request per URL to its documented V2 thumbnail endpoint and saves each response. PagePeeker’s reviewed documentation describes per-URL requests, not a native CSV import or batch-capture endpoint, so this is a client-side loop—not a built-in bulk feature.

What you need before starting

  • A CSV file with a clearly named url column containing absolute page URLs, such as https://example.com/.
  • Python 3 installed on a machine that can make HTTP requests.
  • For account-associated requests, the PagePeeker account code, kept out of public client-side code. PagePeeker recommends using the code for server-side calls and warns that exposing it can let others consume your quota.

The example below uses Python’s standard library. It writes each response to a numbered file and records failures in the terminal. It is a starting point, not a live-account test; confirm the account-specific endpoint and options before relying on it for a production run.

As an Amazon Associate I earn from qualifying purchases.

Choose the thumbnail size

PagePeeker documents these standard V2 thumbnail dimensions. Premium accounts may have additional sizes.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Size value Documented dimensions Typical consideration
t 90 × 68 px Small previews
s 120 × 90 px Compact lists
m 200 × 150 px Larger previews
l 400 × 300 px Detailed thumbnail display
x 480 × 360 px Largest documented standard thumbnail

These are thumbnail outputs, not full-page images. PagePeeker describes full-page capture as a premium-account feature, with options including custom page width and maximum height, compression, thumbnail renditions, overlay text, and wait settings. Check the full-page capture details against your required dimensions and whether you need content below the fold.

Run a CSV capture loop in Python

PagePeeker documents the V2 request pattern as http://{entrypoint}.pagepeeker.com/v2/thumbs.php?size={size}&code={code}&refresh={refresh}&wait={wait}&url={url}. The documented entrypoints are free and api. The script builds that request with URL-encoding utilities instead of concatenating raw page URLs into the query string.

  1. Save your file as urls.csv, with a header named url.
  2. Save the script below as capture_csv.py.
  3. Run python capture_csv.py from the directory containing the CSV.
import csv
import os
import time
from pathlib import Path
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen

CSV_FILE = Path("urls.csv")
OUT_DIR = Path("screenshots")
ENTRYPOINT = "free"  # Use the entrypoint appropriate for your account.
SIZE = "x"           # t, s, m, l, or x; x is 480x360.
TIMEOUT_SECONDS = 60
PAUSE_SECONDS = 0.5

# Set PAGEPEEKER_CODE in your environment for account-associated requests.
# Do not put a private account code in a public webpage or shared repository.
ACCOUNT_CODE = os.environ.get("PAGEPEEKER_CODE")

OUT_DIR.mkdir(exist_ok=True)

with CSV_FILE.open(newline="", encoding="utf-8-sig") as csv_file:
    reader = csv.DictReader(csv_file)
    if not reader.fieldnames or "url" not in reader.fieldnames:
        raise ValueError("CSV must have a header named 'url'")

    for row_number, row in enumerate(reader, start=1):
        page_url = (row.get("url") or "").strip()
        if not page_url.startswith(("http://", "https://")):
            print(f"Row {row_number}: skipped; expected an absolute http(s) URL")
            continue

        params = {"size": SIZE, "url": page_url}
        if ACCOUNT_CODE:
            params["code"] = ACCOUNT_CODE
        request_url = (
            f"http://{ENTRYPOINT}.pagepeeker.com/v2/thumbs.php?"
            + urlencode(params)
        )

        try:
            request = Request(request_url, headers={"User-Agent": "CSV screenshot script"})
            with urlopen(request, timeout=TIMEOUT_SECONDS) as response:
                content_type = response.headers.get("Content-Type", "")
                image_bytes = response.read()
                if response.status != 200 or not content_type.lower().startswith("image/"):
                    print(
                        f"Row {row_number}: unexpected response "
                        f"(status {response.status}, content-type {content_type!r})"
                    )
                    continue
                output_path = OUT_DIR / f"capture-{row_number:05}.img"
                output_path.write_bytes(image_bytes)
                print(f"Row {row_number}: saved {output_path}")
        except HTTPError as error:
            print(f"Row {row_number}: HTTP error {error.code}: {error.reason}")
        except (URLError, TimeoutError) as error:
            print(f"Row {row_number}: request failed: {error}")

        time.sleep(PAUSE_SECONDS)

The .img extension is intentional: the example validates that the response is an image but does not assume its precise image format from the endpoint. If your downstream system requires a particular extension or format, verify the actual response and name files accordingly. For easier retry and auditing, a production version should write a results CSV with the original URL, status, response metadata, and saved filename.

Account for readiness, cache, and quota

A successful HTTP response does not by itself establish that a newly requested capture is ready or that the body is a final screenshot. PagePeeker documents a readiness API and a premium wait option. Its V2 documentation also describes response headers for capture method, capture duration, final redirected URL, capture timestamp, and error status for paid and unbranded accounts. Inspect available headers and the readiness status for your account before accepting a row as complete; preserve unresolved rows for another attempt rather than silently treating every response as a usable image.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Free Fling File Transfer Software for Windows [PC Download]
  • Intuitive interface of a conventional FTP client
  • Easy and Reliable FTP Site Maintenance.
  • FTP Automation and Synchronization

Budget calls before running a large file. PagePeeker’s FAQ says that displaying a cached thumbnail, generating an uncached thumbnail, checking readiness, and any exposed API call each add one API call. Unused monthly quota does not roll over. PagePeeker’s pricing page, accessed in 2026, listed Basic at $5.99 per month for 100,000 API calls and Advanced at $39.99 per month for 1,000,000 API calls; prices and quotas can change, so check current terms before starting a large job.

The docs reviewed do not state a maximum batch size or API request-rate limit. This script makes requests sequentially and inserts a short pause, but that pause is not a documented safe rate. For large jobs, avoid assuming unlimited throughput: check the current account terms or contact PagePeeker, and keep a retry queue for timeouts or unresolved captures.

Troubleshoot common problems

The script says the CSV needs a url header

Rename the column header to exactly url, or change the script to match your existing header. The CSV reader treats the header as a key.

A row is skipped as an invalid URL

Provide an absolute URL beginning with http:// or https://. A hostname alone, a blank cell, or a relative path is not enough for this script’s check.

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.

The request times out or returns an HTTP error

Check that the target URL is reachable and correctly encoded by the script, then retry the failed row. A timeout does not tell you whether PagePeeker has completed a capture. Use the documented readiness endpoint or, if available to your account, the premium wait parameter to handle capture readiness.

The response is not identified as an image

The script deliberately refuses to save non-image responses as screenshots. Examine the status, content type, and PagePeeker response headers; a request may need a readiness check or may have returned an error rather than a finished thumbnail. Keep the row in a retry or review log.

Usage is higher than the number of CSV rows

Requests may involve more than the initial thumbnail call: PagePeeker’s FAQ counts readiness checks and exposed API calls as calls too, and a cached display or uncached generation each adds a call under its stated accounting. Estimate those steps as well as the URL count before a run.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

When PagePeeker is not the right workflow

If you need local browser control and a different input format, shot-scraper’s multi workflow uses a YAML list of URLs and output filenames. It is a separate local tool, not a PagePeeker batch feature; evaluate setup, output needs, authentication or interactions, storage, and cost for your own workload.

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

PagePeeker says its robot attempts to capture a site or page when requested and tries to fetch a page only once every 5–7 days. That is the vendor’s stated cadence, not a universal refresh guarantee. Site owners who want to block the PagePeeker robot can add this to robots.txt:

User-agent: PagePeeker
Disallow: /

Or skip the browser setup

For a single request without building a CSV loop, ScreenshotNeo accepts a URL and returns a screenshot or PDF. See the ScreenshotNeo API documentation for its request options.

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

ScreenshotNeo removes cookie banners, newsletter popups, and chat widgets before capture; those cleanup steps can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, and response headers indicate the page verdict and billing status. Its MCP server lets AI agents use screenshot tools. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. ScreenshotNeo is another service, not a PagePeeker feature.

Sign up for ScreenshotNeo’s free plan to try 1,000 screenshots a month with no card.

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

Frequently Asked Questions

Does PagePeeker accept a CSV directly?

The reviewed V2 documentation describes requests for individual URLs; it does not document a CSV upload or native batch endpoint.

Can I capture content below the fold with the standard thumbnail endpoint?

The standard V2 sizes are thumbnails. PagePeeker describes full-page capture as a premium feature with separate customization options.

Can I change the delay between requests to a guaranteed safe rate?

No rate limit is stated in the reviewed documentation. Ask PagePeeker about current account terms before scaling request volume.

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.

CSVPagePeekerPythonscreenshot APIwebsite screenshots

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.

Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Crashes, No Sound, or Screen Glitches?Free driver scan

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.