{"id":44372,"date":"2026-05-13T21:04:47","date_gmt":"2026-05-13T21:04:47","guid":{"rendered":"https:\/\/floppydata.com\/sem-categoria\/como-fazer-scraping-no-zillow-um-guia-que-funciona\/"},"modified":"2026-05-13T21:04:47","modified_gmt":"2026-05-13T21:04:47","slug":"how-to-scrape-zillow-a-guide-that-works","status":"publish","type":"post","link":"https:\/\/floppydata.com\/pt-br\/blog\/how-to-scrape-zillow-a-guide-that-works\/","title":{"rendered":"Como fazer scraping no Zillow: Um guia que funciona"},"content":{"rendered":"<h2><strong>Introdu\u00e7\u00e3o<\/strong><\/h2>\n<p>Por ser uma das principais plataformas imobili\u00e1rias dos EUA, a Zillow se torna uma plataforma que muitas empresas desejam explorar para obter dados sobre propriedades. Atualmente, a plataforma recebe cerca de <a href=\"https:\/\/www.businessofapps.com\/data\/zillow-statistics\/\" target=\"_blank\" rel=\"noopener\">243 milh\u00f5es de visitas por m\u00eas<\/a>, portanto, naturalmente, ela cont\u00e9m uma enorme quantidade de dados \u00fateis sobre im\u00f3veis. <\/p>\n<p>No entanto, os desenvolvedores frequentemente compartilham no Reddit a dificuldade de contornar o firewall do Zillow ou de serem permanentemente bloqueados ao tentar fazer scraping. Se voc\u00ea acabou de passar por isso e est\u00e1 procurando um guia est\u00e1vel que funcione, continue lendo. <\/p>\n<p>Neste guia, mostrarei a voc\u00ea como extrair os principais dados de listagem do Zillow usando Python e uma API da Web simples.<\/p>\n<h2><strong>O que \u00e9 Zillow Scraping?<\/strong><\/h2>\n<p>O scraping do Zillow \u00e9 o processo de coletar dados imobili\u00e1rios dispon\u00edveis publicamente nas p\u00e1ginas do Zillow e transform\u00e1-los em um formato estruturado, como CSV ou JSON, que voc\u00ea possa usar para fins comerciais ou pessoais<\/p>\n<p>Em vez de abrir as listagens uma a uma, voc\u00ea pode usar um raspador para extrair os principais detalhes das p\u00e1ginas de pesquisa e das p\u00e1ginas de detalhes das listagens de propriedades.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-44250\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3.png\" alt=\"Raspagem do Zillow\" width=\"1999\" height=\"1385\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3.png 1999w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-300x208.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-1024x709.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-768x532.png 768w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-1536x1064.png 1536w\" sizes=\"(max-width: 1999px) 100vw, 1999px\" \/><\/p>\n<p>Entre as duas p\u00e1ginas, voc\u00ea pode retirar:<\/p>\n<ul>\n<li>Pre\u00e7o, endere\u00e7o, camas, banheiros, metragem quadrada, status e dias no mercado<\/li>\n<li>Estimativa de aluguel e estimativa de aluguel<\/li>\n<li>Fotos do an\u00fancio e nome do corretor<\/li>\n<li>Hist\u00f3rico de pre\u00e7os e hist\u00f3rico de impostos<\/li>\n<\/ul>\n<h3><strong>Por que extrair dados do Zillow?<\/strong><\/h3>\n<p>Imagine poder acessar listagens de propriedades atualizadas, detalhes de pre\u00e7os e an\u00e1lises de mercado sem precisar abrir manualmente centenas de p\u00e1ginas do Zillow.<\/p>\n<p>Esse \u00e9 o valor real do scraping do Zillow.<\/p>\n<p>Se voc\u00ea trabalha com im\u00f3veis, investimento em propriedades, pesquisa de mercado, gera\u00e7\u00e3o de leads ou an\u00e1lise de pre\u00e7os, o Zillow tem dados p\u00fablicos \u00fateis que podem ajud\u00e1-lo a identificar tend\u00eancias mais rapidamente.<\/p>\n<h2><strong>O que faz com que o Zillow seja t\u00e3o dif\u00edcil de ser eliminado?<\/strong><\/h2>\n<p>A Zillow n\u00e3o vai t\u00e3o longe quanto algumas plataformas no que diz respeito ao bloqueio de bots, mas ainda assim foi criada para bloquear o tr\u00e1fego que n\u00e3o parece humano.<\/p>\n<p>A maioria dos scrapers falha por dois motivos. Vamos dar uma olhada em ambos: <\/p>\n<h3><strong>Prote\u00e7\u00e3o PerimeterX<\/strong><\/h3>\n<p>A Zillow usa o PerimeterX para detectar e bloquear o tr\u00e1fego de bots em tempo real. Se o seu scraper tiver os cabe\u00e7alhos errados, vier de um IP de baixa confian\u00e7a ou enviar muitas solicita\u00e7\u00f5es com muita rapidez, ele poder\u00e1 ser sinalizado. <\/p>\n<p>Na maioria das vezes, esse sinalizador leva a um quebra-cabe\u00e7a CAPTCHA, que quebraria a maioria dos scrapers. O PerimeterX tamb\u00e9m verifica muitos sinais, inclusive cabe\u00e7alhos, comportamento do navegador, impress\u00f5es digitais de TLS, velocidade de solicita\u00e7\u00e3o e reputa\u00e7\u00e3o de IP. <\/p>\n<p>Se o tr\u00e1fego parecer automatizado, o scraper pode nunca chegar aos dados reais da listagem.<\/p>\n<p>Portanto, mesmo que voc\u00ea renderize a p\u00e1gina em um navegador sem cabe\u00e7a, isso n\u00e3o garante o sucesso. Voc\u00ea ainda precisa de proxies de alta qualidade, sess\u00f5es limpas e comportamento de solicita\u00e7\u00e3o realista. <\/p>\n<p>\u00c9 por isso que eu prefiro usar o Web Unlocker da Floppydata para raspar o Zillow.<\/p>\n<h3><strong>HTML n\u00e3o estruturado e sem seletores est\u00e1veis<\/strong><\/h3>\n<p>Analisar o Zillow tamb\u00e9m pode ser t\u00e3o frustrante quanto passar por suas defesas. Quase n\u00e3o h\u00e1 nomes de classe, IDs ou atributos de dados consistentes no c\u00f3digo-fonte da p\u00e1gina. <\/p>\n<p>Os elementos que parecem simples, como o pre\u00e7o ou o endere\u00e7o, s\u00e3o envolvidos em tags gen\u00e9ricas &lt;div&gt; ou n\u00e3o t\u00eam nenhum identificador.<\/p>\n<p>Pior ainda, os nomes das classes mudam com frequ\u00eancia e n\u00e3o seguem nenhum padr\u00e3o. Portanto, voc\u00ea precisa usar uma correspond\u00eancia flex\u00edvel (como find() baseado em palavras-chave ou at\u00e9 mesmo regex) para extrair dados de n\u00f3s de texto bruto. <\/p>\n<p>Isso faz com que o Zillow seja um dos sites mais inst\u00e1veis para extra\u00e7\u00e3o se voc\u00ea estiver confiando em seletores est\u00e1ticos.<\/p>\n<h2><strong>Extrair informa\u00e7\u00f5es de listagem do Zillow com Python<\/strong><\/h2>\n<p>Para este guia, vou me concentrar na <a href=\"https:\/\/www.zillow.com\/boston-ma\/\" target=\"_blank\" rel=\"noopener\">p\u00e1gina de resultados de pesquisa do Zillow em Boston<\/a>, que cont\u00e9m v\u00e1rias listagens de im\u00f3veis. A partir da\u00ed, podemos extrair campos como pre\u00e7o, endere\u00e7o, camas, banheiros, metragem quadrada, status e links de listagem. <\/p>\n<p><strong><em>Observa\u00e7\u00e3o:<\/em><\/strong><em>  As p\u00e1ginas do Zillow mudam com frequ\u00eancia. Se a p\u00e1gina de Boston estiver diferente quando voc\u00ea ler isto, acesse o Zillow, pesquise qualquer cidade ou bairro, copie o URL dos resultados e substitua-o no c\u00f3digo. <\/em><\/p>\n<p>Vamos come\u00e7ar com a configura\u00e7\u00e3o:<\/p>\n<h3><strong>Pr\u00e9-requisitos<\/strong><\/h3>\n<p>Voc\u00ea precisar\u00e1 de tr\u00eas coisas antes de come\u00e7ar:<\/p>\n<ul>\n<li><strong>Python 3.10 ou superior<\/strong> instalado em seu computador<\/li>\n<li><strong>Uma conta Floppydata<\/strong> com uma chave de API para o Web Unlocker<\/li>\n<li>Duas bibliotecas Python: <strong>requests<\/strong> para chamadas HTTP e <strong>beautifulsoup4<\/strong> para an\u00e1lise de HTML<\/li>\n<\/ul>\n<p>Se voc\u00ea ainda n\u00e3o tiver uma conta Floppydata, inscreva-se em floppydata.com e obtenha sua<strong> chave de API<\/strong> no<a href=\"https:\/\/app.floppydata.com\/tools\/scrape\"> painel do Web Unlocker<\/a>.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44259\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3.png\" alt=\"Chave da API\" width=\"1336\" height=\"646\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3.png 1336w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3-300x145.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3-1024x495.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3-768x371.png 768w\" sizes=\"(max-width: 1336px) 100vw, 1336px\" \/><\/p>\n<p>As novas contas v\u00eam com <strong>cinco raspagens gratuitas<\/strong>, portanto voc\u00ea pode seguir todo este tutorial sem pagar nada.<\/p>\n<p>Normalmente, a biblioteca de solicita\u00e7\u00f5es vem pr\u00e9-instalada, mas voc\u00ea pode executar esse comando para garantir que ela esteja instalada corretamente:<\/p>\n<div style=\"margin: 18px 0 26px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 16px 18px; margin: 0; font-size: 14px; line-height: 1.7;\"><code><span style=\"color: #9333ea;\">pip<\/span> <span style=\"color: #16a34a;\">install<\/span> requests beautifulsoup4<\/code><\/pre>\n<\/div>\n<p>Depois de fazer isso, crie uma nova pasta e um novo arquivo de projeto:<\/p>\n<div style=\"margin: 18px 0 26px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 16px 18px; margin: 0; font-size: 14px; line-height: 1.7;\"><code><span style=\"color: #9333ea;\">mkdir<\/span> zillow-scraper\n<span style=\"color: #9333ea;\">cd<\/span> zillow-scraper\n<span style=\"color: #9333ea;\">touch<\/span> zillow_scraper.py<\/code><\/pre>\n<\/div>\n<p>Agora, voc\u00ea est\u00e1 pronto para come\u00e7ar.<\/p>\n<h3><strong>Enviando a primeira solicita\u00e7\u00e3o<\/strong><\/h3>\n<p>A primeira coisa que a maioria das pessoas tenta fazer \u00e9 uma solicita\u00e7\u00e3o Python normal. Normalmente, ela se parece com isso: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">import<\/span> requests\n\n<span style=\"color: #0891b2;\">url<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/boston-ma\/\"<\/span>\n<span style=\"color: #0891b2;\">response<\/span> = <span style=\"color: #9333ea;\">requests.get<\/span>(<span style=\"color: #0891b2;\">url<\/span>)\n\n<span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #0891b2;\">response<\/span>.status_code)\n<span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #0891b2;\">response<\/span>.text)<\/code><\/pre>\n<\/div>\n<p>Mas quando testei isso, n\u00e3o foram necess\u00e1rias nem duas tentativas, pois minha primeira solicita\u00e7\u00e3o foi bloqueada. Recebi uma resposta 403 com uma p\u00e1gina de bloqueio do PerimeterX: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #16a34a;\">403<\/span>\n<span style=\"color: #9333ea;\">&lt;!DOCTYPE<\/span> <span style=\"color: #16a34a;\">html<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n<span style=\"color: #9333ea;\">&lt;html<\/span> <span style=\"color: #16a34a;\">lang=<\/span><span style=\"color: #dc2626;\">\"en\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n<span style=\"color: #9333ea;\">&lt;head&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;meta<\/span> <span style=\"color: #16a34a;\">charset=<\/span><span style=\"color: #dc2626;\">\"utf-8\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;meta<\/span> <span style=\"color: #16a34a;\">name=<\/span><span style=\"color: #dc2626;\">\"viewport\"<\/span> <span style=\"color: #16a34a;\">content=<\/span><span style=\"color: #dc2626;\">\"width=device-width, initial-scale=1\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;meta<\/span> <span style=\"color: #16a34a;\">name=<\/span><span style=\"color: #dc2626;\">\"description\"<\/span> <span style=\"color: #16a34a;\">content=<\/span><span style=\"color: #dc2626;\">\"px-captcha\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;title&gt;<\/span>Access to this page has been denied<span style=\"color: #9333ea;\">&lt;\/title&gt;<\/span>\n<span style=\"color: #9333ea;\">&lt;\/head&gt;<\/span><\/code><\/pre>\n<\/div>\n<p>Esse \u00e9 o problema de raspar o Zillow diretamente. Uma solicita\u00e7\u00e3o Python normal n\u00e3o se comporta como uma sess\u00e3o de navega\u00e7\u00e3o real. Ela tamb\u00e9m n\u00e3o tem a impress\u00e3o digital correta do navegador, a qualidade do IP ou a renderiza\u00e7\u00e3o do JavaScript, o que permite que a Zillow a identifique imediatamente e bloqueie a solicita\u00e7\u00e3o.  <\/p>\n<p>\u00c9 por isso que n\u00e3o construo o raspador principal com base em chamadas diretas <strong>requests() <\/strong>para o Zillow. Em vez disso, envio minhas solicita\u00e7\u00f5es por meio do Web Unlocker da Floppydata e deixo que ele cuide das partes mais dif\u00edceis. <\/p>\n<h2><strong>Raspagem do Zillow com o Floppydata Web Unlocker<\/strong><\/h2>\n<p>Vamos enviar uma solicita\u00e7\u00e3o para a p\u00e1gina de pesquisa usando o Web Unlocker. O Zillow n\u00e3o \u00e9 o alvo mais dif\u00edcil de ser extra\u00eddo, mas ele se preocupa com a reputa\u00e7\u00e3o do IP e o comportamento do navegador. <\/p>\n<p>\u00c9 aqui que o Web Unlocker entra em a\u00e7\u00e3o. Ele roteia sua solicita\u00e7\u00e3o por meio de um IP residencial confi\u00e1vel, aplica uma impress\u00e3o digital real do navegador e retorna o HTML totalmente renderizado. <\/p>\n<p>Um aspecto que realmente me agrada no Floppydata \u00e9 que voc\u00ea s\u00f3 paga por solicita\u00e7\u00f5es bem-sucedidas. Se um scrape falhar, ele n\u00e3o ser\u00e1 contabilizado em seu uso. <\/p>\n<p>O painel tamb\u00e9m mostra an\u00e1lises de solicita\u00e7\u00f5es em tempo real, para que voc\u00ea possa acompanhar o uso, as taxas de sucesso e os cr\u00e9ditos restantes sem sair da p\u00e1gina.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44268\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image4-4.png\" alt=\"Floppydata Web Unlocker  \" width=\"1999\" height=\"1129\"><\/p>\n<p>Antes de escrever qualquer c\u00f3digo, gosto de testar primeiro o URL de destino no<a href=\"https:\/\/app.floppydata.com\/tools\/scrape\"> Web Unlocker <\/a>sem c\u00f3digo. Isso me permite ver o HTML de resposta antes de criar um analisador, para que eu saiba exatamente quais seletores e dados esperar. <\/p>\n<p>Usar a ferramenta Web Unlocker \u00e9 literalmente t\u00e3o f\u00e1cil quanto o ABC. Basta abrir o <a href=\"https:\/\/app.floppydata.com\/tools\/scrape\">Web Unlocker<\/a> no painel do Floppydata. Em seguida, cole este URL<a href=\"https:\/\/www.zillow.com\/boston-ma\/\" target=\"_blank\" rel=\"noopener\">&#8220;https:\/\/www.zillow.com\/boston-ma\/&#8221;<\/a>, clique no bot\u00e3o <strong>Scrape <\/strong>e aguarde alguns segundos  <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-44278\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3.png\" alt=\"Web Unlocker\" width=\"1159\" height=\"881\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3.png 1159w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3-300x228.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3-1024x778.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3-768x584.png 768w\" sizes=\"(max-width: 1159px) 100vw, 1159px\" \/><\/p>\n<p>Quando a extra\u00e7\u00e3o for conclu\u00edda, verifique o painel <strong>de visualiza\u00e7\u00e3o de sa\u00edda<\/strong> abaixo. Voc\u00ea dever\u00e1 ver a p\u00e1gina HTML completa contendo os resultados da pesquisa do Zillow. <\/p>\n<p>Se os dados parecerem bons, use <strong>Copiar HTML<\/strong> para captur\u00e1-los ou <strong>Baixar<\/strong> para salvar o arquivo localmente.<\/p>\n<h3><strong>Entenda a estrutura de pagina\u00e7\u00e3o do Zillow<\/strong><\/h3>\n<p>A visualiza\u00e7\u00e3o de sa\u00edda retornou HTML bruto, o que \u00e9 \u00fatil porque posso inspecionar a estrutura exata antes de escrever o c\u00f3digo.<\/p>\n<p>Isso \u00e9 semelhante a abrir as ferramentas de desenvolvimento do navegador pressionando <strong>F12<\/strong> e inspecionando a p\u00e1gina diretamente. Dentro do HTML baixado, encontrei uma coisa importante que torna o analisador muito mais f\u00e1cil. <\/p>\n<p>A maioria dos tutoriais dir\u00e1 a voc\u00ea para pegar os cart\u00f5es de listagem com seletores CSS, mas o Zillow renderiza apenas 9 cart\u00f5es na marca\u00e7\u00e3o da p\u00e1gina. Os outros 32 s\u00e3o carregados \u00e0 medida que voc\u00ea rola a p\u00e1gina, portanto, a extra\u00e7\u00e3o com seletores CSS perde a maior parte dos dados. <\/p>\n<p>Em vez disso, os resultados da pesquisa est\u00e3o em um grande objeto JSON no HTML da p\u00e1gina. Esse JSON fica dentro dessa tag de script: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #9333ea;\">&lt;script<\/span> <span style=\"color: #16a34a;\">id=<\/span><span style=\"color: #dc2626;\">\"__NEXT_DATA__\"<\/span> <span style=\"color: #16a34a;\">type=<\/span><span style=\"color: #dc2626;\">\"application\/json\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span><\/code><\/pre>\n<\/div>\n<p>A p\u00e1gina usa esse JSON para carregar os dados no frontend, e n\u00f3s tamb\u00e9m podemos l\u00ea-los. Dentro desse JSON, as listagens est\u00e3o neste exato caminho: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #0891b2;\">data<\/span>[<span style=\"color: #dc2626;\">\"props\"<\/span>][<span style=\"color: #dc2626;\">\"pageProps\"<\/span>][<span style=\"color: #dc2626;\">\"searchPageState\"<\/span>][<span style=\"color: #dc2626;\">\"cat1\"<\/span>][<span style=\"color: #dc2626;\">\"searchResults\"<\/span>][<span style=\"color: #dc2626;\">\"listResults\"<\/span>]<\/code><\/pre>\n<\/div>\n<p>Portanto, nosso plano de an\u00e1lise \u00e9 simples.<\/p>\n<p>Encontraremos o script <strong>__NEXT_DATA__ <\/strong>com o BeautifulSoup, analisaremos o JSON, passaremos para a matriz <strong>listResults<\/strong> e extrairemos os campos de que precisamos.<\/p>\n<h2><strong>Raspagem da Web do Zillow com Python e Web Unlocker<\/strong><\/h2>\n<p>Agora podemos passar do painel para o c\u00f3digo.<\/p>\n<p>O snippet do painel usa <strong>httpx<\/strong>, mas usarei <strong>requests<\/strong> aqui porque \u00e9 mais familiar para a maioria dos leitores de Python.<\/p>\n<h3><strong>Etapa 1: Configurar a solicita\u00e7\u00e3o<\/strong><\/h3>\n<p>Vamos come\u00e7ar com a configura\u00e7\u00e3o b\u00e1sica. Precisamos do endpoint do Web Unlocker, da nossa chave de API e do URL de destino do Zillow: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">import<\/span> requests\n<span style=\"color: #ea580c;\">import<\/span> json\n<span style=\"color: #ea580c;\">from<\/span> bs4 <span style=\"color: #ea580c;\">import<\/span> BeautifulSoup\n\n<span style=\"color: #0891b2;\">API_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/client-api.floppy.host\/v1\/webUnlocker\"<\/span>\n<span style=\"color: #0891b2;\">API_KEY<\/span> = <span style=\"color: #dc2626;\">\"YOUR_API_KEY\"<\/span>\n<span style=\"color: #0891b2;\">SEARCH_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/boston-ma\/\"<\/span>\n\n<span style=\"color: #0891b2;\">SEARCH_URL<\/span> = <span style=\"color: #dc2626;\">\"live_zillow_boston.json\"<\/span><\/code><\/pre>\n<\/div>\n<p><em>Substituir <\/em><strong><em>YOUR_API_KEY<\/em><\/strong><em> com a chave do seu painel do Floppydata.<\/em><\/p>\n<p>Estou usando Boston como o mercado-alvo aqui, mas se voc\u00ea quiser fazer o scraping de outra cidade, basta substituir o URL de pesquisa.<\/p>\n<h3><strong>Etapa 2: Obtenha a p\u00e1gina por meio do Web Unlocker<\/strong><\/h3>\n<p>O Web Unlocker recebe uma carga \u00fatil JSON com a URL de destino e algumas op\u00e7\u00f5es. Ele retorna uma resposta JSON que cont\u00e9m o HTML renderizado em um campo <strong>html<\/strong>: <\/p>\n<p>Agora, crio uma fun\u00e7\u00e3o <strong>fetch_html()<\/strong>para enviar o URL do Zillow para o Web Unlocker e retornar o HTML renderizado<\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">url<\/span>):\n    <span style=\"color: #0891b2;\">response<\/span> = <span style=\"color: #9333ea;\">requests.post<\/span>(\n        <span style=\"color: #0891b2;\">API_URL<\/span>,\n        headers={\n            <span style=\"color: #dc2626;\">\"Content-Type\"<\/span>: <span style=\"color: #dc2626;\">\"application\/json\"<\/span>,\n            <span style=\"color: #dc2626;\">\"X-Api-Key\"<\/span>: <span style=\"color: #0891b2;\">API_KEY<\/span>,\n        },\n        json={\n            <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">url<\/span>,\n            <span style=\"color: #dc2626;\">\"country\"<\/span>: <span style=\"color: #dc2626;\">\"US\"<\/span>,\n            <span style=\"color: #dc2626;\">\"city\"<\/span>: <span style=\"color: #dc2626;\">\"Boston\"<\/span>,\n            <span style=\"color: #dc2626;\">\"difficulty\"<\/span>: <span style=\"color: #dc2626;\">\"medium\"<\/span>,\n            <span style=\"color: #dc2626;\">\"expiration\"<\/span>: <span style=\"color: #16a34a;\">0<\/span>,\n        },\n        timeout=<span style=\"color: #16a34a;\">120<\/span>,\n    )\n    <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">raise_for_status<\/span>()\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">json<\/span>()\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"html\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">html<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Unlocker response did not include an 'html' field.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">html<\/span><\/code><\/pre>\n<\/div>\n<p>Algumas coisas est\u00e3o acontecendo aqui. Os campos de <strong>pa\u00eds<\/strong> e <strong>cidade<\/strong> ajudam a solicita\u00e7\u00e3o a corresponder melhor ao local de destino. Usei <strong>a dificuldade: &#8220;m\u00e9dia&#8221;<\/strong> porque o Zillow n\u00e3o \u00e9 uma p\u00e1gina est\u00e1tica simples, portanto, precisa de um processo de desbloqueio mais forte.  <\/p>\n<p>O campo <strong>de expira\u00e7\u00e3o<\/strong> est\u00e1 definido como <strong>0<\/strong>, portanto, recebo uma nova resposta. Depois que a solicita\u00e7\u00e3o \u00e9 bem-sucedida, o Web Unlocker retorna uma resposta JSON, e o HTML renderizado est\u00e1 dentro do campo <strong>html<\/strong>. <\/p>\n<h3><strong>Etapa 3: Extraia as listagens<\/strong><\/h3>\n<p>Agora podemos aplicar o plano de an\u00e1lise anterior. Criarei uma fun\u00e7\u00e3o <strong>extract_listings()<\/strong>. Essa fun\u00e7\u00e3o pega o HTML, encontra os dados JSON do Zillow e extrai as listagens:  <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>):\n    <span style=\"color: #0891b2;\">soup<\/span> = <span style=\"color: #9333ea;\">BeautifulSoup<\/span>(<span style=\"color: #0891b2;\">html<\/span>, <span style=\"color: #dc2626;\">\"html.parser\"<\/span>)\n    <span style=\"color: #0891b2;\">next_data<\/span> = <span style=\"color: #0891b2;\">soup<\/span>.<span style=\"color: #9333ea;\">find<\/span>(<span style=\"color: #dc2626;\">\"script\"<\/span>, id=<span style=\"color: #dc2626;\">\"__NEXT_DATA__\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span> <span style=\"color: #ea580c;\">or<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span>.string:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Could not find Zillow's __NEXT_DATA__ script.\"<\/span>)\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #9333ea;\">json.loads<\/span>(<span style=\"color: #0891b2;\">next_data<\/span>.string)\n    <span style=\"color: #0891b2;\">search_state<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"props\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"pageProps\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchPageState\"<\/span>, {})\n    <span style=\"color: #0891b2;\">list_results<\/span> = (\n        <span style=\"color: #0891b2;\">search_state<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"cat1\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchResults\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"listResults\"<\/span>, [])\n    )\n\n    <span style=\"color: #0891b2;\">listings<\/span> = []\n\n    <span style=\"color: #ea580c;\">for<\/span> <span style=\"color: #0891b2;\">item<\/span> <span style=\"color: #ea580c;\">in<\/span> <span style=\"color: #0891b2;\">list_results<\/span>:\n        <span style=\"color: #0891b2;\">listings<\/span>.<span style=\"color: #9333ea;\">append<\/span>(\n            {\n                <span style=\"color: #dc2626;\">\"zpid\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"zpid\"<\/span>),\n                <span style=\"color: #dc2626;\">\"address\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"address\"<\/span>),\n                <span style=\"color: #dc2626;\">\"price\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"price\"<\/span>),\n                <span style=\"color: #dc2626;\">\"beds\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"beds\"<\/span>),\n                <span style=\"color: #dc2626;\">\"baths\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"baths\"<\/span>),\n                <span style=\"color: #dc2626;\">\"sqft\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"area\"<\/span>),\n                <span style=\"color: #dc2626;\">\"status\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"statusType\"<\/span>),\n                <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"detailUrl\"<\/span>),\n            }\n        )\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">listings<\/span><\/code><\/pre>\n<\/div>\n<p>Usando o BeautifulSoup, posso facilmente ir direto para o JSON estruturado dentro da p\u00e1gina. Em seguida, analisei o conte\u00fado do script como JSON e obtive a matriz <strong>listResults<\/strong>. <\/p>\n<p>Cada item em listResults \u00e9 uma listagem de propriedades e, a partir de cada listagem, podemos coletar dados valiosos, como<\/p>\n<ul>\n<li>endere\u00e7o<\/li>\n<li>pre\u00e7o<\/li>\n<li>camas<\/li>\n<li>banhos<\/li>\n<li>\u00e1rea<\/li>\n<li>statusType<\/li>\n<li>detailUrl<\/li>\n<\/ul>\n<p>Renomeei a \u00e1rea para sqft na sa\u00edda final porque \u00e9 mais f\u00e1cil de entender.<\/p>\n<h3><strong>Etapa 4: Salve os resultados em um arquivo JSON<\/strong><\/h3>\n<p>Por fim, podemos adicionar uma fun\u00e7\u00e3o <strong>main()<\/strong> para executar o raspador e salvar a sa\u00edda em um arquivo JSON: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">main<\/span>():\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Fetching data from: {<span style=\"color: #0891b2;\">SEARCH_URL<\/span>}\"<\/span>)\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">SEARCH_URL<\/span>)\n    <span style=\"color: #0891b2;\">listings<\/span> = <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">listings<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">SystemExit<\/span>(<span style=\"color: #dc2626;\">\"No listings found in Zillow's JSON data.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">with<\/span> <span style=\"color: #9333ea;\">open<\/span>(<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>, <span style=\"color: #dc2626;\">\"w\"<\/span>, encoding=<span style=\"color: #dc2626;\">\"utf-8\"<\/span>) <span style=\"color: #ea580c;\">as<\/span> <span style=\"color: #0891b2;\">file<\/span>:\n        <span style=\"color: #9333ea;\">json.dump<\/span>(<span style=\"color: #0891b2;\">listings<\/span>, <span style=\"color: #0891b2;\">file<\/span>, indent=<span style=\"color: #16a34a;\">2<\/span>)\n\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Found {<span style=\"color: #9333ea;\">len<\/span>(<span style=\"color: #0891b2;\">listings<\/span>)} listings\"<\/span>)\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Saved results to {<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>}\"<\/span>)<\/code><\/pre>\n<\/div>\n<p>Essa fun\u00e7\u00e3o busca a p\u00e1gina, extrai as listagens, verifica se a lista n\u00e3o est\u00e1 vazia e salva tudo em um arquivo JSON. Quando os dados parecerem bons, poderemos convert\u00ea-los em CSV mais tarde ou usar os dados diretamente em nossos aplicativos. <\/p>\n<h3><strong>O roteiro completo<\/strong><\/h3>\n<p>Aqui est\u00e1 todo o c\u00f3digo que usei para extrair com \u00eaxito minhas listagens do Zillow:<\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">from<\/span> bs4 <span style=\"color: #ea580c;\">import<\/span> BeautifulSoup\n<span style=\"color: #ea580c;\">import<\/span> requests\n<span style=\"color: #ea580c;\">import<\/span> json\n\n<span style=\"color: #0891b2;\">API_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/client-api.floppy.host\/v1\/webUnlocker\"<\/span>\n<span style=\"color: #0891b2;\">API_KEY<\/span> = <span style=\"color: #dc2626;\">\"Your_API_KEY\"<\/span>\n<span style=\"color: #0891b2;\">SEARCH_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/boston-ma\/\"<\/span>\n<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span> = <span style=\"color: #dc2626;\">\"live_zillow_boston.json\"<\/span>\n\n\n<span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">url<\/span>):\n    <span style=\"color: #0891b2;\">response<\/span> = <span style=\"color: #9333ea;\">requests.post<\/span>(\n        <span style=\"color: #0891b2;\">API_URL<\/span>,\n        headers={\n            <span style=\"color: #dc2626;\">\"Content-Type\"<\/span>: <span style=\"color: #dc2626;\">\"application\/json\"<\/span>,\n            <span style=\"color: #dc2626;\">\"X-Api-Key\"<\/span>: <span style=\"color: #0891b2;\">API_KEY<\/span>,\n        },\n        json={\n            <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">url<\/span>,\n            <span style=\"color: #dc2626;\">\"country\"<\/span>: <span style=\"color: #dc2626;\">\"US\"<\/span>,\n            <span style=\"color: #dc2626;\">\"city\"<\/span>: <span style=\"color: #dc2626;\">\"Boston\"<\/span>,\n            <span style=\"color: #dc2626;\">\"difficulty\"<\/span>: <span style=\"color: #dc2626;\">\"medium\"<\/span>,\n            <span style=\"color: #dc2626;\">\"expiration\"<\/span>: <span style=\"color: #16a34a;\">0<\/span>,\n        },\n        timeout=<span style=\"color: #16a34a;\">120<\/span>,\n    )\n    <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">raise_for_status<\/span>()\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">json<\/span>()\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"html\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">html<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Unlocker response did not include an 'html' field.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">html<\/span>\n\n\n<span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>):\n    <span style=\"color: #0891b2;\">soup<\/span> = <span style=\"color: #9333ea;\">BeautifulSoup<\/span>(<span style=\"color: #0891b2;\">html<\/span>, <span style=\"color: #dc2626;\">\"html.parser\"<\/span>)\n    <span style=\"color: #0891b2;\">next_data<\/span> = <span style=\"color: #0891b2;\">soup<\/span>.<span style=\"color: #9333ea;\">find<\/span>(<span style=\"color: #dc2626;\">\"script\"<\/span>, id=<span style=\"color: #dc2626;\">\"__NEXT_DATA__\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span> <span style=\"color: #ea580c;\">or<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span>.string:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Could not find Zillow's __NEXT_DATA__ script.\"<\/span>)\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #9333ea;\">json.loads<\/span>(<span style=\"color: #0891b2;\">next_data<\/span>.string)\n    <span style=\"color: #0891b2;\">search_state<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"props\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"pageProps\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchPageState\"<\/span>, {})\n    <span style=\"color: #0891b2;\">list_results<\/span> = (\n        <span style=\"color: #0891b2;\">search_state<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"cat1\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchResults\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"listResults\"<\/span>, [])\n    )\n\n    <span style=\"color: #0891b2;\">listings<\/span> = []\n\n    <span style=\"color: #ea580c;\">for<\/span> <span style=\"color: #0891b2;\">item<\/span> <span style=\"color: #ea580c;\">in<\/span> <span style=\"color: #0891b2;\">list_results<\/span>:\n        <span style=\"color: #0891b2;\">listings<\/span>.<span style=\"color: #9333ea;\">append<\/span>(\n            {\n                <span style=\"color: #dc2626;\">\"zpid\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"zpid\"<\/span>),\n                <span style=\"color: #dc2626;\">\"address\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"address\"<\/span>),\n                <span style=\"color: #dc2626;\">\"price\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"price\"<\/span>),\n                <span style=\"color: #dc2626;\">\"beds\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"beds\"<\/span>),\n                <span style=\"color: #dc2626;\">\"baths\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"baths\"<\/span>),\n                <span style=\"color: #dc2626;\">\"sqft\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"area\"<\/span>),\n                <span style=\"color: #dc2626;\">\"status\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"statusType\"<\/span>),\n                <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"detailUrl\"<\/span>),\n            }\n        )\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">listings<\/span>\n\n\n<span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">main<\/span>():\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Fetching data from: {<span style=\"color: #0891b2;\">SEARCH_URL<\/span>}\"<\/span>)\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">SEARCH_URL<\/span>)\n    <span style=\"color: #0891b2;\">listings<\/span> = <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">listings<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">SystemExit<\/span>(<span style=\"color: #dc2626;\">\"No listings found in Zillow's JSON data.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">with<\/span> <span style=\"color: #9333ea;\">open<\/span>(<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>, <span style=\"color: #dc2626;\">\"w\"<\/span>, encoding=<span style=\"color: #dc2626;\">\"utf-8\"<\/span>) <span style=\"color: #ea580c;\">as<\/span> <span style=\"color: #0891b2;\">file<\/span>:\n        <span style=\"color: #9333ea;\">json.dump<\/span>(<span style=\"color: #0891b2;\">listings<\/span>, <span style=\"color: #0891b2;\">file<\/span>, indent=<span style=\"color: #16a34a;\">2<\/span>)\n\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Found {<span style=\"color: #9333ea;\">len<\/span>(<span style=\"color: #0891b2;\">listings<\/span>)} listings\"<\/span>)\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Saved results to {<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>}\"<\/span>)\n\n\n<span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #6366f1;\">__name__<\/span> == <span style=\"color: #dc2626;\">\"__main__\"<\/span>:\n    <span style=\"color: #9333ea;\">main<\/span>()<\/code><\/pre>\n<\/div>\n<p>Se tudo estiver configurado corretamente, voc\u00ea ver\u00e1 um resultado como este:<\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code>[\n  {\n    <span style=\"color: #dc2626;\">\"zpid\"<\/span>: <span style=\"color: #dc2626;\">\"59174136\"<\/span>,\n    <span style=\"color: #dc2626;\">\"address\"<\/span>: <span style=\"color: #dc2626;\">\"45 Garden St APT 3, Boston, MA 02114\"<\/span>,\n    <span style=\"color: #dc2626;\">\"price\"<\/span>: <span style=\"color: #dc2626;\">\"$685,000\"<\/span>,\n    <span style=\"color: #dc2626;\">\"beds\"<\/span>: <span style=\"color: #16a34a;\">2<\/span>,\n    <span style=\"color: #dc2626;\">\"baths\"<\/span>: <span style=\"color: #16a34a;\">1<\/span>,\n    <span style=\"color: #dc2626;\">\"sqft\"<\/span>: <span style=\"color: #16a34a;\">525<\/span>,\n    <span style=\"color: #dc2626;\">\"status\"<\/span>: <span style=\"color: #dc2626;\">\"FOR_SALE\"<\/span>,\n    <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/homedetails\/45-Garden-St-APT-3-Boston-MA-02114\/59174136_zpid\/\"<\/span>\n  }\n]<\/code><\/pre>\n<\/div>\n<p>Nesse ponto, seu scraper est\u00e1 funcionando, o que significa que agora voc\u00ea pode extrair informa\u00e7\u00f5es importantes de qualquer listagem do Zillow.<\/p>\n<h2><strong>Solu\u00e7\u00e3o de problemas comuns<\/strong><\/h2>\n<p>Se voc\u00ea costuma pesquisar os dados de propriedades do Zillow com frequ\u00eancia, \u00e9 prov\u00e1vel que encontre algumas barreiras em alguns momentos. Eu mesmo j\u00e1 enfrentei algumas delas. Portanto, posso dizer a voc\u00ea o que esperar, inclusive:  <\/p>\n<ul>\n<li><strong>Erros<\/strong><strong>403<\/strong>: Isso significa que a Zillow bloqueou seu bot. Tente alterar seus cabe\u00e7alhos ou usar um proxy para continuar coletando dados do Zillow. <\/li>\n<li><strong>Respostas<\/strong><strong>vazias<\/strong>: Isso pode ser devido \u00e0 renderiza\u00e7\u00e3o do JavaScript. Tente usar uma ferramenta que renderize totalmente a p\u00e1gina antes de retornar o HTML, como o Web Unlocker. <\/li>\n<li><strong>Dados<\/strong><strong>ausentes<\/strong>: Nem todas as listagens t\u00eam as mesmas informa\u00e7\u00f5es. Sempre use .get() ao extrair dados do Zillow para que seu scraper n\u00e3o trave em uma chave ausente.<\/li>\n<\/ul>\n<p>Como o Zillow n\u00e3o oferece uma API gratuita, voc\u00ea ter\u00e1 que encontrar uma maneira de contornar isso. Se voc\u00ea precisa de uma maneira confi\u00e1vel de acessar os dados de listagem do Zillow, o Web Unlocker da Floppydata \u00e9 sua melhor aposta. <\/p>\n<h2><strong>Conclus\u00e3o<\/strong><\/h2>\n<p>O Zillow n\u00e3o parece ser um site de alta seguran\u00e7a, mas \u00e9 protegido pelo PerimeterX e por um sistema de detec\u00e7\u00e3o em camadas que observa seu IP, cabe\u00e7alhos, impress\u00e3o digital TLS e sinais comportamentais. Se voc\u00ea agir de forma suspeita, ser\u00e1 sinalizado e banido indefinidamente. <\/p>\n<p>Portanto, voc\u00ea precisa ter cuidado ao rasp\u00e1-lo. \u00c9 a\u00ed que entra o Floppydata Web Unlocker. Ele:  <\/p>\n<ul>\n<li>Rotaciona proxies residenciais premium<\/li>\n<li>Rota\u00e7\u00e3o de cabe\u00e7alhos e impress\u00e3o digital real do navegador<\/li>\n<li>Sempre carrega de forma limpa e totalmente em HTML<\/li>\n<li>Somente faturas para respostas bem-sucedidas<\/li>\n<\/ul>\n<p>Com essa configura\u00e7\u00e3o, voc\u00ea n\u00e3o precisa combater o sistema anti-bot do Zillow sozinho; deixe o Floppy Data Web Unlocker ajud\u00e1-lo. <a href=\"https:\/\/app.floppydata.com\/tools\/scrape\">Comece a fazer scraping do Zillow<\/a> agora com <strong>5 scrapes gratuitos<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o Por ser uma das principais plataformas imobili\u00e1rias dos EUA, a Zillow se torna uma plataforma que muitas empresas desejam explorar para obter dados sobre propriedades. Atualmente, a plataforma recebe cerca de 243 milh\u00f5es de visitas por m\u00eas, portanto, naturalmente, ela cont\u00e9m uma enorme quantidade de dados \u00fateis sobre im\u00f3veis. No entanto, os desenvolvedores frequentemente [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":44292,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[441,491,564],"tags":[],"class_list":["post-44372","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-how-to","category-scraping"],"acf":[],"_links":{"self":[{"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/posts\/44372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/comments?post=44372"}],"version-history":[{"count":0,"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/posts\/44372\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/media\/44292"}],"wp:attachment":[{"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/media?parent=44372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/categories?post=44372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/floppydata.com\/pt-br\/wp-json\/wp\/v2\/tags?post=44372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}