Website Image Extractor (Apify Actor)

웹사이트 URL 목록에서 모든 이미지를 추출하고 대량 다운로드하며, alt 텍스트, 크기 및 유형을 포함하고 선택적 ZIP을 지원하는 Apify Actor입니다. Apify MCP 서버(https://mcp.apify.com/?actors=pennydata/website-image-extractor)를 통해 MCP 클라이언트에서 호출할 수 있습니다. 사용량 기반 과금으로 발견된 이미지당 $0.002이며, 실패하거나 빈 페이지는 과금되지 않습니다.

호스팅형 MCP 서버

npx add-mcp 'https://mcp.apify.com/?actors=pennydata/website-image-extractor'

Claude Code, Codex, Cursor 등에 설치됩니다

문서

Bulk Image Downloader: $1 per 1,000 Files, ZIP Included (pennydata/website-image-extractor) Actor

Bulk image downloader: $1 per 1,000 files, ZIP included. Billed per file downloaded, not per input URL, so a 1,000-URL list costs $1 where per-URL downloaders charge $0.01-$0.07 per URL. Also extracts images from website pages ($0.002 per image found).

Pricing

from $1.40 / 1,000 images

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events. Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes. In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours, and optionally produces a well-defined JSON output, datasets with results, or files in key-value store. In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects. You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the API section below.

Each client library has reference documentation the quickstart does not restate: JavaScript/TypeScript (npm install apify-client) and Python (pip install apify-client).

README

Website Image Extractor: All Images from Any Page

Paste a page URL, click Start, get one row per image. $0.002 per image found. Bulk file download is $1 per 1,000 files, ZIP included; pages that fail or have no images cost nothing.

Try it: one click, real output

The input is prefilled, so one click on Start runs exactly this:

{ "startUrls": [{ "url": "https://en.wikipedia.org/wiki/Cat" }], "maxImages": 100, "minWidth": 0 }

First 5 rows of a real local run of this version on that input (the run returned 100 rows, capped by maxImages; columns shortened):

sourcewidthheightaltimageUrl
og:image9821000…/Siam_lilacpoint.jpg
img-srcset4042This is a good article. Click here for more i…/40px-Symbol_support_vote.svg.png
img-srcset4040Page semi-protected…/40px-Semi-protection-shackle.svg.png
img-srcset4040Listen to this article…/40px-Gnome-mime-sound-openclipart.svg.png
img-srcset330336White cat with a grey face, upright ears, and…/330px-Siam_lilacpoint.jpg

Set minWidth (for example 200) to drop icons and keep photos. Export as JSON, CSV or Excel, or call it from the API or MCP.

Run it from curl

One call, no code. Returns the rows above as JSON:

curl -X POST "https://api.apify.com/v2/acts/pennydata~website-image-extractor/run-sync-get-dataset-items?token=$APIFY_TOKEN" -H "Content-Type: application/json" -d '{"startUrls":[{"url":"https://en.wikipedia.org/wiki/Cat"}],"maxImages":5}'

How do I download all images from a website and its subpages?

Paste the page URLs into startUrls, set maxPagesPerStart to also follow same-site links (subpages), and click Start: you get one row per unique image with its URL, alt text and declared size ($0.002 per image found). To save the files themselves, feed the result to the bulk file downloader (mode files) with createZip: true and you get all images in one files.zip at $1 per 1,000 files, ZIP included.

FAQ

How do I download all images from a website and subpages? Set startUrls to the site's pages and maxPagesPerStart to the number of same-site pages to follow per start URL. Then run mode files on the resulting dataset (datasetId) to download them.

Can I get all the images as a ZIP file? Yes. Mode files with createZip: true writes every downloaded file to one files.zip (up to 400 MB) in the run's key-value store.

How do I download images from a list of URLs? Use mode files with fileUrls (a plain list), csvUrl (a CSV or Google Sheet export link) or datasetId. It is billed per file downloaded, not per input URL: $1 per 1,000 files.

Does it work on JavaScript-rendered pages? No. It reads the page HTML (img, srcset, picture, og:image, optional CSS backgrounds) with no browser, so images that a script adds after load are not seen.

How much does it cost, compared with a browser extension? Extensions work one page at a time for free. This runs a whole list or site in one call and from the API: $0.002 per image found, $0.001 per file downloaded, nothing for failed pages or failed downloads.

Example

Input: { "startUrls": [{ "url": "https://en.wikipedia.org/wiki/Cat" }], "maxPagesPerStart": 1, "minWidth": 200 } Output (one row per image): pageUrl, imageUrl, alt, width, height, source.

Bulk image downloader at $1 per 1,000 files, ZIP included. Billed per file downloaded, not per input URL: a 1,000-URL list costs $1, where per-URL bulk downloaders list $0.01-$0.07 per URL (Store prices, 2026-10-28). Failed downloads are free.

Three modes. Brand kit: $0.001 per site (favicons, logo candidates, og:image, colours). Bulk file downloader: $0.001 per file downloaded. Image extractor: $0.002 per image row delivered (about $2 per 1,000 images). You are charged only for result rows that contain an image; pages that fail, are blocked by robots.txt or contain no images cost nothing; failed downloads are never charged.

Give it public page URLs. It reads the HTML and returns one row per unique image: <img src> and srcset (largest candidate), <picture><source>, og:image / twitter:image, and optionally CSS background-image: url(). Plain HTTP, no browser, no proxies, no login.

Bulk file downloader (mode files)

$0.001 per file successfully downloaded. Failed, timed-out, oversized and 4xx/5xx files are retried (timeouts, network errors, 429, 5xx; default 2 retries with backoff) and are never charged. Any file type: PDF, images, CSV, ZIP, video, audio.

Input example:

{
  "mode": "files",
  "fileUrls": [{ "url": "https://example.com/a.pdf" }, { "url": "https://example.com/photo.jpg" }],
  "filenameTemplate": "{index}-{basename}",
  "createZip": true,
  "maxCostUsd": 5
}
  • URL sources (combined, deduplicated): fileUrls (plain list), csvUrl (+ csvColumn header or 0-based index; a Google Sheet CSV export link works), datasetId (+ datasetField).
  • filenameTemplate: {index}, {basename}, {name}, {ext}, {host}. Default {index}-{basename}.
  • createZip: also writes all files to one files.zip record in the key-value store (up to 400 MB; larger sets stay available as individual records).
  • maxCostUsd: hard guard, at most floor(maxCostUsd / 0.001) files are downloaded. Also maxFiles, maxFileMb (default 50), retries, timeoutSecs, concurrency.
  • Output: one dataset row per URL (status ok/failed, error, fileName, kvsKey, kvsUrl, contentType, bytes, attempts).
  • Only public http(s) URLs are fetched; private and internal addresses are blocked. You are responsible for the right to download and store the files.

Image extraction mode (default, mode images)

Compared with per-URL pricing

This actoronescales/bulk-image-downloader (as listed 2026-10)
Price$0.002 per image found$0.07 per URL processed
Page with 5 images$0.010$0.07
Page with 20 images$0.040$0.07
Page with 0 images$0$0.07
Break-evenabout 35 images per page

Pages with more than ~35 images cost more here than at a flat $0.07 per URL; use maxImages or minWidth to control spend. Prices of other actors may change; check their listing.

Input

Accepts input from onescales/bulk-image-downloader and powerful_bachelor/website-image-downloader-pro unchanged: inputUrls is read as startUrls; resultsType, includeSrcset, proxyConfiguration and cssSelector are accepted and ignored (we return one row per image, srcset images included).

  • startUrls: page URLs (prefilled with a Wikipedia article).
  • maxPagesPerStart (default 1): also follow same-site links, up to N pages per start URL.
  • minWidth, minBytes: drop small images (unknown width/size is kept).
  • includeCssBackgrounds (default off), sameDomainOnly (default off), fetchMetadata (default off; turn on for a HEAD per image to fill contentType and bytes, adds several seconds).
  • downloadToKvs (default off): store each image (max 10 MB) in the key-value store; failed downloads are not delivered or charged.
  • maxImages (default 1000), respectRobotsTxt (default on), timeoutSecs.

Output (one row per image)

pageUrl, imageUrl, alt, width, height, contentType, bytes, source (img, img-srcset, picture-source, og:image, twitter:image, css-background), plus kvsKey/kvsUrl when downloading. Width/height are only what the page declares; the actor does not decode images.

Brand kit (mode brand)

Give it company websites, get one row per site with everything needed to show their brand: all favicons (every link rel icon plus /favicon.ico when it exists), apple-touch-icons with sizes, og:image, logo candidates (JSON-LD logo, images with "logo" in src, alt, class or id, header SVGs) and the top 5 colours (theme-color meta, then CSS custom properties, then the most frequent hex values in inline CSS). No API key, no browser.

{"mode":"brand","startUrls":[{"url":"https://stripe.com"},{"url":"https://github.com"}]}
  • Price: $0.001 per site row, billed as one "File downloaded" event. Sites that fail, are blocked by robots.txt or return an error are not charged.
  • maxImages caps the number of sites per run (default 1000 = about $1). respectRobotsTxt and timeoutSecs apply as in the other modes.
  • Output per site: pageUrl, domain, title, favicons[] (url, rel, sizes, type), appleTouchIcons[], ogImage, logoCandidates[] (url, source, label), colors[] (#rrggbb). Lists are capped (20 icons, 10 logos, 5 colours).
  • Logo candidates are guesses from the HTML, not verified logos; check the first one or two. Colours are read from the page's CSS and meta tags, not from rendered pixels, so sites that style everything from external stylesheets may return few or none.

Limits

  • Images added by JavaScript after page load are not seen (no rendering). External stylesheets are not read.
  • Only the pages you supply (and, if enabled, same-site links) are fetched. No search-engine scraping. Private and internal addresses are blocked. You are responsible for respecting the copyright and license of the images you download.
  • Not affiliated with any website you scan.

Inicio rápido (español)

Descargar todas las imágenes de una web: pega las URL de las páginas en startUrls y pulsa Start. El actor extrae las imágenes de cada página con texto alternativo y tamaño ($0.002 por imagen encontrada). En el modo de archivos descarga las imágenes y puede crear un ZIP: $1 por 1.000 archivos, facturado por archivo descargado y no por URL de entrada.

Início rápido (português)

Baixar imagens em massa de um site: cole as URLs das páginas em startUrls e clique em Start. O actor extrai as imagens de cada página com texto alternativo e tamanho ($0,002 por imagem encontrada). No modo de arquivos ele baixa as imagens e pode criar um ZIP: $1 por 1.000 arquivos, cobrado por arquivo baixado e não por URL de entrada.

Schnellstart (Deutsch)

Alle Bilder einer Webseite herunterladen: Seiten-URLs in startUrls eintragen und auf Start klicken. Der Actor extrahiert die Bilder jeder Seite mit Alt-Text und Größe ($0,002 pro gefundenem Bild). Im Dateimodus lädt er die Bilder herunter und kann ein ZIP erstellen: $1 pro 1.000 Dateien, abgerechnet pro heruntergeladener Datei, nicht pro Eingabe-URL.

AI disclosure

Built with AI assistance (Claude); maintained by the publisher.

Actor input Schema

mode (type: string):

images = extract image URLs from web pages ($0.002 per image). files = bulk file downloader: download every file in a URL list, CSV or dataset ($0.001 per file). brand = one row per site with favicons, apple-touch-icons, og:image, logo candidates and top 5 colours ($0.001 per site; billed as one 'File downloaded' event).

startUrls (type: array):

Public web pages to read. Each page is fetched with plain HTTP (no browser, no JavaScript rendering).

maxPagesPerStart (type: integer):

1 = only the page you list. Higher values also follow same-site links, up to this many pages per start URL.

minWidth (type: integer):

Skip images whose declared width (width attribute or srcset descriptor) is smaller. Images with unknown width are kept. 0 = off.

minBytes (type: integer):

Skip images whose Content-Length (from a HEAD request) is smaller. Images with unknown size are kept. 0 = off.

includeCssBackgrounds (type: boolean):

Also collect url() images from inline style attributes and blocks (external stylesheets are not read).

sameDomainOnly (type: boolean):

Keep only images hosted on the same site (or a subdomain) as the page; drops CDN and third-party images.

fetchMetadata (type: boolean):

Send one HEAD request per image to fill contentType and bytes. Off by default: a 50-image page returns in about 1 s instead of 7-18 s. Turn on if you need contentType and bytes.

downloadToKvs (type: boolean):

Also download each image (max 10 MB) into the run's key-value store and add kvsKey/kvsUrl to the row. Images that fail to download are not delivered or charged.

maxImages (type: integer):

Stop after this many image rows. Caps your cost: 1000 rows cost about $2.

respectRobotsTxt (type: boolean):

Skip pages disallowed for all bots in robots.txt. Skipped pages cost nothing.

timeoutSecs (type: integer):

Per-request timeout in seconds (5-60).

fileUrls (type: array):

Files mode only. Direct links to files of any type (PDF, images, CSV, ZIP...). Plain URL list.

csvUrl (type: string):

Files mode only. Public link to a CSV or Google Sheet CSV export containing file URLs.

csvColumn (type: string):

Header name or 0-based column number holding the URLs. Empty = first column that contains URLs.

datasetId (type: string):

Files mode only. ID or name of an Apify dataset whose items contain file URLs.

datasetField (type: string):

Field holding the URL in each dataset item. Empty = first URL-like value in the item.

filenameTemplate (type: string):

Name of each stored file. Placeholders: {index} (0001...), {basename} (name.ext from the URL), {name}, {ext}, {host}.

createZip (type: boolean):

Also put all downloaded files into one files.zip record in the key-value store (up to 400 MB).

retries (type: integer):

Extra attempts for timeouts, network errors, HTTP 429 and 5xx, with backoff.

maxFileMb (type: integer):

Files larger than this are skipped and not charged.

maxFiles (type: integer):

Stop after this many files.

maxCostUsd (type: number):

Spending guard: at most floor(maxCostUsd / 0.001) files are downloaded. Empty = no extra cap.

concurrency (type: integer):

Parallel downloads.

Actor input object example

{
  "mode": "files",
  "startUrls": [
    {
      "url": "https://en.wikipedia.org/wiki/Cat"
    }
  ],
  "maxPagesPerStart": 1,
  "minWidth": 0,
  "minBytes": 0,
  "includeCssBackgrounds": false,
  "sameDomainOnly": false,
  "fetchMetadata": false,
  "downloadToKvs": false,
  "maxImages": 50,
  "respectRobotsTxt": true,
  "timeoutSecs": 20,
  "fileUrls": [
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/8/80/Wikipedia-logo-v2.svg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_November_2010-1a.jpg"
    }
  ],
  "filenameTemplate": "{index}-{basename}",
  "createZip": true,
  "retries": 2,
  "maxFileMb": 50,
  "maxFiles": 1000,
  "concurrency": 5
}

Actor output Schema

results (type: string):

No description

API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

JavaScript example

import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "files",
    "startUrls": [
        {
            "url": "https://en.wikipedia.org/wiki/Cat"
        }
    ],
    "fetchMetadata": false,
    "maxImages": 50,
    "fileUrls": [
        {
            "url": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"
        },
        {
            "url": "https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg"
        },
        {
            "url": "https://upload.wikimedia.org/wikipedia/commons/8/80/Wikipedia-logo-v2.svg"
        },
        {
            "url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
        },
        {
            "url": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_November_2010-1a.jpg"
        }
    ],
    "createZip": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("pennydata/website-image-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

Python example

from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "files",
    "startUrls": [{ "url": "https://en.wikipedia.org/wiki/Cat" }],
    "fetchMetadata": False,
    "maxImages": 50,
    "fileUrls": [
        { "url": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg" },
        { "url": "https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg" },
        { "url": "https://upload.wikimedia.org/wikipedia/commons/8/80/Wikipedia-logo-v2.svg" },
        { "url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg" },
        { "url": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_November_2010-1a.jpg" },
    ],
    "createZip": True,
}

# Run the Actor and wait for it to finish
run = client.actor("pennydata/website-image-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

CLI example

echo '{
  "mode": "files",
  "startUrls": [
    {
      "url": "https://en.wikipedia.org/wiki/Cat"
    }
  ],
  "fetchMetadata": false,
  "maxImages": 50,
  "fileUrls": [
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/8/80/Wikipedia-logo-v2.svg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
    },
    {
      "url": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_November_2010-1a.jpg"
    }
  ],
  "createZip": true
}' |
apify call pennydata/website-image-extractor --silent --output-dataset

MCP server setup

{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pennydata/website-image-extractor"
        }
    }
}

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an Authorization: Bearer <APIFY_API_TOKEN> header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/c2yaNUJHPEXTTl8Aa/builds/P2Oobvv5BW4HnPu8F/openapi.json