|
|
1 month ago | |
|---|---|---|
| .venv | 2 months ago | |
| __pycache__ | 1 month ago | |
| dfimoveis_data | 1 month ago | |
| docs | 1 month ago | |
| reports | 1 month ago | |
| resources | 2 months ago | |
| scripts | 1 month ago | |
| tests | 1 month ago | |
| .gitignore | 1 month ago | |
| AGENTS.md | 1 month ago | |
| README.md | 1 month ago | |
| dfimoveis_scraper.py | 1 month ago | |
| headers.txt | 2 months ago | |
| house-quest.code-workspace | 2 months ago | |
| requirements-dfimoveis.txt | 1 month ago | |
| response.html | 2 months ago | |
| run_scraper.ps1 | 1 month ago | |
| search_list.txt | 1 month ago | |
| used_commands.ps1 | 2 months ago | |
README.md
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.
A prioridade operacional atual é o Jardins Mangueiral. O Cruzeiro permanece apenas como histórico e alternativa oportunística; sua URL foi removida da coleta corrente.
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:
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 e docs/PROPERTY_CRITERIA.md.
Estrutura do repositório
.
├── 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: objetivo, contexto residencial e premissas financeiras;
- PROPERTY_CRITERIA.md: critérios funcionais e de visita;
- DATA_MODEL.md: modelo conceitual desejado;
- ACTUAL_SCHEMA.md: esquema físico observado;
- ANALYSIS_RULES.md: regras metodológicas;
- 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:
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 contém uma URL completa por linha. Atualmente ele cobre 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
.\.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.
& "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:
.\.venv-scraper\Scripts\python.exe .\dfimoveis_scraper.py `
--search-file .\search_list.txt `
--output .\dfimoveis_data `
--attach-chrome
Consulte todas as opções com:
.\.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:
dfimoveis_data/dfimoveis.sqlite3
Ele deve ser tratado como estritamente somente leitura durante análises. Nunca grave resultados derivados dentro dele.
O schema v2 preserva os valores brutos e oferece campos normalizados, quarentenas e visões auditáveis. Consultas de fotos devem preferir v_primary_photos; a migração idempotente está em scripts/migrate_dfimoveis_schema_v2.py.
Quando não houver processo de coleta e não existir WAL relevante:
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:
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 antes de escrever consultas analíticas.
Reproduzindo os relatórios
Cada relatório regional contém:
reports/<relatorio>/
├── README.md
├── analysis.py
├── photo_similarity.py
├── query.sql
├── parameters.json
└── results.csv
Extração tabular somente leitura:
.\.venv-scraper\Scripts\python.exe .\reports\cruzeiro_top15\analysis.py
.\.venv-scraper\Scripts\python.exe .\reports\mangueiral_top15\analysis.py
Triagem de possíveis duplicatas por similaridade visual:
.\.venv-scraper\Scripts\python.exe .\reports\cruzeiro_top15\photo_similarity.py
.\.venv-scraper\Scripts\python.exe .\reports\mangueiral_top15\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.