Upload Weather Script.
Abgreifen von wetterdaten über API
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
OWM_API_KEY=ea645349e2fbb2ff573104bdd6763604
|
||||||
|
DB_USER=root
|
||||||
|
DB_PASSWORD=dein_db_passwort
|
||||||
|
DB_HOST=127.0.0.1
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_NAME=weather_db
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
**1. Voraussetzungen installieren**
|
||||||
|
|
||||||
|
```
|
||||||
|
pip install requests mariadb python-dotenv
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Datenbank Vorbereiten**
|
||||||
|
|
||||||
|
```
|
||||||
|
CREATE DATABASE weather_db;
|
||||||
|
|
||||||
|
USE weather_db;
|
||||||
|
|
||||||
|
CREATE TABLE weather_data (
|
||||||
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
city VARCHAR(100) NOT NULL,
|
||||||
|
country VARCHAR(10),
|
||||||
|
temperature FLOAT,
|
||||||
|
feels_like FLOAT,
|
||||||
|
humidity INT,
|
||||||
|
pressure INT,
|
||||||
|
wind_speed FLOAT,
|
||||||
|
description VARCHAR(255),
|
||||||
|
recorded_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. Script und .env Datei ablegen und bearbeiten**
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
import requests
|
||||||
|
import mariadb
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from datetime import datetime
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
# Umgebungsvariablen aus .env laden
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
# --- Konfiguration ---
|
||||||
|
API_KEY = os.getenv("OWM_API_KEY")
|
||||||
|
CITY = "Berlin"
|
||||||
|
UNITS = "metric" # metric = Celsius, imperial = Fahrenheit
|
||||||
|
|
||||||
|
DB_CONFIG = {
|
||||||
|
"user": os.getenv("DB_USER", "root"),
|
||||||
|
"password": os.getenv("DB_PASSWORD", ""),
|
||||||
|
"host": os.getenv("DB_HOST", "127.0.0.1"),
|
||||||
|
"port": int(os.getenv("DB_PORT", 3306)),
|
||||||
|
"database": os.getenv("DB_NAME", "weather_db"),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_weather(city):
|
||||||
|
"""Ruft Wetterdaten von der OpenWeatherMap-API ab."""
|
||||||
|
url = "https://api.openweathermap.org/data/2.5/weather"
|
||||||
|
params = {
|
||||||
|
"q": city,
|
||||||
|
"appid": API_KEY,
|
||||||
|
"units": UNITS,
|
||||||
|
"lang": "de",
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.get(url, params=params, timeout=10)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"Fehler beim Abrufen der Wetterdaten: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def parse_weather(data):
|
||||||
|
"""Extrahiert die relevanten Felder aus der API-Antwort."""
|
||||||
|
return {
|
||||||
|
"city": data["name"],
|
||||||
|
"country": data["sys"].get("country", ""),
|
||||||
|
"temperature": data["main"]["temp"],
|
||||||
|
"feels_like": data["main"]["feels_like"],
|
||||||
|
"humidity": data["main"]["humidity"],
|
||||||
|
"pressure": data["main"]["pressure"],
|
||||||
|
"wind_speed": data["wind"]["speed"],
|
||||||
|
"description": data["weather"][0]["description"],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def save_to_db(weather):
|
||||||
|
"""Speichert die Wetterdaten in der MariaDB."""
|
||||||
|
try:
|
||||||
|
conn = mariadb.connect(**DB_CONFIG)
|
||||||
|
except mariadb.Error as e:
|
||||||
|
print(f"Fehler bei der DB-Verbindung: {e}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
sql = """
|
||||||
|
INSERT INTO weather_data
|
||||||
|
(city, country, temperature, feels_like, humidity,
|
||||||
|
pressure, wind_speed, description, recorded_at)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
"""
|
||||||
|
values = (
|
||||||
|
weather["city"],
|
||||||
|
weather["country"],
|
||||||
|
weather["temperature"],
|
||||||
|
weather["feels_like"],
|
||||||
|
weather["humidity"],
|
||||||
|
weather["pressure"],
|
||||||
|
weather["wind_speed"],
|
||||||
|
weather["description"],
|
||||||
|
datetime.now(),
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
cursor.execute(sql, values)
|
||||||
|
conn.commit()
|
||||||
|
print(f"Daten gespeichert (ID: {cursor.lastrowid})")
|
||||||
|
except mariadb.Error as e:
|
||||||
|
print(f"Fehler beim Speichern: {e}")
|
||||||
|
conn.rollback()
|
||||||
|
finally:
|
||||||
|
cursor.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if not API_KEY:
|
||||||
|
print("Fehler: OWM_API_KEY nicht gesetzt. Bitte in .env eintragen.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"Rufe Wetterdaten für '{CITY}' ab...")
|
||||||
|
data = fetch_weather(CITY)
|
||||||
|
|
||||||
|
if data:
|
||||||
|
weather = parse_weather(data)
|
||||||
|
print(f"Temperatur: {weather['temperature']}°C, "
|
||||||
|
f"{weather['description']}")
|
||||||
|
save_to_db(weather)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user