1. Lavorare con API meteorologico
Ora che abbiamo padroneggiato le basi, vediamo uno scenario realistico. Immagina che dobbiamo raccogliere dati sul meteo ogni 30 minuti. Per farlo, utilizzeremo un'API per ottenere i dati meteorologici. Ovviamente, a scopi didattici, l'uso di un'API reale potrebbe essere limitato, quindi immagineremo come potrebbe sembrare.
Ottenere il meteo attuale tramite OpenWeather API
Questo esempio mostra come utilizzare requests
per ottenere dati meteorologici di una città specifica, utilizzando l'API OpenWeather.
import schedule
import time
import requests
def fetch_weather(city):
api_key = "YOUR_API_KEY" # Sostituisci con la tua API key di OpenWeather
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
temperature = data["main"]["temp"]
weather_description = data["weather"][0]["description"]
print(f"Temperatura attuale a {city}: {temperature}°C")
print(f"Descrizione meteo: {weather_description}")
except requests.exceptions.RequestException as e:
print(f"Errore durante l'ottenimento dei dati meteorologici: {e}")
def fetch_weather_of_london():
fetch_weather("London")
# Imposta l'esecuzione dell'attività ogni 30 minuti
schedule.every(30).minutes.do(fetch_weather_of_london)
while True:
schedule.run_pending()
time.sleep(1)
Qui inviamo una richiesta GET all'API OpenWeather per ottenere il meteo attuale per una città specifica. Dalla risposta JSON estraiamo la temperatura e la descrizione del meteo, che stampiamo sullo schermo. Non dimenticare di sostituire YOUR_API_KEY
con la tua chiave API.
Ottenere il tasso di cambio attuale tramite API
In questo esempio utilizzeremo requests
per ottenere il tasso di cambio attuale tramite un'API.
import schedule
import time
import requests
def fetch_exchange_rate():
url = "https://api.exchangerate-api.com/v4/latest/USD"
try:
response = requests.get(url)
response.raise_for_status() # Controlla se la richiesta ha avuto successo
data = response.json()
usd_to_eur = data["rates"]["EUR"]
print(f"Tasso di cambio USD verso EUR: {usd_to_eur}")
except requests.exceptions.RequestException as e:
print(f"Si è verificato un errore durante l'ottenimento dei dati: {e}")
# Imposta l'esecuzione dell'attività ogni 10 minuti
schedule.every(10).minutes.do(fetch_exchange_rate)
while True:
schedule.run_pending()
time.sleep(1)
Qui inviamo una richiesta GET all'API del tasso di cambio e otteniamo i dati in formato JSON. Il tasso di cambio USD verso EUR viene estratto dalla risposta JSON e stampato sullo schermo. Questo script può essere adattato per raccogliere dati su altre coppie di valute modificando la chiave in data["rates"]
.
Con questo script possiamo raccogliere continuamente dati sul meteo e sul tasso di cambio. Non male come inizio, vero?
Scenari pratici
L'automazione della raccolta dati può essere utile in diversi scenari:
- Monitoraggio dello stato dei server: Controlli automatici dello stato del server possono individuare e avvisare su problemi prima che si verifichino.
- Raccolta di dati dai social media: Analisi costante dei trend e delle menzioni del brand.
- Monitoraggio dei tassi di cambio: Le variazioni dei tassi di cambio possono essere utili per affari o esigenze personali.
2. Esempio di raccolta automatizzata di dati web
E se volessimo raccogliere dati da una pagina web? Per esempio, controllare regolarmente la presenza di news. In questo caso ci vengono in aiuto BeautifulSoup
e requests
.
Raccolta di dati da una pagina web
Supponiamo di avere un sito da cui vogliamo raccogliere i titoli delle news. Ecco come possiamo farlo:
import requests
from bs4 import BeautifulSoup
def fetch_news():
response = requests.get("http://example.com/news")
soup = BeautifulSoup(response.content, 'html.parser')
for headline in soup.find_all('h2', class_='news'):
print(headline.text)
schedule.every().hour.do(fetch_news)
while True:
schedule.run_pending()
time.sleep(1)
In questo esempio possiamo vedere che ogni 60 minuti il nostro script controllerà la pagina web e stamperà i titoli delle news. Questo semplifica il processo di ottenere informazioni aggiornate.
Raccolta dei titoli dalle news di un sito
In questo esempio utilizzeremo requests
per caricare la pagina HTML e BeautifulSoup
per analizzare i titoli delle news.
import requests
from bs4 import BeautifulSoup
def fetch_news_headlines():
url = "https://www.bbc.com/news"
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
headlines = soup.find_all('h3') # Cerca tutti i tag <h3> (dove di solito si trovano i titoli)
print("Ultimi titoli delle news su BBC:")
for headline in headlines[:5]: # Prendi i primi 5 titoli
print("-", headline.get_text(strip=True))
except requests.exceptions.RequestException as e:
print(f"Errore durante l'ottenimento dei dati: {e}")
fetch_news_headlines()
Qui scarichiamo la pagina di BBC News e utilizziamo BeautifulSoup
per cercare tutti i tag <h3>
, dove si trovano i titoli delle news. Stampiamo i primi 5 titoli, rimuovendo spazi vuoti e simboli in eccesso con strip=True
.
Raccolta dei prezzi dei prodotti da un negozio online
Questo esempio mostra come estrarre i dati sui prezzi dei prodotti da un sito di e-commerce (ad esempio, Amazon o un altro negozio). Utilizziamo requests
per richiedere la pagina e BeautifulSoup
per analizzare i prezzi.
import requests
from bs4 import BeautifulSoup
def fetch_product_price(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, come Gecko) Chrome/89.0.4389.82 Safari/537.36"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
product_name = soup.find('span', {'id': 'productTitle'}).get_text(strip=True)
price = soup.find('span', {'class': 'a-price-whole'}).get_text(strip=True)
print(f"Prodotto: {product_name}")
print(f"Prezzo: {price} €")
except requests.exceptions.RequestException as e:
print(f"Errore durante l'ottenimento dei dati: {e}")
except AttributeError:
print("Impossibile trovare informazioni sul prodotto o sul prezzo")
# Esempio di link a un prodotto
fetch_product_price("https://www.amazon.com/dp/B08N5WRWNW")
In questo esempio inviamo una richiesta GET con l'intestazione User-Agent
, per evitare blocchi. Poi, utilizzando BeautifulSoup
, cerchiamo il nome del prodotto utilizzando id="productTitle"
e il prezzo del prodotto utilizzando la classe a-price-whole
. Utilizziamo strip=True
per rimuovere gli spazi vuoti.
GO TO FULL VERSION