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.
| Field | Type | Required | Description |
|---|---|---|---|
queries | array | optional | One 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. |
maxResults | integer | optional | Maximum 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. |
minWidth | integer | optional | Drop images narrower than this many pixels. Rows without published dimensions are dropped when this is set. 0 disables the filter. |
minHeight | integer | optional | Drop images shorter than this many pixels. Rows without published dimensions are dropped when this is set. 0 disables the filter. |
country | string | optional | Two-letter country used for Google's gl parameter (and Bing's cc parameter). Local sites rank higher in local results. |
language | string | optional | Interface and result language used for Google's hl parameter (and Bing's setlang parameter). |
safeSearch | string | optional | Google SafeSearch level. 'active' filters explicit images; 'off' does not. |
imageSize | string | optional | Google 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. |
imageColor | string | optional | Google Images color filter. 'black_and_white' is grayscale; 'transparent' looks for a transparent background. |
imageType | string | optional | Google Images type filter: photographs, faces, clip art, line drawings or animated images. |
fileType | string | optional | Only images in this format. Google applies this server-side; Bing fallback applies it to the image URL extension locally. |
timeRange | string | optional | Only images Google found within this period. Bing fallback maps 'hour' to its 24-hour window. |
usageRights | string | optional | Google's usage-rights labels. These are Google's labels, not a legal guarantee; check the licence on the source page before reuse. |
googleOnly | boolean | optional | When 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. |
enableFallback | boolean | optional | When 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.