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
- https://www.ida.liu.se/~TDDE44/kursmaterial/lektion3/exempel.html
- https://www.ida.liu.se/~TDDE44/kursmaterial/lektion3/exempel.txt
- https://www.ida.liu.se/~TDDE44/kursmaterial/lektion3/exempel.json
- https://www.ida.liu.se/~TDDE44/kursmaterial/lektion3/finnsinte
- https://www.ida.liu.se/~TDDE44/kursmaterial/tenta-tdde44.txt
Ö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
- skapa strängen
'hej'
- skapa heltalet
300
- skapa ett nytt dictionary
- använd
'hej'
som nyckel i dictionaryt och associera den nyckeln med300
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