Trova casa lungo la Linea 1 della metropolitana di Torino — ricerca automatizzata su immobiliare.it, arricchita con parcheggi in tempo reale e indicatori di zona, con tanto di mappa interattiva.
- Cosa fa
- Come funziona
- Avvio rapido
- Configurazione
- Mappa interattiva
- Parcheggi e indicatori di zona
- Altri portali (casa.it, idealista.it)
- Uso responsabile delle API
- Struttura del progetto
- Disclaimer
Cercare casa vicino alla metro di Torino a mano è lento: bisogna aprire la mappa, controllare a occhio la distanza da ogni fermata, e ripetere la ricerca su immobiliare.it decine di volte. Questo progetto lo fa in automatico:
| 🔎 | Interroga l'API di immobiliare.it una volta per ognuna delle 21 fermate della Linea 1 |
| 📏 | Calcola la distanza reale (formula haversine) dalla fermata più vicina per ogni annuncio |
| 🧹 | Elimina i duplicati tra fermate vicine e applica i tuoi filtri (piano, ascensore, cantina, riscaldamento, aste...) |
| Arricchisce ogni annuncio con parcheggi in tempo reale, servizi e locali di zona | |
| 🗺️ | Genera una mappa interattiva con filtri, ordinamento e collegamento diretto all'annuncio |
Nessuna API key, nessun account, nessun servizio a pagamento: solo endpoint pubblici già usati dai rispettivi siti web.
flowchart TD
subgraph Fonti["Fonti dati pubbliche"]
IMM[("immobiliare.it<br/>api-next/search-list")]
OSM[("OpenStreetMap<br/>Overpass API")]
GTT[("Comune di Torino / 5T<br/>parcheggi live")]
end
MS["metro_stations.py<br/>21 fermate Linea 1"] --> CC
IMM --> IC["immobiliare_client.py"] --> CC["cerca_casa.py<br/>ricerca · dedup · filtri"]
OSM --> ZI["zone_info.py"]
GTT --> ZI
ZI --> CC
CC --> CSV[("risultati.csv")]
CC --> MH["mappa_html.py"] --> HTML[("mappa.html<br/>mappa interattiva")]
metro_stations.py— le 21 fermate della Linea 1, coordinate reali da OpenStreetMap.immobiliare_client.py— interroga l'API pubblica di immobiliare.it passandocentro=lat,loneraggio=metri(lo stesso parametro di ricerca per prossimità usato dal sito), più i filtri reali disponibili (ascensore, cantina, piano, riscaldamento, stato).zone_info.py— arricchisce ogni annuncio con parcheggi in struttura (dati live) e indicatori di zona da OpenStreetMap.cerca_casa.py— orchestratore: unisce i risultati di tutte le fermate, deduplica, applica i filtri lato client (piano esatto, aste, riscaldamento/esposizione dedotti dal testo) e ordina.mappa_html.py— genera la mappa interattiva autonoma.
pip install -r requirements.txt
python cerca_casa.pyAlla fine dell'esecuzione trovi:
- i primi 20 risultati stampati a schermo;
- l'elenco completo in
risultati.csv; - una mappa interattiva in
mappa.html, che si apre da sola nel browser.
Tutti i parametri si modificano nel dizionario CONFIG in cima a cerca_casa.py.
| Parametro | Cosa fa |
|---|---|
contratto |
"vendita" oppure "affitto" |
raggio_metri |
Distanza massima da una fermata metro |
prezzo_max / prezzo_min |
Range di prezzo |
locali_min |
Numero minimo di locali |
superficie_min |
Superficie minima in m² |
ascensore / cantina |
Filtri reali dell'API di immobiliare.it |
escludi_aste |
Esclude le aste giudiziarie, che compaiono occasionalmente anche in una ricerca "vendita" normale (~1 ogni 250 annunci) |
piano_min / piano_max |
L'API espone solo categorie larghe (terra / intermedi / ultimo): lo script pre-filtra con quelle e poi calcola il piano esatto leggendo il testo dell'annuncio (gestisce formati come "3", "da 3 a 4", "interrato (-3), 3") |
richiedi_doppia_esposizione |
La doppia esposizione non è un filtro reale, viene dedotta dal testo — di default è solo informativa (colonna nel CSV), perché è esplicitata solo in una minoranza di annunci |
richiedi_riscaldamento_autonomo_o_valvole |
Riscaldamento autonomo (filtro reale) oppure menzione di "valvole termostatiche" nel testo |
preferisci_ristrutturato |
Non esclude nulla: porta in cima gli annunci "in buone condizioni", riconoscendo anche sinonimi/gergo di settore ("ottimo stato", "rinnovato", "rimesso a nuovo"...), non solo la parola "ristrutturato" |
analizza_zona |
Attiva gli indicatori di parcheggio/zona (vedi sotto). False per una ricerca più veloce |
output_csv / output_html |
Nomi dei file generati |
apri_mappa_nel_browser |
Apre mappa.html in automatico a fine ricerca |
💡 Ogni filtro "non reale dell'API" nel codice è documentato con un commento che spiega come viene dedotto e perché ha quel comportamento di default — utile prima di cambiarlo.
mappa.html è una pagina autonoma (mappa Leaflet/OpenStreetMap a sinistra, elenco a destra): non serve un server, si apre con un doppio click e i dati sono incorporati direttamente nel file.
- 🚇 Le fermate della metro sono badge rossi con la "M", nome sempre visibile.
- 🖱️ Passare il mouse su una scheda della lista centra la mappa sulla casa corrispondente e ne apre il popup.
- 🔗 Cliccare su una scheda apre direttamente l'annuncio in una nuova scheda (link
<a target="_blank">reale — mai bloccato dal blocco popup del browser). - 📍 Cliccare su un marker apre un popup con le info principali e un pulsante "Apri annuncio".
| Filtro | Ordinamento | ||
|---|---|---|---|
| Zona | ✅ | Distanza dalla metro | ✅ |
| Prezzo massimo | ✅ | Prezzo | ✅ |
| Superficie minima | ✅ | Superficie | ✅ |
| Distanza massima dalla metro | ✅ | Rilevanza della zona 🆕 | ✅ |
| Locali minimi | ✅ | ||
| Solo in buone condizioni | ✅ | ||
| Solo riscaldamento autonomo | ✅ | ||
| Solo doppia esposizione | ✅ | ||
| Solo con parcheggio in struttura vicino | ✅ |
I filtri si applicano sia alla lista sia ai marker sulla mappa (i risultati esclusi vengono nascosti), e la vista si adatta automaticamente. L'ordinamento per rilevanza zona usa un punteggio proxy calcolato combinando servizi diurni, parcheggi e vicinanza alla metro entro 300m (formula trasparente in mappa_html.py, funzione punteggioZona — non è una recensione reale, vedi sotto).
| Indicatore | Fonte | Tipo |
|---|---|---|
| Parcheggio in struttura più vicino + posti liberi | Comune di Torino / 5T (opendata.5t.torino.it), aggiornato ogni ~5 minuti |
✅ Dato reale e live |
| Parcheggi pubblici entro 300m | OpenStreetMap (Overpass API) | ✅ Dato reale |
| Locali notturni entro 300m | OpenStreetMap | |
| Servizi diurni entro 300m | OpenStreetMap | |
| Distanza dalla polizia/carabinieri più vicina | OpenStreetMap |
⚠️ Nota importante: non esiste una fonte pubblica affidabile di recensioni per quartiere a Torino (niente equivalente italiano di un "Niceareas"). Gli indicatori di zona sopra i "dati reali" sono proxy, non un giudizio di sicurezza: molti locali notturni vicini può voler dire zona viva ma potenzialmente rumorosa la sera; molti servizi diurni indica comodità quotidiana; la distanza dalla polizia è solo una distanza, non un indice di criminalità.
I punti OpenStreetMap vengono scaricati una volta e tenuti in cache locale (zone_cache.json) per 7 giorni, per non sovraccaricare il servizio gratuito. Cancella il file per forzare un aggiornamento.
Non inclusi nell'automazione, per motivi tecnici e non:
- casa.it — nessuna API JSON pubblica richiamabile direttamente (risultati renderizzati lato server) ed è protetto da DataDome (anti-bot).
- idealista.it — storicamente molto aggressiva a livello legale contro lo scraping automatizzato dei propri annunci.
Lo script stampa comunque due link generici a questi portali da controllare manualmente come doppio controllo.
Questo progetto chiama solo endpoint pubblici già usati dai rispettivi siti (lo stesso traffico che genereresti navigando normalmente), con pause tra le richieste paginate. È pensato per uso personale e non intensivo:
- non ridurre le pause tra le richieste;
- non lanciare lo script troppo di frequente;
- rispetta i Termini di Servizio dei siti coinvolti.
CercaCasa/
├── cerca_casa.py # orchestratore: ricerca, filtri, dedup, output
├── immobiliare_client.py # client per l'API di immobiliare.it
├── metro_stations.py # 21 fermate della Linea 1 (coordinate OSM)
├── zone_info.py # parcheggi live + indicatori di zona (OSM/5T)
├── geo_utils.py # haversine e utility geografiche condivise
├── mappa_html.py # generatore della mappa interattiva
├── requirements.txt
└── README.md
Progetto personale, non affiliato con immobiliare.it, casa.it, idealista.it, Comune di Torino o 5T. Usa endpoint pubblici reverse-engineered a scopo di ricerca personale della casa: nessuna garanzia di stabilità nel tempo (i siti possono cambiare le proprie API senza preavviso).