# Busca de Imóveis DF Projeto pessoal para coletar, organizar e analisar anúncios imobiliários do Distrito Federal, com foco em uma decisão residencial de longo prazo. As regiões prioritárias são: 1. Cruzeiro, especialmente Cruzeiro Novo; 2. Jardins Mangueiral. O objetivo não é identificar simplesmente o menor preço anunciado. A análise considera funcionalidade, estado do imóvel, risco de reforma, localização, liquidez, custos de aquisição e manutenção e adequação à vida familiar. ## Estado atual O repositório contém: - scraper autorizado para o portal DF Imóveis; - banco SQLite com anúncios, snapshots de conteúdo, execuções de coleta e fotos; - HTMLs brutos para reextração e auditoria; - plantas e mapas de apoio do Jardins Mangueiral; - relatórios reproduzíveis para priorização de visitas. Relatórios principais: - [Top 10 — Cruzeiro Novo](reports/cruzeiro_top10/README.md) - [Top 10 — Jardins Mangueiral](reports/mangueiral_top10/README.md) - [Cruzeiro Novo x Jardins Mangueiral](reports/cruzeiro_vs_mangueiral/README.md) Os rankings são prioridades de investigação, não recomendações automáticas de compra nem estimativas de preço negociado. ## Princípios metodológicos - Diferenciar anúncio, snapshot histórico e imóvel físico provável. - Tratar preço como valor pedido, não como preço de transação. - Não interpretar retirada de anúncio como prova de venda. - Deduplicar republicações e anúncios do mesmo imóvel de forma reversível. - Não calcular preço por metro quadrado quando o conceito de área não for comparável. - Considerar fotos, descrições e HTML bruto, sem assumir que confirmam estrutura ou documentação. - Excluir do ranking de visitas anúncios cuja primeira foto indique “vendido” ou “negócio fechado”, registrando-os em quarentena visual. - Para o Jardins Mangueiral, considerar somente casas com planta original provável de três quartos. - Não penalizar automaticamente quintais fechados; avaliar sua funcionalidade, ventilação e qualidade construtiva. As regras completas estão em [docs/ANALYSIS_RULES.md](docs/ANALYSIS_RULES.md) e [docs/PROPERTY_CRITERIA.md](docs/PROPERTY_CRITERIA.md). ## Estrutura do repositório ```text . ├── dfimoveis_scraper.py # coletor principal ├── search_list.txt # buscas executadas pelo scraper ├── requirements-dfimoveis.txt # dependências Python ├── dfimoveis_data/ # banco, fotos, HTML bruto e perfil do navegador ├── docs/ # contexto, critérios, modelo e regras ├── reports/ # relatórios e artefatos reproduzíveis └── resources/ ├── maps/ # capturas de mapas do Mangueiral └── plans/ # plantas de referência de casas de dois e três quartos ``` Documentação essencial: - [PROJECT_CONTEXT.md](docs/PROJECT_CONTEXT.md): objetivo, contexto residencial e premissas financeiras; - [PROPERTY_CRITERIA.md](docs/PROPERTY_CRITERIA.md): critérios funcionais e de visita; - [DATA_MODEL.md](docs/DATA_MODEL.md): modelo conceitual desejado; - [ACTUAL_SCHEMA.md](docs/ACTUAL_SCHEMA.md): esquema físico observado; - [ANALYSIS_RULES.md](docs/ANALYSIS_RULES.md): regras metodológicas; - [AGENTS.md](AGENTS.md): instruções operacionais e de segurança. ## Requisitos - Python 3.12 ou posterior; - Google Chrome ou Microsoft Edge para a coleta assistida por navegador; - PowerShell para os exemplos abaixo. Crie um ambiente virtual e instale as dependências: ```powershell python -m venv .venv-scraper .\.venv-scraper\Scripts\python.exe -m pip install -r requirements-dfimoveis.txt ``` As ferramentas de similaridade fotográfica usam Pillow, incluído no arquivo de requisitos. ## Configuração das buscas O arquivo [search_list.txt](search_list.txt) contém uma URL completa por linha. Atualmente ele cobre: - apartamentos de três quartos no Cruzeiro Novo; - casas anunciadas com três ou quatro quartos no Jardins Mangueiral. A busca do Mangueiral inclui quatro quartos para ampliar a coleta, mas esses imóveis são excluídos da análise regional. Mesmo três quartos anunciados não comprovam a planta original. ## Executando o scraper Use apenas em sites e condições para os quais você tenha autorização. Respeite termos aplicáveis, limites de requisição e mecanismos de proteção do portal. ### Navegador iniciado pelo scraper ```powershell .\.venv-scraper\Scripts\python.exe .\dfimoveis_scraper.py ` --search-file .\search_list.txt ` --output .\dfimoveis_data ``` ### Chrome iniciado manualmente Quando necessário, inicie uma instância separada do Chrome com depuração remota. Não use o perfil cotidiano do navegador. ```powershell & "C:\Program Files\Google\Chrome\Application\chrome.exe" ` --remote-debugging-port=9222 ` --user-data-dir="E:\forge\python\house-quest\dfimoveis_data\browser-profile" ``` Em outro terminal: ```powershell .\.venv-scraper\Scripts\python.exe .\dfimoveis_scraper.py ` --search-file .\search_list.txt ` --output .\dfimoveis_data ` --attach-chrome ``` Consulte todas as opções com: ```powershell .\.venv-scraper\Scripts\python.exe .\dfimoveis_scraper.py --help ``` Não execute o scraper enquanto uma análise espera um snapshot estável do banco. ## Banco de dados O banco principal fica em: ```text dfimoveis_data/dfimoveis.sqlite3 ``` Ele deve ser tratado como estritamente somente leitura durante análises. Nunca grave resultados derivados dentro dele. Quando não houver processo de coleta e não existir WAL relevante: ```python import sqlite3 connection = sqlite3.connect( "file:dfimoveis_data/dfimoveis.sqlite3?mode=ro&immutable=1", uri=True, ) connection.execute("PRAGMA query_only = ON") ``` Quando existir `dfimoveis.sqlite3-wal` ou houver possibilidade de atualização concorrente, não use `immutable=1`: ```python connection = sqlite3.connect( "file:dfimoveis_data/dfimoveis.sqlite3?mode=ro", uri=True, ) connection.execute("PRAGMA query_only = ON") connection.execute("BEGIN") ``` Não remova arquivos `-wal` ou `-shm`. Consulte [ACTUAL_SCHEMA.md](docs/ACTUAL_SCHEMA.md) antes de escrever consultas analíticas. ## Reproduzindo os relatórios Cada relatório regional contém: ```text reports// ├── README.md ├── analysis.py ├── photo_similarity.py ├── query.sql ├── parameters.json └── results.csv ``` Extração tabular somente leitura: ```powershell .\.venv-scraper\Scripts\python.exe .\reports\cruzeiro_top10\analysis.py .\.venv-scraper\Scripts\python.exe .\reports\mangueiral_top10\analysis.py ``` Triagem de possíveis duplicatas por similaridade visual: ```powershell .\.venv-scraper\Scripts\python.exe .\reports\cruzeiro_top10\photo_similarity.py .\.venv-scraper\Scripts\python.exe .\reports\mangueiral_top10\photo_similarity.py ``` Similaridade de imagem é apenas um sinal para revisão humana, nunca prova automática de que dois anúncios representam o mesmo imóvel. ## Limitações - A cobertura atual usa um único portal e poucas datas de coleta. - O banco representa anúncios e mudanças de conteúdo, não transações imobiliárias. - Localização e campos de anunciante apresentam contaminação de extração documentada. - A área estruturada não informa de forma segura se é útil, privativa, construída, total ou de terreno. - Fotos podem conter material genérico, itens de outros anúncios e selos de venda. - Fotos não confirmam documentação, sistemas elétricos e hidráulicos, impermeabilização, ruído ou conforto térmico. - A situação financeira registrada deve ser atualizada antes de proposta, financiamento ou definição de preço máximo. ## Segurança e privacidade - Não publique credenciais, cookies, tokens, sessões ou perfis do navegador. - Não envie o banco ou grandes amostras a serviços externos sem autorização. - Não tente contornar mecanismos de proteção de sites. - O diretório `dfimoveis_data/` é ignorado pelo Git e deve permanecer local. - Revise qualquer artefato derivado antes de versioná-lo para evitar dados pessoais. ## Finalidade Este projeto apoia uma decisão pessoal de compra residencial. Ele não constitui avaliação imobiliária profissional, parecer jurídico, inspeção de engenharia ou recomendação financeira.