the holy quest for the holy home
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Yutsuo c5e95a6095 many updates. many. 1 month ago
.venv first commit 2 months ago
__pycache__ many updates. many. 1 month ago
dfimoveis_data many updates. many. 1 month ago
docs many updates. many. 1 month ago
reports many updates. many. 1 month ago
resources first commit 2 months ago
scripts many updates. many. 1 month ago
tests many updates. many. 1 month ago
.gitignore many updates. many. 1 month ago
AGENTS.md many updates. many. 1 month ago
README.md many updates. many. 1 month ago
dfimoveis_scraper.py many updates. many. 1 month ago
headers.txt first commit 2 months ago
house-quest.code-workspace first commit 2 months ago
requirements-dfimoveis.txt many updates. many. 1 month ago
response.html first commit 2 months ago
run_scraper.ps1 many updates. many. 1 month ago
search_list.txt many updates. many. 1 month ago
used_commands.ps1 first commit 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:

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.