Část těchto materiálů pochází z jiného kurzu PyLadies.
Začneme seznámením s knihovnou requests. Je to knihovna určená pro HTTP požadavky na straně klienta. Poskytuje mnohem pohodlnější rozhraní než standardní knihovna Pythonu.
Prvním krokem by měla být instalace ve virtuálním prostředí:
(venv) $ python -m pip install requests
První pokus je ideální provádět v interaktivní konzoli Pythonu. Začneme tím, že
si naimportujeme modul requests
. Komunikace přes protokol HTTP používá model
požadavek/odpověď (request/response). Klient tedy nejprve pošle požadavek,
a server potom odpovídá. Takto se střídají, dokud klient nemá vše, co
potřebuje, nebo nedojde k chybě.
Pro začátek se podíváme na stránku https://example.com
.
>>> import requests
>>> response = requests.get("https://example.com/")
>>> response
<Response [200]>
Takto vypsaná odpověď není příliš užitečná. To naštěstí není zase takový
problém. V proměnné response
teď máme object, který má potřebná data uložená
v různých atributech.
Zkuste si vypsat, co obsahují atributy response.text
, response.status_code
.
Taky vyzkoušejte zavolat metodu response.json()
. Existuje jich mnohem více,
ale tyto jsou docela zajímavé a
relativně často užívané.
Pojďme se tedy podívat, co dělají zmíněné jednotlivé atributy:
Atribut text
obsahuje tělo odpovědi, tak jak nám ze serveru přišla. Pro
většinu stránek to bude kód v jazyku HTML, nebo v data v různých formátech.
Každá odpověď od serveru obsahuje číselný kód, který popisuje výsledek akce.
Tento kód si můžete přečíst z atributu status_code
. 1xx
jsou informační
zprávy, na které moc často nenarazíte. 2xx
jsou úspěšné odpovědi. Někdy se
může stát, že server místo odpovědi, kterou chcete, odešle přesměrování. To
má podobu odpovědi s kódem 3xx
. Přímo tuto odpověď neuvidíte, protože
knihovna requests
ví, že je to přesměrování a proto automaticky půjde na
adresu, kam vás server poslal.
Ke každému číselnému kódu existuje i texotvý popis. Ty najdete třeba na Wikipedii, nebo můžete použít https://http.cat.
https://httpbin.org/ je velice užitečná služba, pokud si potřebujete vyzkoušet komunikaci přes HTTP. Bude vám odpovídat na všemožné požadavky podle toho, jak si řeknete. Podívejte se v prohlížeči a uvidíte docela pěkný seznam všech možností (akorát v angličtině)
Nakonec nám zůstává metoda json()
. JSON je datový formát, který používá mnoho
různých webových služeb. Proto requests
nabízí tuto zkratku, jak se k datům
dostat. Ale pozor! Pokud v odpovědit nejsou data v tomto formátu, dostanete
chybu!
Začneme zvolna - zkusíme si stáhnout aktuální kurzy měn, které poskyuje Česká národní banka na adrese:
Výstup pro lidi:
https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/
Výstup pro vývojáře:
Vyzkoušíme si napsat program, který nám dokáže zjistit předpověď počasí v námi vybraném městě.
Co k tomu budeme potřebovat? Znalosti o proudění vzduchu, historická data, srážky... tak ty to nejsou. Ta už pro nás naštěstí připravili jiní lidé a tyto informace volně poskytují na internetu. Zbývá tedy se jich akorát správně doptat.
Existuje mnoho služeb pro vývojáře, které poskytují data o počasí ve strojově čitelné formě. Jedním z nich je například OpenWeatherMap
Data jsou přístupná pro kohokoli volně, jen je třeba poskytovateli dát vědět, že je používáte zrovna vy. Častým způsobem této indentifikace je pomocí tzv. tokenu, což není nic jiného, než náhodně vygenerovaný řetězec znaků, který nahrazuje zadávání uživatelského jména a hesla. Každý uživatel má token jiný.
Zařiď si tedy účet na https://home.openweathermap.org
Na webu si udělej registraci (Sign Up) - stačí zatrhnout potvrzení, že jste starší 16 let a že souhlasíte s podmínkami použití této služby.
Po odeslání pak na stránce API keys najdeš v kolonce Key řetězec podobný tomuto (může to trvat několik minut, než ti pak reálně povolí přístup k datům):
1faf9fd2f2d64a383e7c0011fa127956
Tento řetězec použijeme pro všechny tvé požadavky na získání dat. Kvůli limitům používání této služby si ale nechej vygenerovat vlastní token. Uvedený výše je už neplatný.
V dokumentaci k API se podíváme, jak má požadavek vypadat a jaké parametry můžeme předat.
import requests
token = '1faf9fd2f2d64a383e7c0011fa127956'
url = 'http://api.openweathermap.org/data/2.5/forecast'
parametry = {
'APIKEY': token,
'q': 'brno',
'units': 'metric'
}
odpoved = requests.get(url, params=parametry)
Server poskytuje data ve formátu JSON, který je velmi rozšířený a knihovna requests
pro něj má metodu, která odpověď převede na slovník.
predpoved = odpoved.json()
V dokumentaci se dočteme s jakou strukturou máme tu čest. Nejsnazší je však si ji rovnou vypsat. Vypadá přibližně takto:
{'cod': '200',
'message': 0.0094,
'cnt': 40,
'list': [{'dt': 1557122400,
'main': {'temp': 4.95,
'temp_min': 4.05,
'temp_max': 4.95,
'pressure': 1015.8,
'sea_level': 1015.8,
'grnd_level': 958.41,
'humidity': 74,
'temp_kf': 0.9},
'weather': [{'id': 600,
'main': 'Snow',
'description': 'light snow',
'icon': '13d'}],
'clouds': {'all': 90},
'wind': {'speed': 5.63, 'deg': 341.687},
'snow': {'3h': 0.125},
'sys': {'pod': 'd'},
'dt_txt': '2019-05-06 06:00:00'},
{'dt': 1557133200,
'main': {'temp': 8.92,
'temp_min': 8.25,
'temp_max': 8.92,
'pressure': 1015.93,
'sea_level': 1015.93,
'grnd_level': 959,
'humidity': 57,
'temp_kf': 0.67},
'weather': [{'id': 804,
'main': 'Clouds',
'description': 'overcast clouds',
'icon': '04d'}],
'clouds': {'all': 94},
'wind': {'speed': 5.99, 'deg': 344.69},
'sys': {'pod': 'd'},
'dt_txt': '2019-05-06 09:00:00'},
...
Nás budou nejvíce zajímat klíče temp
(údaj o teplotě) a dt_txt
(tzv. časové
razítko).
Vypíšeme si je jednoduše pod sebe.
for vzorek in predpoved['list']:
datum = vzorek["dt_txt"]
teplota = vzorek['main']['temp']
print(f'{datum} {teplota}')
Takto dostaneme:
2019-05-06 06:00:00 6.24
2019-05-06 09:00:00 9.69
2019-05-06 12:00:00 9.96
2019-05-06 15:00:00 9.64
2019-05-06 18:00:00 6.2
2019-05-06 21:00:00 3
2019-05-07 00:00:00 0.62
...
V řadě číslech se ale moc dobře neorientuje. Proto si z nich uděláme jednoduchý
textový graf. Zkus si výstup upravit tak, aby se za každý stupeň vypsala jedna
tečka (3 stupně ...
, 10 stupňů ..........
).
Pro zjednodušení se teďka nebudeme trápit s mrazy (zápornou teplotou) - nad tím se můžeš zamyslet potom doma.
Výsledek bude vypadat nějak takto:
2019-05-05 15:00:00 ....... 7.44
2019-05-05 18:00:00 ..... 5.26
2019-05-05 21:00:00 .... 4.41
2019-05-06 00:00:00 ... 3.68
2019-05-06 03:00:00 .. 2.55
2019-05-06 06:00:00 .... 4.85
2019-05-06 09:00:00 ........ 8.65
2019-05-06 12:00:00 ......... 9.15
2019-05-06 15:00:00 ......... 9.88
2019-05-06 18:00:00 ..... 5.92
2019-05-06 21:00:00 .. 2.11
2019-05-07 00:00:00 0.39
2019-05-07 03:00:00 -0.33
2019-05-07 06:00:00 ..... 5.25
2019-05-07 09:00:00 ......... 9.21
...
Zatím je naše předpověď složena stále jen z běžných ASCII znaků. Pojďme si tam přidat i obrázky oblohy.
Součástí předpovědi je tento údaj ve formě textu, např. Clear
, Rain
, Snow
,
Clouds
. My se s tím ale nespokojíme a nahradíme si ho obrázky. Můžeme využít
například ty z Unicode tabulky http://xahlee.info/comp/unicode_weather_symbols.html
Písma v příkazové řádce ve Windows stále emoji umí jen ve velmi omezené míře.
Změň si ho dočasně na MS Gothic
, pokud ho máš nainstalované.
Můžeš použít třeba tyto vyzkoušené znaky z UNICODE tabulky:
SNOWFLAKE
CLOUD
UMBRELLA WITH RAIN DROPS
FLOWER
WHITE SMILING FACE
BLACK SMILING FACE
Chceme tedy řetězec Snow
přeložit na ❄
a napíšeme si na to funkci.
def ziskej_obrazek(pocasi):
mapovani = {
'Snow': '\N{SNOWFLAKE}',
'Rain': '\N{UMBRELLA WITH RAIN DROPS}',
'Clouds': '\N{WHITE SUN WITH SMALL CLOUD}',
'Clear': '\N{SUN WITH FACE}'
}
return mapovani.get(pocasi, '?')
Po zakomponování do kódu:
for vzorek in predpoved['list']:
datum = vzorek["dt_txt"]
teplota = vzorek['main']['temp']
sloupek = '.' * int(teplota)
pocasi = ziskej_obrazek(vzorek['weather'][0]['main'])
print(f'{datum} {pocasi} {sloupek} {teplota} \N{DEGREE CELSIUS}')
Finální podoba předpovědi:
2019-05-06 09:00:00 🌤 ........ 8.76 ℃
2019-05-06 12:00:00 ☔ ......... 9.37 ℃
2019-05-06 15:00:00 ☔ ......... 9.4 ℃
2019-05-06 18:00:00 ☔ ...... 6.3 ℃
2019-05-06 21:00:00 🌤 ... 3 ℃
2019-05-07 00:00:00 🌤 0.62 ℃
2019-05-07 03:00:00 🌞 -0.54 ℃
2019-05-07 06:00:00 🌞 ..... 5.25 ℃
2019-05-07 09:00:00 🌞 ......... 9.65 ℃
2019-05-07 12:00:00 ☔ .......... 10.72 ℃
2019-05-07 15:00:00 ☔ .......... 10.12 ℃
2019-05-07 18:00:00 ☔ ....... 7.42 ℃
2019-05-07 21:00:00 ☔ ..... 5.72 ℃
2019-05-08 00:00:00 🌤 ... 3.52 ℃
2019-05-08 03:00:00 🌤 .. 2.25 ℃
2019-05-08 06:00:00 🌤 ...... 6.39 ℃
Služba OpenWeatherMap umí zjistit předpověď počasí nejen pro města, ale libovolné místo na Zemi, zadané pomocí GPS souřadnic. Pro převod názvu (např. hory) na souřadnice se používá tzv. geocoding. Poskytovatelů této služby je opět mnoho. Jedním z nich je například https://locationiq.com/
API můžeme kombinovat dohromady: Název místa → GPS souřadnice→ OpenWeatherMap → teploty.
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-jaro-2019-pondeli:tmp3:1", "title": "Stažení předpovědi počasí (requests)", "html": "\n \n \n\n <h1>Stahování z internetu a API</h1>\n<p>Část těchto materiálů pochází z <a href=\"https://naucse.python.cz/2019/brno-jaro-knihovny/beginners/kurzovni-listek/\">jiného kurzu PyLadies</a>.</p>\n<h2>Requests</h2>\n<p>Začneme seznámením s knihovnou <a href=\"http://docs.python-requests.org/en/master/\">requests</a>. Je to knihovna určená pro HTTP\npožadavky na straně klienta. Poskytuje mnohem pohodlnější rozhraní než\nstandardní knihovna Pythonu.</p>\n<p>Prvním krokem by měla být instalace ve virtuálním prostředí:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">(venv) $ </span>python -m pip install requests\n</pre></div><p>První pokus je ideální provádět v interaktivní konzoli Pythonu. Začneme tím, že\nsi naimportujeme modul <code>requests</code>. Komunikace přes protokol HTTP používá model\npožadavek/odpověď (<em>request</em>/<em>response</em>). Klient tedy nejprve pošle požadavek,\na server potom odpovídá. Takto se střídají, dokud klient nemá vše, co\npotřebuje, nebo nedojde k chybě.</p>\n<p>Pro začátek se podíváme na stránku <code>https://example.com</code>.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"gp\">>>> </span><span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">"https://example.com/"</span><span class=\"p\">)</span>\n<span class=\"gp\">>>> </span><span class=\"n\">response</span>\n<span class=\"go\"><Response [200]></span>\n</pre></div><p>Takto vypsaná odpověď není příliš užitečná. To naštěstí není zase takový\nproblém. V proměnné <code>response</code> teď máme object, který má potřebná data uložená\nv různých atributech.</p>\n<p>Zkuste si vypsat, co obsahují atributy <code>response.text</code>, <code>response.status_code</code>.\nTaky vyzkoušejte zavolat metodu <code>response.json()</code>. Existuje jich mnohem více,\nale tyto jsou docela zajímavé a\nrelativně často užívané.</p>\n<p>Pojďme se tedy podívat, co dělají zmíněné jednotlivé atributy:</p>\n<p>Atribut <code>text</code> obsahuje tělo odpovědi, tak jak nám ze serveru přišla. Pro\nvětšinu stránek to bude kód v jazyku HTML, nebo v data v různých formátech.</p>\n<p>Každá odpověď od serveru obsahuje číselný kód, který popisuje výsledek akce.\nTento kód si můžete přečíst z atributu <code>status_code</code>. <code>1xx</code> jsou informační\nzprávy, na které moc často nenarazíte. <code>2xx</code> jsou úspěšné odpovědi. Někdy se\nmůže stát, že server místo odpovědi, kterou chcete, odešle <em>přesměrování</em>. To\nmá podobu odpovědi s kódem <code>3xx</code>. Přímo tuto odpověď neuvidíte, protože\nknihovna <code>requests</code> ví, že je to přesměrování a proto automaticky půjde na\nadresu, kam vás server poslal.</p>\n<p>Ke každému číselnému kódu existuje i texotvý popis. Ty najdete třeba na\n<a href>Wikipedii</a>, nebo můžete použít <a href=\"https://http.cat\">https://http.cat</a>.</p>\n<div class=\"admonition note\"><p><a href=\"https://httpbin.org/\">https://httpbin.org/</a> je velice užitečná služba, pokud si potřebujete\nvyzkoušet komunikaci přes HTTP. Bude vám odpovídat na všemožné požadavky\npodle toho, jak si řeknete. Podívejte se v prohlížeči a uvidíte docela pěkný\nseznam všech možností (akorát v angličtině)</p>\n</div><p>Nakonec nám zůstává metoda <code>json()</code>. JSON je datový formát, který používá mnoho\nrůzných webových služeb. Proto <code>requests</code> nabízí tuto zkratku, jak se k datům\ndostat. Ale pozor! Pokud v odpovědit nejsou data v tomto formátu, dostanete\nchybu!</p>\n<h2>Kurzy měn</h2>\n<p>Začneme zvolna - zkusíme si stáhnout aktuální kurzy měn, které poskyuje <a href=\"https://www.cnb.cz/\">Česká\nnárodní banka</a> na adrese:</p>\n<p>Výstup pro lidi:</p>\n<p><a href=\"https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/\">https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/</a></p>\n<p>Výstup pro vývojáře:</p>\n<p><a href=\"https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/denni_kurz.txt\">https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/denni_kurz.txt</a></p>\n<h1>Příklad: Jaké bude počasí v Brně?</h1>\n<p>Vyzkoušíme si napsat program, který nám dokáže zjistit předpověď počasí v námi\nvybraném městě.</p>\n<p>Co k tomu budeme potřebovat? Znalosti o proudění vzduchu, historická data,\nsrážky... tak ty to nejsou. Ta už pro nás naštěstí připravili jiní lidé a tyto\ninformace volně poskytují na internetu. Zbývá tedy se jich akorát správně doptat.</p>\n<h2>OpenWeathermap API</h2>\n<p>Existuje mnoho služeb pro vývojáře, které poskytují data o počasí ve strojově\nčitelné formě. Jedním z nich je například <a href=\"https://openweathermap.org/\">OpenWeatherMap</a></p>\n<h3>Přístup ke službě</h3>\n<p>Data jsou přístupná pro kohokoli volně, jen je třeba poskytovateli dát vědět, že\nje používáte zrovna vy. Častým způsobem této indentifikace je pomocí tzv.\n<em>tokenu</em>, což není nic jiného, než náhodně vygenerovaný řetězec znaků, který\nnahrazuje zadávání uživatelského jména a hesla. Každý uživatel má token jiný.</p>\n<p>Zařiď si tedy účet na <a href=\"https://home.openweathermap.org\">https://home.openweathermap.org</a></p>\n<p>Na webu si udělej registraci (Sign Up) - stačí zatrhnout potvrzení, že jste\nstarší 16 let a že souhlasíte s podmínkami použití této služby.</p>\n<p>Po odeslání pak na stránce <em>API keys</em> najdeš v kolonce <em>Key</em> řetězec podobný\ntomuto (může to trvat několik minut, než ti pak reálně povolí přístup k datům):</p>\n<div class=\"highlight\"><pre><code>1faf9fd2f2d64a383e7c0011fa127956</code></pre></div><p>Tento řetězec použijeme pro všechny tvé požadavky na získání dat. Kvůli limitům\npoužívání této služby si ale nechej vygenerovat vlastní token. Uvedený výše je\nuž neplatný.</p>\n<h2>Dotaz na počasí</h2>\n<p>V <a href=\"https://openweathermap.org/forecast5#JSON\">dokumentaci</a> k API se podíváme,\njak má požadavek vypadat a jaké parametry můžeme předat.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n\n<span class=\"n\">token</span> <span class=\"o\">=</span> <span class=\"s1\">'1faf9fd2f2d64a383e7c0011fa127956'</span>\n<span class=\"n\">url</span> <span class=\"o\">=</span> <span class=\"s1\">'http://api.openweathermap.org/data/2.5/forecast'</span>\n\n<span class=\"n\">parametry</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n <span class=\"s1\">'APIKEY'</span><span class=\"p\">:</span> <span class=\"n\">token</span><span class=\"p\">,</span>\n <span class=\"s1\">'q'</span><span class=\"p\">:</span> <span class=\"s1\">'brno'</span><span class=\"p\">,</span>\n <span class=\"s1\">'units'</span><span class=\"p\">:</span> <span class=\"s1\">'metric'</span>\n<span class=\"p\">}</span>\n\n<span class=\"n\">odpoved</span> <span class=\"o\">=</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"n\">parametry</span><span class=\"p\">)</span>\n</pre></div><p>Server poskytuje data ve formátu JSON, který je velmi rozšířený a knihovna <code>requests</code> pro něj má metodu, která odpověď převede na slovník.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">predpoved</span> <span class=\"o\">=</span> <span class=\"n\">odpoved</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">()</span>\n</pre></div><p>V dokumentaci se dočteme s jakou strukturou máme tu čest. Nejsnazší je však si\nji rovnou vypsat. Vypadá přibližně takto:</p>\n<div class=\"highlight\"><pre><code>{'cod': '200',\n 'message': 0.0094,\n 'cnt': 40,\n 'list': [{'dt': 1557122400,\n 'main': {'temp': 4.95,\n 'temp_min': 4.05,\n 'temp_max': 4.95,\n 'pressure': 1015.8,\n 'sea_level': 1015.8,\n 'grnd_level': 958.41,\n 'humidity': 74,\n 'temp_kf': 0.9},\n 'weather': [{'id': 600,\n 'main': 'Snow',\n 'description': 'light snow',\n 'icon': '13d'}],\n 'clouds': {'all': 90},\n 'wind': {'speed': 5.63, 'deg': 341.687},\n 'snow': {'3h': 0.125},\n 'sys': {'pod': 'd'},\n 'dt_txt': '2019-05-06 06:00:00'},\n {'dt': 1557133200,\n 'main': {'temp': 8.92,\n 'temp_min': 8.25,\n 'temp_max': 8.92,\n 'pressure': 1015.93,\n 'sea_level': 1015.93,\n 'grnd_level': 959,\n 'humidity': 57,\n 'temp_kf': 0.67},\n 'weather': [{'id': 804,\n 'main': 'Clouds',\n 'description': 'overcast clouds',\n 'icon': '04d'}],\n 'clouds': {'all': 94},\n 'wind': {'speed': 5.99, 'deg': 344.69},\n 'sys': {'pod': 'd'},\n 'dt_txt': '2019-05-06 09:00:00'},\n ...</code></pre></div><p>Nás budou nejvíce zajímat klíče <code>temp</code> (údaj o teplotě) a <code>dt_txt</code> (tzv. časové\nrazítko).</p>\n<p>Vypíšeme si je jednoduše pod sebe.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">vzorek</span> <span class=\"ow\">in</span> <span class=\"n\">predpoved</span><span class=\"p\">[</span><span class=\"s1\">'list'</span><span class=\"p\">]:</span>\n <span class=\"n\">datum</span> <span class=\"o\">=</span> <span class=\"n\">vzorek</span><span class=\"p\">[</span><span class=\"s2\">"dt_txt"</span><span class=\"p\">]</span>\n <span class=\"n\">teplota</span> <span class=\"o\">=</span> <span class=\"n\">vzorek</span><span class=\"p\">[</span><span class=\"s1\">'main'</span><span class=\"p\">][</span><span class=\"s1\">'temp'</span><span class=\"p\">]</span>\n\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">'{datum} {teplota}'</span><span class=\"p\">)</span>\n</pre></div><p>Takto dostaneme:</p>\n<div class=\"highlight\"><pre><code>2019-05-06 06:00:00 6.24\n2019-05-06 09:00:00 9.69\n2019-05-06 12:00:00 9.96\n2019-05-06 15:00:00 9.64\n2019-05-06 18:00:00 6.2\n2019-05-06 21:00:00 3\n2019-05-07 00:00:00 0.62\n...</code></pre></div><p>V řadě číslech se ale moc dobře neorientuje. Proto si z nich uděláme jednoduchý\ntextový graf. Zkus si výstup upravit tak, aby se za každý stupeň vypsala jedna\ntečka (3 stupně <code>...</code>, 10 stupňů <code>..........</code>).</p>\n<div class=\"admonition note\"><p>Pro zjednodušení se teďka nebudeme trápit s mrazy (zápornou teplotou) - nad\ntím se můžeš zamyslet potom doma.</p>\n</div><div class=\"solution\" id=\"solution-0\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-jaro-2019-pondeli/fast-track/requests-weather/index/solutions/0/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">vzorek</span> <span class=\"ow\">in</span> <span class=\"n\">predpoved</span><span class=\"p\">[</span><span class=\"s1\">'list'</span><span class=\"p\">]:</span>\n <span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n <span class=\"n\">sloupek</span> <span class=\"o\">=</span> <span class=\"s1\">'.'</span> <span class=\"o\">*</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">teplota</span><span class=\"p\">)</span>\n\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">'{datum} {sloupek} {teplota}'</span><span class=\"p\">)</span>\n</pre></div>\n </div>\n</div><p>Výsledek bude vypadat nějak takto:</p>\n<div class=\"highlight\"><pre><code>2019-05-05 15:00:00 ....... 7.44\n2019-05-05 18:00:00 ..... 5.26\n2019-05-05 21:00:00 .... 4.41\n2019-05-06 00:00:00 ... 3.68\n2019-05-06 03:00:00 .. 2.55\n2019-05-06 06:00:00 .... 4.85\n2019-05-06 09:00:00 ........ 8.65\n2019-05-06 12:00:00 ......... 9.15\n2019-05-06 15:00:00 ......... 9.88\n2019-05-06 18:00:00 ..... 5.92\n2019-05-06 21:00:00 .. 2.11\n2019-05-07 00:00:00 0.39\n2019-05-07 03:00:00 -0.33\n2019-05-07 06:00:00 ..... 5.25\n2019-05-07 09:00:00 ......... 9.21\n...</code></pre></div><h2>Přidáváme obrázky</h2>\n<p>Zatím je naše předpověď složena stále jen z běžných ASCII znaků. Pojďme si tam\npřidat i obrázky oblohy.</p>\n<p>Součástí předpovědi je tento údaj ve formě textu, např. <code>Clear</code>, <code>Rain</code>, <code>Snow</code>,\n<code>Clouds</code>. My se s tím ale nespokojíme a nahradíme si ho obrázky. Můžeme využít\nnapříklad ty z Unicode tabulky <a href=\"http://xahlee.info/comp/unicode_weather_symbols.html\">http://xahlee.info/comp/unicode_weather_symbols.html</a></p>\n<div class=\"admonition note\"><p>Písma v příkazové řádce ve Windows stále emoji umí jen ve velmi omezené míře.\nZměň si ho dočasně na <code>MS Gothic</code>, pokud ho máš nainstalované.\nMůžeš použít třeba tyto vyzkoušené znaky z UNICODE tabulky:</p>\n<div class=\"highlight\"><pre><code>SNOWFLAKE\nCLOUD\nUMBRELLA WITH RAIN DROPS\nFLOWER\nWHITE SMILING FACE\nBLACK SMILING FACE</code></pre></div></div><p>Chceme tedy řetězec <code>Snow</code> přeložit na <code>❄</code> a napíšeme si na to funkci.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">ziskej_obrazek</span><span class=\"p\">(</span><span class=\"n\">pocasi</span><span class=\"p\">):</span>\n <span class=\"n\">mapovani</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n <span class=\"s1\">'Snow'</span><span class=\"p\">:</span> <span class=\"s1\">'</span><span class=\"se\">\\N{SNOWFLAKE}</span><span class=\"s1\">'</span><span class=\"p\">,</span>\n <span class=\"s1\">'Rain'</span><span class=\"p\">:</span> <span class=\"s1\">'</span><span class=\"se\">\\N{UMBRELLA WITH RAIN DROPS}</span><span class=\"s1\">'</span><span class=\"p\">,</span>\n <span class=\"s1\">'Clouds'</span><span class=\"p\">:</span> <span class=\"s1\">'</span><span class=\"se\">\\N{WHITE SUN WITH SMALL CLOUD}</span><span class=\"s1\">'</span><span class=\"p\">,</span>\n <span class=\"s1\">'Clear'</span><span class=\"p\">:</span> <span class=\"s1\">'</span><span class=\"se\">\\N{SUN WITH FACE}</span><span class=\"s1\">'</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">return</span> <span class=\"n\">mapovani</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pocasi</span><span class=\"p\">,</span> <span class=\"s1\">'?'</span><span class=\"p\">)</span>\n</pre></div><p>Po zakomponování do kódu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">vzorek</span> <span class=\"ow\">in</span> <span class=\"n\">predpoved</span><span class=\"p\">[</span><span class=\"s1\">'list'</span><span class=\"p\">]:</span>\n <span class=\"n\">datum</span> <span class=\"o\">=</span> <span class=\"n\">vzorek</span><span class=\"p\">[</span><span class=\"s2\">"dt_txt"</span><span class=\"p\">]</span>\n <span class=\"n\">teplota</span> <span class=\"o\">=</span> <span class=\"n\">vzorek</span><span class=\"p\">[</span><span class=\"s1\">'main'</span><span class=\"p\">][</span><span class=\"s1\">'temp'</span><span class=\"p\">]</span>\n <span class=\"n\">sloupek</span> <span class=\"o\">=</span> <span class=\"s1\">'.'</span> <span class=\"o\">*</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">teplota</span><span class=\"p\">)</span>\n <span class=\"n\">pocasi</span> <span class=\"o\">=</span> <span class=\"n\">ziskej_obrazek</span><span class=\"p\">(</span><span class=\"n\">vzorek</span><span class=\"p\">[</span><span class=\"s1\">'weather'</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">][</span><span class=\"s1\">'main'</span><span class=\"p\">])</span>\n\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">'{datum} {pocasi} {sloupek} {teplota} </span><span class=\"se\">\\N{DEGREE CELSIUS}</span><span class=\"s1\">'</span><span class=\"p\">)</span>\n</pre></div><p>Finální podoba předpovědi:</p>\n<div class=\"highlight\"><pre><code>2019-05-06 09:00:00 🌤 ........ 8.76 ℃\n2019-05-06 12:00:00 ☔ ......... 9.37 ℃\n2019-05-06 15:00:00 ☔ ......... 9.4 ℃\n2019-05-06 18:00:00 ☔ ...... 6.3 ℃\n2019-05-06 21:00:00 🌤 ... 3 ℃\n2019-05-07 00:00:00 🌤 0.62 ℃\n2019-05-07 03:00:00 🌞 -0.54 ℃\n2019-05-07 06:00:00 🌞 ..... 5.25 ℃\n2019-05-07 09:00:00 🌞 ......... 9.65 ℃\n2019-05-07 12:00:00 ☔ .......... 10.72 ℃\n2019-05-07 15:00:00 ☔ .......... 10.12 ℃\n2019-05-07 18:00:00 ☔ ....... 7.42 ℃\n2019-05-07 21:00:00 ☔ ..... 5.72 ℃\n2019-05-08 00:00:00 🌤 ... 3.52 ℃\n2019-05-08 03:00:00 🌤 .. 2.25 ℃\n2019-05-08 06:00:00 🌤 ...... 6.39 ℃</code></pre></div><p>Služba OpenWeatherMap umí zjistit předpověď počasí nejen pro města, ale libovolné\nmísto na Zemi, zadané pomocí GPS souřadnic. Pro převod názvu (např. hory) na\nsouřadnice se používá tzv. geocoding. Poskytovatelů této služby je opět mnoho.\nJedním z nich je například <a href=\"https://locationiq.com/\">https://locationiq.com/</a></p>\n<p>API můžeme kombinovat dohromady: Název místa → GPS souřadnice→ OpenWeatherMap →\nteploty.</p>\n\n\n " } } }