MatteoScript commited on
Commit
69d9981
·
verified ·
1 Parent(s): 479d03f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +86 -23
app.py CHANGED
@@ -9,6 +9,7 @@ import numpy as np
9
  import streamlit as st
10
  import os
11
  from groq import Groq
 
12
 
13
  def clean_text(text):
14
  return re.sub(r'\s+', ' ', text).strip()
@@ -80,10 +81,13 @@ def extract_info(provincia, comune, prezzo_medio_mq, listing):
80
  info['Vantaggioso'] = False
81
  return info
82
 
 
 
 
83
  # Legge gli ANNUNCI (pagina x pagina) sulla base del COMUNE di appartenenza
84
  def scrape_immobiliare(provincia, comune, prezzo_medio_mq, prezzo_minimo, prezzo_massimo, locali_minimo, locali_massimo):
85
  print(provincia + " " + comune + " " + prezzo_medio_mq)
86
- comune_url = comune.replace(" ", "-")
87
  if st.tipologia_case == "Asta Immobiliare":
88
  tipologia_url = "aste-immobiliari"
89
  else:
@@ -94,26 +98,35 @@ def scrape_immobiliare(provincia, comune, prezzo_medio_mq, prezzo_minimo, prezzo
94
  url = base_url
95
  while True:
96
  print(f'Elaborazione pagina {page}')
97
- response = requests.get(url)
98
- soup = BeautifulSoup(response.content, 'html.parser')
99
- listings = soup.find_all('li', class_='nd-list__item in-searchLayoutListItem')
100
- if not listings:
101
- break
102
- for listing in listings:
103
- results.append(extract_info(provincia, comune, prezzo_medio_mq, listing))
104
- pagination = soup.find('div', class_='in-pagination__list')
105
- if pagination:
106
- next_page = pagination.find('a', class_='in-pagination__item', string=lambda text: text and text.strip().isdigit())
107
- if not next_page:
108
  break
109
- page += 1
110
- url = base_url + '&pag=' + str(page)
111
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  return json.dumps(results, ensure_ascii=False, indent=2)
113
 
114
  # Restituisce l'elenco dei COMUNI di una Provincia e il PREZZO MEDIO
115
  def get_elenco_comuni(provincia):
116
- print(2)
117
  base_url = f"https://www.immobiliare.it/mercato-immobiliare/lombardia/{provincia}-provincia/"
118
  results = []
119
  print(f'Lettura Comuni e Prezzo Medio al Mq')
@@ -131,11 +144,15 @@ def get_elenco_comuni(provincia):
131
  'comune': comune,
132
  'prezzo': prezzo_vendita
133
  })
 
 
 
 
 
134
  return results
135
 
136
  cerca_premuto = False
137
  comuni_provincia = {}
138
- print('1')
139
 
140
  def scrivi_dataframe(output, riepilogo, comune):
141
  if len(output) > 0:
@@ -326,20 +343,31 @@ with st.sidebar:
326
  if st.session_state.get('comuni_totali') is None:
327
  comuni_provincia_Brescia = get_elenco_comuni('Brescia')
328
  comuni_provincia_Bergamo = get_elenco_comuni('Bergamo')
329
- comuni_provincia = comuni_provincia_Brescia + comuni_provincia_Bergamo
 
 
330
  st.session_state['comuni_totali'] = comuni_provincia
331
  else:
332
  comuni_provincia = st.session_state['comuni_totali']
333
  st.title("Filtri")
334
 
335
- st.tipologia_case = st.selectbox("Tipologia", ("Acquisto Immobile", "Asta Immobiliare"))
336
  elenco = [d['comune'] for d in comuni_provincia]
337
  comune_input = st.multiselect(
338
  "Comuni",
339
  elenco
340
  )
341
- prezzo_minimo = st.sidebar.slider("Prezzo Minimo (k)", min_value=0, max_value=1000, value=200)
342
- prezzo_massimo = st.sidebar.slider("Prezzo Massimo (k)", min_value=0, max_value=1000, value=230)
 
 
 
 
 
 
 
 
 
343
  locali = list(range(1, 21)) # Intervallo da 1 a 10
344
  locali_range = st.sidebar.select_slider(
345
  "Locali",
@@ -347,19 +375,53 @@ with st.sidebar:
347
  value=(locali[2], locali[4]) # Valore iniziale, da 1 a 5 locali
348
  )
349
  st.mostra_grafici = st.toggle("Mostra grafici", value = True)
350
-
351
- st.modello_ai = st.selectbox("Modello A.I.", ("Llama 3.1", "Mixtral 7x8b"))
352
  st.analisi_ai = st.toggle("Analizza i dati tramite l'A.I.", value = True)
