Jak už bylo řečeno v lekci o JSON, hlavní výhoda formátu JSON je, že se na Internetu rozšířil nejvíc. Pojďme toho využít!
Spousta webových služeb poskytuje takzvané API (z application programming interface, programátorské rozhraní), přes které je možné s danou službou komunikovat programově. Místo klikání na tlačítka a čtení stránek „očima” dostaneme data ve formátu, kterým rozumí počítače – a v dnešní době to bude většinou formát JSON.
K práci s internetovými stránkami použijeme knihovnu Requests. V aktivovaném virtuálním prostředí si ji nainstaluj příkazem:
(env)$ python -m pip install requests
A potom v Pythonu zkus stáhnout nějakou stránku:
import requests
# stažení stránky
stranka = requests.get('https://cs.wikipedia.org', timeout=5)
# ověření, že dotaz proběhl v pořádku
stranka.raise_for_status()
# vypsání obsahu
print(stranka.text)
Měl by se vypsat obsah stránky https://cs.wikipedia.org – HTML kód, který se objeví když v prohlížeči dáš „Ukázat zdroj” (View Page Source, většinou Ctrl+U) a ze kterého prohlížeč umí vykreslit stránku.
Ale my nechceme obsah pro lidi. Podívejme se, co Wikipedia zpřístupňuje počítačům.
Nyní si načteme stránku, která nám vrátí výsledek v JSON:
import requests
# klíčové slovo, podle kterého budeme vyhledávat
klic = 'Vánoce'
# stažení stránky
stranka = requests.get('https://cs.wikipedia.org/w/api.php?action=query&prop=extracts&explaintext&exintro&format=json&titles={}'.format(klic), timeout=5)
# ověření, že dotaz proběhl v pořádku
stranka.raise_for_status()
# vypsání obsahu
print(stranka.text)
Na náš dotaz Wikipedia vrátí základní informace o zadaném vyhledávacím klíči v JSONU.
Zkus řetězec stranka.text
převést z JSON na slovník
a vypsat trochu srozumitelněji:
import json
# Převedeme do Pythoních struktur
data = json.loads(stranka.text)
# vypíšeme s odsazením
print(json.dumps(data, ensure_ascii=False, indent=2))
{ "data": { "sessionMaterial": { "id": "session-material:2018/pyladies-hradec-podzim:dict:2", "title": "Web API", "html": "\n \n \n\n <h1>Webové API</h1>\n<p>Jak už bylo řečeno v <a href=\"/2018/pyladies-hradec-podzim/intro/json/\">lekci o JSON</a>,\nhlavní výhoda formátu JSON je, že se na Internetu rozšířil nejvíc.\nPojďme toho využít!</p>\n<p>Spousta webových služeb poskytuje takzvané\n<em>API</em> (z <em>application programming interface</em>,\nprogramátorské rozhraní), přes které je možné s danou\nslužbou komunikovat programově.\nMísto klikání na tlačítka a čtení stránek „očima”\ndostaneme data ve formátu, kterým rozumí počítače –\na v dnešní době to bude většinou formát JSON.</p>\n<h2>Requests</h2>\n<p>K práci s internetovými stránkami použijeme knihovnu Requests.\nV aktivovaném virtuálním prostředí si ji nainstaluj příkazem:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">(env)$ </span>python -m pip install requests\n</pre></div><p>A potom v Pythonu zkus stáhnout nějakou stránku:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n\n<span class=\"c1\"># stažení stránky</span>\n<span class=\"n\">stranka</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=\"s1\">'https://cs.wikipedia.org'</span><span class=\"p\">,</span> <span class=\"n\">timeout</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># ověření, že dotaz proběhl v pořádku</span>\n<span class=\"n\">stranka</span><span class=\"o\">.</span><span class=\"n\">raise_for_status</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># vypsání obsahu</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">stranka</span><span class=\"o\">.</span><span class=\"n\">text</span><span class=\"p\">)</span>\n</pre></div><p>Měl by se vypsat obsah stránky\n<a href=\"https://cs.wikipedia.org\">https://cs.wikipedia.org</a> –\nHTML kód, který se objeví když v prohlížeči dáš\n„Ukázat zdroj” (<em>View Page Source</em>, většinou <kbd>Ctrl</kbd>+<kbd>U</kbd>)\na ze kterého prohlížeč umí vykreslit stránku.</p>\n<p>Ale my nechceme obsah pro lidi.\nPodívejme se, co Wikipedia zpřístupňuje počítačům.</p>\n<h2>Data pro strojové zpracování</h2>\n<p>Nyní si načteme stránku, která nám vrátí výsledek v JSON:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n\n<span class=\"c1\"># klíčové slovo, podle kterého budeme vyhledávat</span>\n<span class=\"n\">klic</span> <span class=\"o\">=</span> <span class=\"s1\">'Vánoce'</span>\n\n<span class=\"c1\"># stažení stránky</span>\n<span class=\"n\">stranka</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=\"s1\">'https://cs.wikipedia.org/w/api.php?action=query&prop=extracts&explaintext&exintro&format=json&titles={}'</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">klic</span><span class=\"p\">),</span> <span class=\"n\">timeout</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># ověření, že dotaz proběhl v pořádku</span>\n<span class=\"n\">stranka</span><span class=\"o\">.</span><span class=\"n\">raise_for_status</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># vypsání obsahu</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">stranka</span><span class=\"o\">.</span><span class=\"n\">text</span><span class=\"p\">)</span>\n</pre></div><p>Na náš dotaz Wikipedia vrátí základní informace o zadaném vyhledávacím klíči v JSONU.</p>\n<p>Zkus řetězec <code>stranka.text</code> převést z JSON na slovník\na vypsat trochu srozumitelněji:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">json</span>\n\n<span class=\"c1\"># Převedeme do Pythoních struktur</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">stranka</span><span class=\"o\">.</span><span class=\"n\">text</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># vypíšeme s odsazením </span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">ensure_ascii</span><span class=\"o\">=</span><span class=\"bp\">False</span><span class=\"p\">,</span> <span class=\"n\">indent</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</pre></div>\n\n\n " } } }