Scraping Zillow: what got through and what did not

Zillow · measured · dated

Scraping Zillow: what got through and what did not

Zillow is the one site in our test where paying for a residential proxy changed the answer completely. It is also the one site where adding a real browser made things worse. Both results are from the same week, the same server and the same five requests per attempt.

Latest run

Tested
10 Sep 2026
Targets
9real sites
Providers
3+ datacenter baseline
Baseline pass rate
15 / 45no proxy

Quick answer

A residential proxy opens Zillow. A headless browser closes it.

Five requests per source per method to a Zillow for-sale listing page. A request counts as a pass only when the response contains real listing markup, not when it returns status 200.

Last tested 10 Sep 2026 · next run Oct 2026
SourcePlain requests (curl)Headless ChromiumFrom
No proxy (datacenter)0 / 5HTTP 4030 / 5HTTP 403$0
5 / 50 / 5HTTP 403$6/GBSee Oxylabs pricing
not testednot tested$8.4/GBSee Bright Data pricing
4 / 50 / 5HTTP 403$2/GBSee Decodo pricing
5 / 50 / 5HTTP 403$5/GBSee SOAX pricing

Five requests per source per method against Zillow, measured 10 Sep 2026 (plain) and 10 Sep 2026 (browser). The reason shown is what the site returned.

What the numbers say

Three findings, in the order they matter

1. A datacenter address does not work

Every plain request from our hosting-company address came back as 403. Not a challenge, not a CAPTCHA, just a refusal. This is the clearest case in our whole test for why a residential proxy exists: no amount of retrying, header tuning or slowing down changes a decision made on the address.

2. A residential address works, and cheaply

The same plain request through a residential proxy returned the real listing page. Two providers passed all five attempts and one passed four of five, and the single miss was a PerimeterX challenge rather than an outright block. The whole run moved a few hundred kilobytes, which at list prices is a fraction of a cent.

3. A headless browser makes it worse, not better

The usual advice is to add a real browser when a site is protected. On Zillow that advice is wrong. Every headless Chromium request through the same residential networks was refused, fifteen out of fifteen, while plain requests from those same networks had passed hours earlier.

Why the browser fails here

Zillow uses PerimeterX, now HUMAN, which runs JavaScript in the page and inspects the environment it is running in. A plain HTTP request never executes that script, so there is nothing to inspect beyond headers and the TLS handshake. A stock headless browser executes it and hands over the evidence.

Method

How this was measured

The same script and the same server as every other number on this site.

Raw results
5 requestsper target per provider, each from a different exit IP. Pass rate is how many of the 5 brought back the real page.
9 targetsthe sites people actually scrape: retail, real estate, jobs, search. Picked for their bot defences.
Content, not statusa 200 with no results is a failure. Every response is checked for a marker only the real page has.
Monthlyrerun on the same day each month from the same server. Old results stay published, dated.

The target is a Zillow for-sale listing page, requested five times per source. Plain requests carry the headers of a current desktop Chrome and no JavaScript engine. Browser requests use a headless Chromium through the same proxy, each in a fresh context, waiting up to fifteen seconds for listing markup or for a challenge to resolve, with no stealth plugins and no CAPTCHA solving. A pass requires listing markup in the response; a 403, a challenge page, a timeout or a 200 with an empty result container are all failures, and the reason is recorded. The two runs were made on different days, which is stated in the table because results from different days are not strictly comparable.

If you are building this

What we would do to collect Zillow pages

  • Start with plain requests through a residential proxy. That is the combination that worked, and it is the cheapest one. A page of listing HTML is small, so the traffic cost per page is low even at residential prices.
  • Do not reach for a headless browser first. On this target it converted a working setup into a blocked one, and it multiplies the traffic bill by roughly ten. If you need a browser for the page to render, expect to need a patched one, and measure before you commit.
  • Treat the occasional challenge as normal. One provider missed one request out of five, with a PerimeterX challenge. Retry through a new address rather than hammering the same one.
  • Rotate per request. Every provider we tested gives a new exit address on each request by default, and we measured what that actually delivers. Rotation is what keeps a single address from accumulating a reputation on this kind of target.
  • Respect what you are collecting. Listing pages are public, but the data on them belongs to someone. Check Zillow’s terms and your local law before you build a product on it; this page is a measurement, not legal advice.

Providers

What these providers cost

The same four providers, their list prices and terms. Full results across all nine targets are on the front page.

ProviderPoolLocationsTargetingSessionsTrialEntry price
100M+195 countriesCity · ASNRotating and stickyNone on self-service$6/GBStarter 5 GB, $30/mo, cancel any timeSee Oxylabs pricing
72M+195 countriesCity · ASN · ZIPRotating and stickyFree trial for verified businesses$8.4/GBPay as you go, no commitmentSee Bright Data pricing
115M+195+ locationsCity · ZIP · ASNRotating and sticky (minutes to days)3-day trial, 100 MB$2/GBPay as you go $4/GB, plans from $2/GBSee Decodo pricing
155M+195+ locationsCity · ISPRotating and sticky, custom length3-day trial, 400 MB, $1.99$5/GBPay as you go $5/GB, $3/GB on $200/mo planSee SOAX pricing

We earn a commission if you buy through the pricing links. It does not change the numbers: the test script, the target list and the raw results are public, and providers do not see results before you do.

Best in our testOxylabs · from $6/GBSee pricing