Nimbryxo Studio

Use Google Image Search Results & Metadata Scraper with Python

Run a Google Images search and get back full-resolution image URLs with dimensions, thumbnails, source page titles, and the web page each image came from.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "country": "US",
  "enableFallback": true,
  "fileType": "",
  "googleOnly": false,
  "imageColor": "",
  "imageSize": "",
  "imageType": "",
  "language": "en",
  "maxResults": 3,
  "minHeight": 0,
  "minWidth": 0,
  "queries": [
    "Alfons Mucha"
  ],
  "safeSearch": "active",
  "timeRange": "",
  "usageRights": ""
}

Download input.example.json and save your reviewed copy as input.json.

FieldTypeRequiredDescription
queriesarrayoptionalOne or more image search queries. Each query is searched independently. Google operators such as site:, quoted phrases and -exclusions are passed through. The legacy single `query` key is still accepted by the actor code.
maxResultsintegeroptionalMaximum number of image rows to return for each query. Google Images usually runs out around 300-400 results for a query; this is a ceiling, not a guarantee.
minWidthintegeroptionalDrop images narrower than this many pixels. Rows without published dimensions are dropped when this is set. 0 disables the filter.
minHeightintegeroptionalDrop images shorter than this many pixels. Rows without published dimensions are dropped when this is set. 0 disables the filter.
countrystringoptionalTwo-letter country used for Google's gl parameter (and Bing's cc parameter). Local sites rank higher in local results.
languagestringoptionalInterface and result language used for Google's hl parameter (and Bing's setlang parameter).
safeSearchstringoptionalGoogle SafeSearch level. 'active' filters explicit images; 'off' does not.
imageSizestringoptionalGoogle Images size filter. The MP values are minimum megapixels. Bing fallback applies the nearest size category and enforces the exact MP floor locally when dimensions are known.
imageColorstringoptionalGoogle Images color filter. 'black_and_white' is grayscale; 'transparent' looks for a transparent background.
imageTypestringoptionalGoogle Images type filter: photographs, faces, clip art, line drawings or animated images.
fileTypestringoptionalOnly images in this format. Google applies this server-side; Bing fallback applies it to the image URL extension locally.
timeRangestringoptionalOnly images Google found within this period. Bing fallback maps 'hour' to its 24-hour window.
usageRightsstringoptionalGoogle's usage-rights labels. These are Google's labels, not a legal guarantee; check the licence on the source page before reuse.
googleOnlybooleanoptionalWhen true, a failed or empty Google search fails that query with a clear status instead of using another engine. The default is false so legacy saved tasks keep working; set this true for a strict Google-only contract.
enableFallbackbooleanoptionalWhen googleOnly is false, allow labelled Bing Images and then DuckDuckGo Images. Every fallback row carries engine, isFallback=true and fallbackReason.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/iKDkm4yHl5raSnWvW/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

One dataset row per image with original/thumbnail provenance, dimensions when stated, source page metadata, stable image ID and a labelled engine. Per-query completeness telemetry is in the SUMMARY key-value record.

Questions before you run

Which inputs are required?

No top-level fields are marked required in the published schema. Conditional requirements can still apply; check the README.

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build cKnlChhWEIvPfT67X and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.