{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Разберемся, каким образом забирать данные о курсе валют в реальном времени с [сайта](https://www.cbr-xml-daily.ru/daily_json.js)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#!pip3 install requests " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем модуль и отправим запрос к сервису с курсами валют с помощью метода [GET](https://ru.wikipedia.org/wiki/HTTP#GET):" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests \n", "response = requests.get('https://www.cbr-xml-daily.ru/daily_json.js') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим, что получили в ответ:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "response" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Мы получили объект ответа, который содержит всю нужную нам информацию. По умолчанию на экран выводится HTTP-код ответа 200. Это означает, что запрос был корректным, и сервер отдал нам нужную информацию." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Код ответа в виде числа можно получить с помощью метода `status_code`:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "200" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "response.status_code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Адрес, по которому мы обращались, возвращает результат в `json` формате. Эти данные уже лежат в атрибуте `text` в полученном ответе `response`." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'{\\n \"Date\": \"2020-11-12T11:30:00+03:00\",\\n \"PreviousDate\": \"2020-11-11T11:30:00+03:00\",\\n \"PreviousURL\": \"\\\\/\\\\/www.cbr-xml-daily.ru\\\\/archive\\\\/2020\\\\/11\\\\/11\\\\/daily_json.js\",\\n \"Timestamp\": \"2020-11-11T21:00:00+03:00\",\\n \"Va'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "response.text[:230]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сейчас текст хранится просто в строковой переменной. Далее мы можем превратить эту строку в словарь. Сделать это можно с помощью JSON-парсера либо воспользовавшись методом `json`, который уже встроен в объект ответа `response`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'Date': '2020-11-12T11:30:00+03:00',\n", " 'PreviousDate': '2020-11-11T11:30:00+03:00',\n", " 'PreviousURL': '//www.cbr-xml-daily.ru/archive/2020/11/11/daily_json.js',\n", " 'Timestamp': '2020-11-11T21:00:00+03:00',\n", " 'Valute': {'AUD': {'ID': 'R01010',\n", " 'NumCode': '036',\n", " 'CharCode': 'AUD',\n", " 'Nominal': 1,\n", " 'Name': 'Австралийский доллар',\n", " 'Value': 55.5553,\n", " 'Previous': 55.6634},\n", " 'AZN': {'ID': 'R01020A',\n", " 'NumCode': '944',\n", " 'CharCode': 'AZN',\n", " 'Nominal': 1,\n", " 'Name': 'Азербайджанский манат',\n", " 'Value': 44.8543,\n", " 'Previous': 44.9663},\n", " 'GBP': {'ID': 'R01035',\n", " 'NumCode': '826',\n", " 'CharCode': 'GBP',\n", " 'Nominal': 1,\n", " 'Name': 'Фунт стерлингов Соединенного королевства',\n", " 'Value': 101.1959,\n", " 'Previous': 100.9597},\n", " 'AMD': {'ID': 'R01060',\n", " 'NumCode': '051',\n", " 'CharCode': 'AMD',\n", " 'Nominal': 100,\n", " 'Name': 'Армянских драмов',\n", " 'Value': 15.4226,\n", " 'Previous': 15.4824},\n", " 'BYN': {'ID': 'R01090B',\n", " 'NumCode': '933',\n", " 'CharCode': 'BYN',\n", " 'Nominal': 1,\n", " 'Name': 'Белорусский рубль',\n", " 'Value': 29.8443,\n", " 'Previous': 29.8966},\n", " 'BGN': {'ID': 'R01100',\n", " 'NumCode': '975',\n", " 'CharCode': 'BGN',\n", " 'Nominal': 1,\n", " 'Name': 'Болгарский лев',\n", " 'Value': 45.9469,\n", " 'Previous': 46.2316},\n", " 'BRL': {'ID': 'R01115',\n", " 'NumCode': '986',\n", " 'CharCode': 'BRL',\n", " 'Nominal': 1,\n", " 'Name': 'Бразильский реал',\n", " 'Value': 14.0734,\n", " 'Previous': 14.1843},\n", " 'HUF': {'ID': 'R01135',\n", " 'NumCode': '348',\n", " 'CharCode': 'HUF',\n", " 'Nominal': 100,\n", " 'Name': 'Венгерских форинтов',\n", " 'Value': 25.2623,\n", " 'Previous': 25.23},\n", " 'HKD': {'ID': 'R01200',\n", " 'NumCode': '344',\n", " 'CharCode': 'HKD',\n", " 'Nominal': 10,\n", " 'Name': 'Гонконгских долларов',\n", " 'Value': 98.2879,\n", " 'Previous': 98.5358},\n", " 'DKK': {'ID': 'R01215',\n", " 'NumCode': '208',\n", " 'CharCode': 'DKK',\n", " 'Nominal': 1,\n", " 'Name': 'Датская крона',\n", " 'Value': 12.0698,\n", " 'Previous': 12.1411},\n", " 'USD': {'ID': 'R01235',\n", " 'NumCode': '840',\n", " 'CharCode': 'USD',\n", " 'Nominal': 1,\n", " 'Name': 'Доллар США',\n", " 'Value': 76.2075,\n", " 'Previous': 76.3978},\n", " 'EUR': {'ID': 'R01239',\n", " 'NumCode': '978',\n", " 'CharCode': 'EUR',\n", " 'Nominal': 1,\n", " 'Name': 'Евро',\n", " 'Value': 90.0468,\n", " 'Previous': 90.3557},\n", " 'INR': {'ID': 'R01270',\n", " 'NumCode': '356',\n", " 'CharCode': 'INR',\n", " 'Nominal': 10,\n", " 'Name': 'Индийских рупий',\n", " 'Value': 10.2533,\n", " 'Previous': 10.3014},\n", " 'KZT': {'ID': 'R01335',\n", " 'NumCode': '398',\n", " 'CharCode': 'KZT',\n", " 'Nominal': 100,\n", " 'Name': 'Казахстанских тенге',\n", " 'Value': 17.8351,\n", " 'Previous': 17.8067},\n", " 'CAD': {'ID': 'R01350',\n", " 'NumCode': '124',\n", " 'CharCode': 'CAD',\n", " 'Nominal': 1,\n", " 'Name': 'Канадский доллар',\n", " 'Value': 58.3966,\n", " 'Previous': 58.7179},\n", " 'KGS': {'ID': 'R01370',\n", " 'NumCode': '417',\n", " 'CharCode': 'KGS',\n", " 'Nominal': 100,\n", " 'Name': 'Киргизских сомов',\n", " 'Value': 90.8924,\n", " 'Previous': 91.1196},\n", " 'CNY': {'ID': 'R01375',\n", " 'NumCode': '156',\n", " 'CharCode': 'CNY',\n", " 'Nominal': 1,\n", " 'Name': 'Китайский юань',\n", " 'Value': 11.5124,\n", " 'Previous': 11.5689},\n", " 'MDL': {'ID': 'R01500',\n", " 'NumCode': '498',\n", " 'CharCode': 'MDL',\n", " 'Nominal': 10,\n", " 'Name': 'Молдавских леев',\n", " 'Value': 44.5788,\n", " 'Previous': 44.6771},\n", " 'NOK': {'ID': 'R01535',\n", " 'NumCode': '578',\n", " 'CharCode': 'NOK',\n", " 'Nominal': 10,\n", " 'Name': 'Норвежских крон',\n", " 'Value': 84.4685,\n", " 'Previous': 84.8544},\n", " 'PLN': {'ID': 'R01565',\n", " 'NumCode': '985',\n", " 'CharCode': 'PLN',\n", " 'Nominal': 1,\n", " 'Name': 'Польский злотый',\n", " 'Value': 19.9689,\n", " 'Previous': 20.1758},\n", " 'RON': {'ID': 'R01585F',\n", " 'NumCode': '946',\n", " 'CharCode': 'RON',\n", " 'Nominal': 1,\n", " 'Name': 'Румынский лей',\n", " 'Value': 18.4607,\n", " 'Previous': 18.5828},\n", " 'XDR': {'ID': 'R01589',\n", " 'NumCode': '960',\n", " 'CharCode': 'XDR',\n", " 'Nominal': 1,\n", " 'Name': 'СДР (специальные права заимствования)',\n", " 'Value': 108.2162,\n", " 'Previous': 108.8592},\n", " 'SGD': {'ID': 'R01625',\n", " 'NumCode': '702',\n", " 'CharCode': 'SGD',\n", " 'Nominal': 1,\n", " 'Name': 'Сингапурский доллар',\n", " 'Value': 56.5002,\n", " 'Previous': 56.7507},\n", " 'TJS': {'ID': 'R01670',\n", " 'NumCode': '972',\n", " 'CharCode': 'TJS',\n", " 'Nominal': 10,\n", " 'Name': 'Таджикских сомони',\n", " 'Value': 67.2914,\n", " 'Previous': 67.4445},\n", " 'TRY': {'ID': 'R01700J',\n", " 'NumCode': '949',\n", " 'CharCode': 'TRY',\n", " 'Nominal': 10,\n", " 'Name': 'Турецких лир',\n", " 'Value': 93.8112,\n", " 'Previous': 92.7428},\n", " 'TMT': {'ID': 'R01710A',\n", " 'NumCode': '934',\n", " 'CharCode': 'TMT',\n", " 'Nominal': 1,\n", " 'Name': 'Новый туркменский манат',\n", " 'Value': 21.8047,\n", " 'Previous': 21.8592},\n", " 'UZS': {'ID': 'R01717',\n", " 'NumCode': '860',\n", " 'CharCode': 'UZS',\n", " 'Nominal': 10000,\n", " 'Name': 'Узбекских сумов',\n", " 'Value': 73.4256,\n", " 'Previous': 73.7359},\n", " 'UAH': {'ID': 'R01720',\n", " 'NumCode': '980',\n", " 'CharCode': 'UAH',\n", " 'Nominal': 10,\n", " 'Name': 'Украинских гривен',\n", " 'Value': 27.0623,\n", " 'Previous': 27.1854},\n", " 'CZK': {'ID': 'R01760',\n", " 'NumCode': '203',\n", " 'CharCode': 'CZK',\n", " 'Nominal': 10,\n", " 'Name': 'Чешских крон',\n", " 'Value': 33.9575,\n", " 'Previous': 34.1443},\n", " 'SEK': {'ID': 'R01770',\n", " 'NumCode': '752',\n", " 'CharCode': 'SEK',\n", " 'Nominal': 10,\n", " 'Name': 'Шведских крон',\n", " 'Value': 88.3074,\n", " 'Previous': 88.6563},\n", " 'CHF': {'ID': 'R01775',\n", " 'NumCode': '756',\n", " 'CharCode': 'CHF',\n", " 'Nominal': 1,\n", " 'Name': 'Швейцарский франк',\n", " 'Value': 83.1143,\n", " 'Previous': 83.6961},\n", " 'ZAR': {'ID': 'R01810',\n", " 'NumCode': '710',\n", " 'CharCode': 'ZAR',\n", " 'Nominal': 10,\n", " 'Name': 'Южноафриканских рэндов',\n", " 'Value': 48.8169,\n", " 'Previous': 49.5167},\n", " 'KRW': {'ID': 'R01815',\n", " 'NumCode': '410',\n", " 'CharCode': 'KRW',\n", " 'Nominal': 1000,\n", " 'Name': 'Вон Республики Корея',\n", " 'Value': 68.4903,\n", " 'Previous': 68.5394},\n", " 'JPY': {'ID': 'R01820',\n", " 'NumCode': '392',\n", " 'CharCode': 'JPY',\n", " 'Nominal': 100,\n", " 'Name': 'Японских иен',\n", " 'Value': 72.2654,\n", " 'Previous': 72.7217}}}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "currencies = response.json()\n", "currencies " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь данные лежат в словаре и мы можем легко получать необходимые значения." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ID': 'R01235',\n", " 'NumCode': '840',\n", " 'CharCode': 'USD',\n", " 'Nominal': 1,\n", " 'Name': 'Доллар США',\n", " 'Value': 76.2075,\n", " 'Previous': 76.3978}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "currencies['Valute']['USD'] " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Задание \n", "\n", "Созраните текущий курс евро в файле csv формата." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 }