353
 
354
  locali_minimo, locali_massimo = locali_range
355
  prezzo_minimo = prezzo_minimo*1000
356
  prezzo_massimo = prezzo_massimo*1000
 
 
 
 
357
  cerca_premuto = st.button("Cerca", use_container_width=True, type='primary')
358
 
359
  if cerca_premuto:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
  if len(comune_input)>0:
361
  comuni_selezionati = comune_input
362
  comuni_selezionati = [comune.upper() for comune in comuni_selezionati]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
  output = []
364
  output_singolo = []
365
  for comune_provincia in comuni_provincia:
@@ -374,6 +436,7 @@ if cerca_premuto:
374
  locali_massimo))
375
  scrivi_dataframe(output_singolo, False, comune_provincia['comune'])
376
  output += output_singolo
 
377
  if len(comuni_selezionati)>1 and st.numero_immobili_validi>1:
378
  st.write(f"### Comuni Selezionati")
379
  scrivi_dataframe(output, True, '')
 
9
  import streamlit as st
10
  import os
11
  from groq import Groq
12
+ import time
13
 
14
  def clean_text(text):
15
  return re.sub(r'\s+', ' ', text).strip()
 
81
  info['Vantaggioso'] = False
82
  return info
83
 
84
+ def normalize_title(title):
85
+ return title.lower().replace(',', '').replace('.', '').replace(' ', ' ').replace(' n ', ' ').replace('V. ', 'via ').strip()
86
+
87
  # Legge gli ANNUNCI (pagina x pagina) sulla base del COMUNE di appartenenza
88
  def scrape_immobiliare(provincia, comune, prezzo_medio_mq, prezzo_minimo, prezzo_massimo, locali_minimo, locali_massimo):
89
  print(provincia + " " + comune + " " + prezzo_medio_mq)
90
+ comune_url = comune.replace(" ", "-").replace("è", "e").replace("é", "e").replace("ò", "o").replace("à", "a").replace("ù", "u").replace("ì", "i")
91
  if st.tipologia_case == "Asta Immobiliare":
92
  tipologia_url = "aste-immobiliari"
93
  else:
 
98
  url = base_url
99
  while True:
100
  print(f'Elaborazione pagina {page}')
101
+ try:
102
+ response = requests.get(url, allow_redirects=True, timeout=10)
103
+ soup = BeautifulSoup(response.content, 'html.parser')
104
+ listings = soup.find_all('li', class_='nd-list__item in-searchLayoutListItem')
105
+ if not listings:
 
 
 
 
 
 
106
  break
107
+ for listing in listings:
108
+ results.append(extract_info(provincia, comune, prezzo_medio_mq, listing))
109
+ pagination = soup.find('div', class_='in-pagination__list')
110
+ if pagination:
111
+ next_page = pagination.find('a', class_='in-pagination__item', string=lambda text: text and text.strip().isdigit())
112
+ if not next_page:
113
+ break
114
+ page += 1
115
+ url = base_url + '&pag=' + str(page)
116
+ except requests.exceptions.TooManyRedirects as e:
117
+ print(f"Errore: {e}")
118
+ break
119
+ if st.tipologia_case == "Acquisto Immobile":
120
+ results = [obj for obj in results if 'asta' not in obj['Titolo'].lower()]
121
+ seen_titles = set()
122
+ results = [
123
+ obj for obj in results
124
+ if normalize_title(obj['Titolo']) not in seen_titles and not seen_titles.add(normalize_title(obj['Titolo']))
125
+ ]
126
  return json.dumps(results, ensure_ascii=False, indent=2)
127
 
128
  # Restituisce l'elenco dei COMUNI di una Provincia e il PREZZO MEDIO
129
  def get_elenco_comuni(provincia):
 
130
  base_url = f"https://www.immobiliare.it/mercato-immobiliare/lombardia/{provincia}-provincia/"
131
  results = []
132
  print(f'Lettura Comuni e Prezzo Medio al Mq')
 
144
  'comune': comune,
145
  'prezzo': prezzo_vendita
146
  })
147
+ results.append({
148
+ 'provincia': provincia,
149
+ 'comune': "Provincia di " + provincia,
150
+ 'prezzo': '0'
151
+ })
152
  return results
153
 
154
  cerca_premuto = False
155
  comuni_provincia = {}
 
156
 
157
  def scrivi_dataframe(output, riepilogo, comune):
158
  if len(output) > 0:
 
343
  if st.session_state.get('comuni_totali') is None:
344
  comuni_provincia_Brescia = get_elenco_comuni('Brescia')
