Göm meny
Gäller för: VT20

Lektion 3

På lektionen går vi igenom hur man läser in data i JSON-format från en URL med modulen requests till ett dictionary, samt hur man kan bearbeta detta dictionary.

Bra att läsa innan/under lektionen

Innan du börjar

Oavsett om använder LiUs Linux-miljö eller om du jobbar på egen dator kommer du behöva installera paketet requests. Det enklaste sättet är att köra nedanstående i en terminal/kommandofönster.

$ python3 -m pip install requests

Detta kommer installera paketet requests så att det är tillgängligt för Python 3.

OBS: Notera att om du kör detta i LiUs Linux-miljö så kommer requests installeras i din hemkatalog och inte göras tillgängligt för andra användare. Detta måste alltså göras för båda medlemmar i ett labbpar om ni inte loggar in med samma användarkonto varje gång.

Övning 1: Hämta text-data från en URL (webbsida)

Kort om HTTP-protokollet; request/response

När man besöker webbsidor via t.ex. en webbläsare används kommunikationsprotokollet HTTP. Det som händer är att webbläsaren skickar en förfrågan, ett request, till en server om att få information från en specifik sökväg på den servern. Om servern förstår och följer HTTP-protokollet skickar den då tillbaka ett svar, en response. En response innehåller bl.a. information om förfrågan lyckades eller inte, samt text.

Om en request inte lyckades står felmeddelandet i texten. Om en request lyckades är det innehållet från den efterfrågade sökvägen som står i texten.

Uppgift

Skriv funktionen print_url_content(url) vars argument url är en webbadress. Funktionen ska skriva ut den text-data som finns på den webbadressen.

Använd modulen requests för att lösa uppgiften. Information om hur du använder modulen hittar du på sidan Kort om modulen requests.

Använd din funktion för att skriva ut innehållet i följande URL:er (du kan även klicka på dem och se hur webbläsaren visar innehållet)

Övning 2: Statuskod efter ett HTTP-request

Statuskoder

Information om en förfrågan t.ex. lyckades eller inte skickas som en statuskod i svaret från server. Dessa statuskoder specificeras av HTTP-protokollet och nedan ser du några av dem:

  • 200: “OK”. Förfrågan lyckades.
  • 403: “Forbidden”. Förfrågan var giltig, men tillstånd saknas för åtkomst av innehållet.
  • 404: “Not Found”. Inget innehåll kunde hittas för den angivna sökvägen.

Uppgift

Ändra på funktionen du skrev i Övning 1 så att den bara skriver ut innehållet från en URL om förfrågan lyckades, dvs om statuskoden i svaret är 200. Om statuskoden är något annat än 200, skriv ut ett felmeddelande som även informerar om vilken statuskod som svaret innehöll.

Information om hur du jobbar med modulen requests och statuskod för ett response hittar du också på sidan Kort om modulen requests.

Prova att använda funktionen med följande URL:er

Övning 3: Hämta JSON-data från webben och tolka om till ett dictionary

Tolka JSON-data

Ett vanligt textbaserat dataformat som används av webb-API:er är JSON. Modulen requests har inbyggd funktionalitet för att tolka och översätta data i JSON-format till ett dictionary. Du kan läsa om JSON-formatet på sidan JSON (JavaScript Object Notation).

Uppgift

Skriv funktionen get_json_as_dict(url) som hämtar JSON-data från webbadressen i variabeln url. Om förfrågan lyckades, returnera ett dictionary med innehållet i JSON-datat. Om förfrågan inte lyckas (alla andra statuskoder än 200), skriv ut ett felmeddelande och returnera None.

Information om hur du jobbar med modulen requests för att tolka och översätta JSON-data till ett dictionary hittar du också på sidan Kort om modulen requests.

Testa din funktion och skriv ut det den returnerar från följande URL:er med JSON-data som du kan prova:

Övning 4: Från namn på en pokemon till URL

PokeAPI

PokeAPI (https://pokeapi.co) tillhandahåller ett öppet webb-API som man kan använda för att få information om Pokémon. Vi kommer använda det webb-API:et i del 2 av laboration 3 för att skapa ett skript som skriver ut information om pokémons.

I kursen kommer vi använda en lokalt speglad version av PokeAPI som finns under: https://www.ida.liu.se/~TDDE44/pokeapi/api/v2/. Så om den officiella URL:en för information om Pikachu är https://pokeapi.co/api/v2/pokemon/25 så är den du ska använda i kursen istället https://www.ida.liu.se/~TDDE44/pokeapi/api/v2/pokemon/25.

En förteckning (i JSON-format) över alla pokémons finns på URL:en

https://www.ida.liu.se/~TDDE44/pokeapi/api/v2/pokemon/

Uppgift

Skriv funktionen get_pokemon_url(pokemon_name) som får in namnet på en pokemon som sträng i argumenet pokemon_name. Funktionen ska returnera en sträng som innehåller URL:en som ska användas för få information om pokémon med det namnet. Använd informationen från ovan nämnda lista med pokémon-namn i din funktion.

Läs mer om PokeAPI på sidan Kort om PokeAPI.

OBS! Via det officiella PokeAPI:et kan man även skriva in namnet på en pokemon direkt i URL:en. Stöd för detta finns dock inte i den speglade versionen som vi använder oss av i kursen. Dvs.

Med det officiella API:et kan man både skriva https://pokeapi.co/api/v2/pokemon/bulbasaur och https://pokeapi.co/api/v2/pokemon/1 för att få fram information om “bulbasaur”, men med för den speglade versionen vi har på IDA fungerar endast https://www.ida.liu.se/~TDDE44/pokeapi/api/v2/pokemon/1/

https://www.ida.liu.se/~TDDE44/pokeapi/api/v2/pokemon/bulbasaur/ fungerar alltså inte.

Skillnad mellan textdata och kod i textfil

Det kan vara svårt att i början förstå skillnaden mellan strängen "{ 'hej' : 300 }" sparad i en textfil som vi döper till data.json och att skriva

{ 'hej' : 300 }

i en textfil som vi döper till kod.py, som vi sedan kör med

$ python3 kod.py

Skillnaden är att när Pythontolken tolkar läser och tolkar kod.py, ser den { 'hej' : 300 } som instruktioner som ska utföras. Instruktionerna säger

  1. skapa strängen 'hej'
  2. skapa heltalet 300
  3. skapa ett nytt dictionary
  4. använd 'hej' som nyckel i dictionaryt och associera den nyckeln med 300

Dictionaryt är alltså egentligen inte koden, utan dictionaryt är det som finns i datorns minne. När vi skriver ut ett dictionary ser vi alltså inte heller det faktiska dictionaryt, utan en text-representation av data med datatypen dict.

För att göra det lättare för oss människor, har man när man designat programmeringsspråket Python gjort att instruktionerna för att skapa ett dictionary har samma syntax som det sätt som datat representeras som text.


Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2024-02-05