Download product images from a Shopify store
Paste a collection or product URL from any Shopify store and the scanner collects the product photography the page carries, including the responsive size variants a store generates for each photo. Shopify renders its catalogue into the HTML, which is why this works well — measured against a real browser on two live stores, it finds 90–98% of what the browser loads.
What this does
- Measured, not asserted: on a live Shopify collection the scanner finds 98.1% of the images a real browser loads, checked against headless Chromium ground truth rather than estimated.
- A second live store measured independently at 90.7%, so the first number is a class result rather than one lucky page.
- Every responsive size a store declares for a photo is found, not only the one your screen happened to load — grouped into one tile that stands for the largest, with the rest one click behind it.
- Sorting by image size finds the full-resolution originals among the thumbnails, and the dimensions come from one small range request per image rather than downloading anything.
Why Shopify specifically
Shopify renders product data into the HTML it serves. The catalogue is in the page before any JavaScript runs, which is exactly the condition a static parser needs — and it is why the coverage numbers on this page are high enough to publish.
That is not true of every storefront. A store built as a single-page app assembles its grid in the browser from an API, and there is nothing in the served HTML to read. Both kinds exist; the measured ones here are the first kind.
What the numbers mean
Coverage was measured against a browser, not estimated. A headless Chromium loaded each store’s collection page, scrolled to the bottom to trigger lazy loading, and recorded every image it actually fetched. The scanner read the same URL, and the two lists were compared.
The comparison counts logical images rather than exact URLs. A store serving one photo at eight widths is one image, not eight — counting URLs would score a perfect result as a poor one, which is a measurement error rather than a finding. The full method and corpus are in the project’s frontend plan.
What it won't do
- A store's CDN serves the same photo at many sizes. Those are grouped into one tile showing the largest, with a chip reading "6 versions" — selecting the tile takes that largest version, and opening the chip lets you pick a smaller one instead.
- Only what the page itself carries is read. A collection that loads more products as you scroll has the first batch in its HTML and the rest in JavaScript, so scan a product page directly when you need one product's full set.
- Some storefronts sit behind bot protection that serves a challenge page rather than the catalogue. The scan succeeds and returns almost nothing — that is the wall answering, not the parser failing, and a browser-based tool meets the same wall.
- One archive holds up to 500 images, which a large collection with several variants per product can exceed. Filter or sort before selecting.
- If the store's robots.txt asks automated tools not to read the page, the scan stops and says so. There is no override.
Questions
Collection page or product page?
Product page for one item's full set, including the alternate angles a collection tile never shows. Collection page for a broad sweep of the catalogue at whatever size the grid uses. They answer different questions, and the product page is the one people usually want.
The store shows one photo — why does the chip say six versions?
Shopify generates a set of sizes for every image and declares them all so browsers can pick whichever suits the screen. All of them are found, and they are grouped into a single tile so the grid shows pictures rather than breakpoints. The chip opens the group if you want a specific width.
How do I get the highest-resolution version?
Selecting a tile already takes it: a grouped tile represents its largest version, so the default selection is the best the store serves publicly. There is no hidden original behind it. If dimensions are unknown, Measure reads them from the file headers and the grouping updates to match.
Does this work on stores with a custom domain?
Yes. Shopify stores mostly run on their own domains, and nothing here keys on the myshopify.com hostname — it reads the page it is given.
Is it only Shopify?
No, but Shopify is the platform the coverage was measured on. Any store that renders its catalogue into HTML behaves the same way; stores that build the grid entirely in JavaScript return much less.
Related
Images belong to their creators. Only download what you have the right to use. See all tools or read what our requests do.