345
  comuni_provincia_Bergamo = get_elenco_comuni('Bergamo')
346
+ comuni_provincia_Milano = get_elenco_comuni('Milano')
347
+ comuni_provincia_Verona = get_elenco_comuni('Verona')
348
+ comuni_provincia = comuni_provincia_Brescia + comuni_provincia_Bergamo + comuni_provincia_Milano + comuni_provincia_Verona
349
  st.session_state['comuni_totali'] = comuni_provincia
350
  else:
351
  comuni_provincia = st.session_state['comuni_totali']
352
  st.title("Filtri")
353
 
354
+ st.tipologia_case = st.selectbox("Tipologia", ("Acquisto Immobile", "Asta Immobiliare"), )
355
  elenco = [d['comune'] for d in comuni_provincia]
356
  comune_input = st.multiselect(
357
  "Comuni",
358
  elenco
359
  )
360
+
361
+ min_value = 0
362
+ max_value = 1000
363
+ prezzo = st.slider(
364
+ "Intervallo Prezzo (k €)",
365
+ min_value=min_value,
366
+ max_value=max_value,
367
+ value=(0, 250),
368
+ )
369
+ prezzo_minimo, prezzo_massimo = prezzo
370
+
371
  locali = list(range(1, 21)) # Intervallo da 1 a 10
372
  locali_range = st.sidebar.select_slider(
373
  "Locali",
 
375
  value=(locali[2], locali[4]) # Valore iniziale, da 1 a 5 locali
376
  )
377
  st.mostra_grafici = st.toggle("Mostra grafici", value = True)
 
 
378
  st.analisi_ai = st.toggle("Analizza i dati tramite l'A.I.", value = True)
379
 
380
  locali_minimo, locali_massimo = locali_range
381
  prezzo_minimo = prezzo_minimo*1000
382
  prezzo_massimo = prezzo_massimo*1000
383
+
384
+ # Carica i file
385
+ uploaded_files = st.file_uploader("Choose files", type=["xlsx", "xls", "csv"], accept_multiple_files=True)
386
+
387
  cerca_premuto = st.button("Cerca", use_container_width=True, type='primary')
388
 
389
  if cerca_premuto:
390
+ dfs = []
391
+ if uploaded_files:
392
+ for file in uploaded_files:
393
+ if file.name.endswith('.csv'):
394
+ df = pd.read_csv(file)
395
+ elif file.name.endswith('.xlsx') or file.name.endswith('.xls'):
396
+ df = pd.read_excel(file)
397
+ else:
398
+ st.error(f"Formato di file non supportato: {file.name}")
399
+ continue
400
+ dfs.append(df)
401
+ if dfs:
402
+ concatenated_df = pd.concat(dfs, ignore_index=True)
403
+ st.write(concatenated_df)
404
+
405
  if len(comune_input)>0:
406
  comuni_selezionati = comune_input
407
  comuni_selezionati = [comune.upper() for comune in comuni_selezionati]
408
+ if "PROVINCIA DI BRESCIA" in comuni_selezionati:
409
+ comuni_selezionati.remove("PROVINCIA DI BRESCIA")
410
+ comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'BRESCIA'])
411
+ comuni_selezionati.remove("PROVINCIA DI BRESCIA")
412
+ if "PROVINCIA DI MILANO" in comuni_selezionati:
413
+ comuni_selezionati.remove("PROVINCIA DI MILANO")
414
+ comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'MILANO'])
415
+ comuni_selezionati.remove("PROVINCIA DI MILANO")
416
+ if "PROVINCIA DI VERONA" in comuni_selezionati:
417
+ comuni_selezionati.remove("PROVINCIA DI VERONA")
418
+ comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'VERONA'])
419
+ comuni_selezionati.remove("PROVINCIA DI VERONA")
420
+ if "PROVINCIA DI BERGAMO" in comuni_selezionati:
421
+ comuni_selezionati.remove("PROVINCIA DI BERGAMO")
422
+ comuni_selezionati.extend([d['comune'].upper() for d in comuni_provincia if d['provincia'].upper() == 'BERGAMO'])
423
+ comuni_selezionati.remove("PROVINCIA DI BERGAMO")
424
+
425
  output = []
426
  output_singolo = []
427
  for comune_provincia in comuni_provincia:
 
436
  locali_massimo))
437
  scrivi_dataframe(output_singolo, False, comune_provincia['comune'])
438
  output += output_singolo
439
+ time.sleep(0.10)
440
  if len(comuni_selezionati)>1 and st.numero_immobili_validi>1:
441
  st.write(f"### Comuni Selezionati")
442
  scrivi_dataframe(output, True, '')