Weerlive API: Python-script om weersgegevens op te halen en te verwerken

In dit artikel leer je hoe je een Python-script maakt dat de Weerlive API aanroept om weersinformatie voor een specifieke locatie op te halen. We zullen het script zo ontwerpen dat het JSON-antwoord van de API wordt omgezet in een Python-dictionary. Daarnaast zullen we Poetry gebruiken voor afhankelijkheidsbeheer en -packaging, en unittests schrijven met de unittest-bibliotheek.

Stap 1: Maak een nieuw project met Poetry

Installeer eerst Poetry als je dat nog niet hebt gedaan:

curl -sSL https://install.python-poetry.org | python -

Maak een nieuw project met de volgende opdracht:

poetry new weerlive-api

Navigeer naar de projectmap:

cd weerlive-api

Voeg het requests pakket toe aan het project:

poetry add requests

Stap 2: Schrijf het Python-script

Maak een bestand genaamd config.py en voeg hier je API-key toe:

# config.py
api_key = "jouw_api_key_hier"

Toegang tot de API loopt via een API key, deze kun je hier opvragen.

Maak een nieuw bestand genaamd weerlive_api.py en voeg de volgende code toe:

# weerlive_api.py
import requests
import json
from config import api_key

def get_weer_data(locatie):
    url = f"https://weerlive.nl/api/json-data-10min.php?key={api_key}&locatie={locatie}"
    response = requests.get(url)

    if response.status_code == 200:
        data = json.loads(response.text)
        return data
    else:
        print(f"Fout bij het ophalen van gegevens: {response.status_code}")
        return None

if __name__ == "__main__":
    locatie = "Amsterdam"
    weer_data = get_weer_data(locatie)

    if weer_data:
        print(weer_data)

Laten we de code in detail bekijken:

  • We importeren de benodigde modules: requests om de API aan te roepen, json om JSON-gegevens te verwerken en api_key uit het config.py bestand.

  • De get_weer_data functie neemt één argument, locatie, en roept de Weerlive API aan met de opgegeven API-key en locatie. Het controleert de HTTP-statuscode om te zien of het verzoek succesvol was en converteert het JSON-antwoord naar een Python-dictionary als het verzoek slaagt. Als het verzoek mislukt, wordt er een foutbericht geprint en None geretourneerd.

  • Het if __name__ == "__main__": blok is het startpunt van het script en roept de get_weer_data functie aan met de gewenste locatie (in dit geval "Amsterdam").

Stap 3: Schrijf unittests

Maak een nieuw bestand genaamd test_weerlive_api.py in de tests map en voeg de volgende code toe:

# tests/test_weerlive_api.py
import unittest
from unittest.mock import patch
from weerlive_api import get_weer_data

class TestWeerliveAPI(unittest.TestCase):
    @patch("requests.get")
    def test_get_weer_data_success(self, mock_get):
        # Mock the API response
        mock_response = mock_get.return_value
        mock_response.status_code = 200
        mock_response.text = '{"result": "success"}'

        locatie = "Amsterdam"
        result = get_weer_data(locatie)

        self.assertEqual(result, {"result": "success"})

    @patch("requests.get")
    def test_get_weer_data_failure(self, mock_get):
        # Mock the API response
        mock_response = mock_get.return_value
        mock_response.status_code = 404

        locatie = "OnbekendePlaats"
        result = get_weer_data(locatie)

        self.assertIsNone(result)

if name == "main":
    unittest.main()

In dit bestand hebben we twee unittests gemaakt:

1. test_get_weer_data_success: Deze test controleert of de get_weer_data functie correct een Python-dictionary retourneert als de API-aanroep succesvol is. We gebruiken patch om de requests.get functie te "mocken" en stellen een gesimuleerde API-respons in.

2. test_get_weer_data_failure: Deze test controleert of de get_weer_data functie None retourneert als de API-aanroep mislukt. We "mocken" opnieuw de requests.get functie en stellen een gesimuleerde API-respons in met een 404-statuscode. Voer de unittests uit met het volgende commando:

poetry run python -m unittest

Stap 4: Verpak het project met Poetry

Verpak het project met Poetry Update het pyproject.toml bestand met de juiste metadata voor het project, zoals de naam, auteur en versie. Je kunt ook de afhankelijkheden en eventuele extra bestanden die moeten worden opgenomen in het pakket specificeren. Bijvoorbeeld:

[tool.poetry]
name = "weerlive-api"
version = "0.1.0"
description = "Een eenvoudig Python-script om Weerlive API-data op te halen en te verwerken"
authors = ["Jouw Naam <jouw.email@example.com>"]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.7"
requests = "^2.25"

[tool.poetry.dev-dependencies]
pytest = "^6.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Nu ben je klaar om het project te verpakken en te distribueren met Poetry:

poetry build

Dit zal een .tar.gz en een .whl bestand genereren in de dist map.

Gefeliciteerd! Je hebt nu een Python-script gemaakt om de Weerlive API aan te roepen en de JSON-gegevens te verwerken in een dictionary. Je hebt ook geleerd hoe je Poetry kunt gebruiken voor afhankelijkheidsbeheer en -packaging, en unittests kunt schrijven met de unittest-bibliotheek.

Did you find this article valuable?

Support Theo van der Sluijs by becoming a sponsor. Any amount is appreciated!