Skip to content

Instantly share code, notes, and snippets.

@bryant988
Last active July 18, 2025 01:01
Show Gist options
  • Save bryant988/9510cff838d86dcefa3b9ea3835b8552 to your computer and use it in GitHub Desktop.
Save bryant988/9510cff838d86dcefa3b9ea3835b8552 to your computer and use it in GitHub Desktop.
Zillow Image Downloader
/**
* NOTE: this specifically works if the house is for sale since it renders differently.
* This will download the highest resolution available per image.
*/
/**
* STEP 1: Make sure to *SCROLL* through all images so they appear on DOM.
* No need to click any images.
*/
/**
* STEP 2: Open Dev Tools Console.
* Copy and paste code below
*/
const script = document.createElement('script');
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js";
script.onload = () => {
$ = jQuery.noConflict();
const imageList = $('ul.media-stream li picture source[type="image/jpeg"]').map(function () {
const srcset = $(this).attr('srcset').split(' '); // get highest res urls for each image
return srcset[srcset.length - 2]
}).toArray();
const delay = ms => new Promise(res => setTimeout(res, ms)); // promise delay
// get all image blobs in parallel first before downloading for proper batching
Promise.all(imageList.map(i => fetch(i))
).then(responses =>
Promise.all(responses.map(res => res.blob()))
).then(async (blobs) => {
for (let i = 0; i < blobs.length; i++) {
if (i % 10 === 0) {
console.log('1 sec delay...');
await delay(1000);
}
var a = document.createElement('a');
a.style = "display: none";
console.log(i);
var url = window.URL.createObjectURL(blobs[i]);
a.href = url;
a.download = i + '';
document.body.appendChild(a);
a.click();
setTimeout(() => {
window.URL.revokeObjectURL(url);
}, 100);
}
});
};
document.getElementsByTagName('head')[0].appendChild(script);
@JellyProctor
Copy link

Thank you so much for this. Unfortunately it seems to stop after the first 7 photos in Chrome.

@raghucbz
Copy link

raghucbz commented Jul 1, 2025 via email

@JellyProctor
Copy link

Thanks again. It was my mistake, I loaded all the pictures, but was in the horizontal slideshow and not the vertical scroll lightbox. Works great! In chrome, on Zillow, and converted all 54 webp to jpg. 6-30-25

@JellyProctor
Copy link

...and if I open an individual downloaded jpg in File Explorer, it even re-constitutes the slideshow to where I can just tab through the whole set. Thanks for you efforts!

@VeniceNerd
Copy link

Thanks again. It was my mistake, I loaded all the pictures, but was in the horizontal slideshow and not the vertical scroll lightbox. Works great! In chrome, on Zillow, and converted all 54 webp to jpg. 6-30-25

I am getting the same error:

Uncaught TypeError: Cannot read properties of null (reading 'querySelectorAll')
at gatherAndZipImages (:26:46)
at script.onload (:53:5)

I can't figure out how to the vertical scroll Lightbox. All I get is this one:
Screenshot 2025-07-15 at 11 18 53 PM

@JellyProctor
Copy link

@VeniceNerd I see this issue as well. That particular listing looks to be using Zillow Showcase ShowingTime+, the ST+ in the lower right hand corner, some kind of feature they're promoting to realtors. Just for comparison, looking at nearby 27556 Antelope Dr, Santa Clarita, the listing looks normal, non-ShowingTime+.
27556 Antelope Dr Santa Clarita, CA. If I try again for 27555 Antelope Drive, but this time on Redfin, I notice the 'lightbox' structure may be accessible. I also see that its not Santa Clarita, but Canyon Country, but that's probably not important. You might try the script on Redfin, I have no clue if its particular to Zillow. If it doesn't work then you'd need to appeal to the programmers in this thread; I don't know anything about it. YMMV, Regards,

@JellyProctor
Copy link

I'm not sure why my attached Redfin image didn't load, is there a limit? I'll re-post it here in a new comment.
27555 Antelop Dr Santa Clarita - Canyon Country CA on Redfin

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment