Como Extrair Dados Imobiliários do Zillow: JSON de Pesquisa, Zestimate, PerimeterX
O Zillow envia seus dados de listagem como JSON oculto na página — você nunca precisa analisar um único div. Veja como acionar a API de pesquisa por limites de mapa, superar o limite de paginação e contornar o PerimeterX.
O Zillow possui mais de 110 milhões de propriedades e atrai cerca de 245 milhões de visitantes mensais, o que o torna a fonte padrão para dados imobiliários dos EUA — preços, endereços, quartos, banheiros, zestimates e estimativas de aluguel. Ele também está protegido pelo PerimeterX e renderiza no lado do cliente, então raspadores ingênuos recebem um 403 e uma página em branco. A boa notícia: o Zillow fornece seus dados como JSON se você souber onde procurar, e sua pesquisa é conduzida por coordenadas de mapa que você pode chamar diretamente. Aqui está toda a abordagem.
Não analise HTML — o Zillow envia JSON
Não há necessidade de lutar com seletores CSS em uma página de propriedade do Zillow. O registro completo da propriedade está incorporado como dados web ocultos em uma tag de script. Dois locais cobrem quase todas as páginas: <script id="__NEXT_DATA__"> contém o cache do Next.js, e algumas páginas usam <script id="hdpApolloPreloadedData"> (o cache do Apollo GraphQL). Pegue qualquer um, analise-o, e você terá um objeto limpo com zpid, price, livingArea, bedrooms, bathrooms, latLong, homeStatus, rentZestimate e mais:
import json, re, requests
proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}
HEADERS = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
"accept-language": "en-US,en;q=0.9"}
def property_json(url):
r = requests.get(url, headers=HEADERS, proxies=proxies, timeout=20)
r.raise_for_status() # 403 => blocked, rotate IP
m = re.search(r'id="__NEXT_DATA__"[^>]*>(.*?)</script>', r.text, re.S)
if m:
data = json.loads(m.group(1))
cache = data["props"]["pageProps"]["componentProps"]["gdpClientCache"]
return next(iter(json.loads(cache).values()))["property"]
# fallback: Apollo cache
m = re.search(r'id="hdpApolloPreloadedData"[^>]*>(.*?)</script>', r.text, re.S)
cache = json.loads(json.loads(m.group(1))["apiCache"])
return next(v["property"] for k, v in cache.items() if "ForSale" in k)
O registro incorporado é muito mais rico do que a página visível. Junto com o preço e o endereço, você obtém zestimate e rentZestimate — as próprias avaliações de venda e aluguel do Zillow — além de homeStatus (à venda, vendido, para alugar), daysOnZillow, área do lote e área habitável, e latitude e longitude precisas. Isso é tudo que um modelo de comparativos, um pipeline de pontuação de leads ou um painel de mercado precisa, entregue como um único objeto JSON limpo por propriedade em vez de uma dúzia de seletores CSS frágeis que quebram na próxima reformulação.
A API de pesquisa funciona com coordenadas de mapa
A pesquisa do Zillow não é baseada em palavras-chave — é baseada em mapas. Nos bastidores, enviar uma pesquisa dispara uma solicitação para zillow.com/async-create-search-page-state com um objeto searchQueryState cujo campo principal é mapBounds: quatro números (norte, sul, leste, oeste) que desenham um retângulo no mapa. Dê a ele uma caixa delimitadora e ele retorna todas as listagens dentro dela, como JSON estruturado:
def search_area(bounds, page=1):
url = "https://www.zillow.com/async-create-search-page-state"
body = {
"searchQueryState": {
"pagination": {"currentPage": page},
"mapBounds": bounds, # {'north':..,'south':..,'east':..,'west':..}
"filterState": {"sortSelection": {"value": "days"}},
},
"wants": {"cat1": ["listResults", "mapResults"], "cat2": ["total"]},
"requestId": 2,
}
r = requests.put(url, json=body, headers=HEADERS, proxies=proxies, timeout=20)
return r.json()["cat1"]["searchResults"]["listResults"]
# New Haven, CT bounding box
listings = search_area({"north": 41.366, "south": 41.230,
"east": -72.827, "west": -73.030})

Supere o limite de 820 resultados
O Zillow só pagina 20 páginas de cerca de 41 itens, então uma única pesquisa limita-se a aproximadamente 820 resultados, não importa quantas casas estejam na área. Mercados densos escondem milhares a mais. A solução é a divisão recursiva de quadrantes: se uma caixa delimitadora retornar o máximo de páginas, divida-a em quatro caixas menores e pesquise cada uma; continue subdividindo até que cada caixa retorne menos do que o limite. Esta estratégia de zoom pode revelar centenas de milhares de listagens de uma única metrópole que a pesquisa plana nunca mostraria — e só subdivide onde a densidade justifica, então você não desperdiça solicitações em áreas rurais vazias.
Há um custo para essa minuciosidade: cada subdivisão multiplica as solicitações, então uma metrópole densa pode transformar uma pesquisa em dezenas. Planeje para isso — limite a profundidade da recursão e só dê zoom onde a contagem de resultados justifica, o que o algoritmo faz por você ao subdividir apenas quando uma caixa ainda atinge o máximo de páginas. Para uma atualização noturna de uma cidade inteira, a maioria das solicitações então recai sobre o punhado de caixas densas do centro enquanto os subúrbios se resolvem em uma única passagem, então você gasta em profundidade exatamente onde o inventário está e em nenhum outro lugar.
PerimeterX é o motivo pelo qual raspadores ingênuos falham
O bloqueio do Zillow não é principalmente baseado em taxa; é o PerimeterX (agora HUMAN) que perfila a solicitação. IPs de datacenter, cabeçalhos de navegador ausentes e tempos inumanos acionam um 403 ou um desafio — é isso que um assert status == 200 realmente verifica. A solução é uma solicitação coerente e confiável: proxies residenciais dos EUA para que o IP de saída pareça um comprador de casa, cabeçalhos de navegador realistas e backoff exponencial que rotaciona para um IP novo em qualquer 403 em vez de tentar novamente o queimado. Nossa análise de como o PerimeterX detecta automação cobre os sinais em profundidade; a mesma postura se aplica ao Walmart, que usa o mesmo fornecedor.
Quando o PerimeterX aperta ou você prefere não manter uma frota de navegadores, uma Scraper API renderiza a página, rotaciona IPs residenciais e limpa o desafio para você, retornando o mesmo JSON oculto sem a sobrecarga operacional.
Extraia Zillow por trás do PerimeterX com IPs residenciais

Quando usar registros do condado em vez disso
O Zillow é excelente para listagens, fotos e estimativas, mas é uma fonte secundária. Para propriedade autoritativa, histórico de vendas e valores avaliados, os escritórios de avaliadores e registradores do condado publicam registros públicos — muitas vezes através de seus próprios portais ou exportações de dados em massa. Se seu caso de uso é título, comparativos ou dados fiscais em vez de listagens ao vivo, registros em nível de condado são mais limpos, mais permissivos para coletar e totalmente livres do PerimeterX. Use o Zillow para o sinal de mercado e os registros do condado para a verdade no terreno.
É legal extrair dados do Zillow?
Esta é uma informação geral, não um conselho jurídico. Dados de listagens publicamente disponíveis — preços, endereços, atributos de propriedade — são amplamente considerados justos para coleta em taxas respeitosas. Os resultados do Zillow podem incluir dados pessoais, no entanto: nomes de agentes, números de telefone e detalhes de corretores. Esses são protegidos sob o GDPR e leis semelhantes, então evite coletar e armazenar sem uma base legal. Colete os fatos da propriedade, não as pessoas.
Perguntas frequentes
Posso extrair dados do Zillow?
Sim — dados de listagens visíveis publicamente podem ser coletados. O Zillow incorpora cada registro de propriedade como JSON em uma tag de script (__NEXT_DATA__ ou o cache do Apollo), e sua pesquisa funciona em uma API de limites de mapa que você pode chamar diretamente. O obstáculo não é o acesso, mas sim o PerimeterX, então você precisa de IPs residenciais e cabeçalhos coerentes para evitar 403s.
O Zillow tem uma API?
O Zillow oferece cerca de 20 APIs oficiais, incluindo Detalhes da Propriedade e Dados do Bairro, mas elas exigem chaves, possuem limites de uso e não cobrem todos os campos ou casos de uso em massa. Muitas equipes extraem as páginas públicas em vez disso, precisamente porque o JSON oculto já contém o preço, quartos, banheiros, área, zestimate e estimativa de aluguel que precisam.
Por que meu raspador do Zillow recebe um 403?
Um 403 no Zillow é quase sempre o PerimeterX, não um limite de taxa. IPs de datacenter, cabeçalhos de navegador ausentes ou inconsistentes e tempos de solicitação robóticos o acionam. Mude para proxies residenciais dos EUA, envie cabeçalhos realistas, adicione espaçamento semelhante ao humano e rotacione para um IP novo em cada 403 com backoff exponencial em vez de martelar o bloqueado.
Como faço para extrair mais de 820 listagens do Zillow de uma área?
Uma única pesquisa limita-se a cerca de 820 resultados (20 páginas de 41). Para ir mais fundo, divida a caixa de limites do mapa em quatro quadrantes e pesquise cada um; subdivida recursivamente qualquer quadrante que ainda atinja o limite. Esta abordagem de zoom só subdivide áreas densas, então captura todo o inventário de uma metrópole sem desperdiçar solicitações em regiões esparsas.
Ignore o HTML e leia o JSON incorporado, conduza a pesquisa por limites de mapa, divida quadrantes para superar o limite e encaminhe tudo através de IPs residenciais limpos para se manter à frente do PerimeterX. Faça isso e o Zillow se torna um feed imobiliário estruturado em vez de uma parede de 403s.