{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "811389e5",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "[notice] A new release of pip is available: 26.1.2 -> 26.2.1\n",
      "[notice] To update, run: python.exe -m pip install --upgrade pip\n"
     ]
    }
   ],
   "source": [
    "!pip install telethon --quiet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "360808bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "import configparser\n",
    "import pandas as pd\n",
    "from tqdm.asyncio import tqdm\n",
    "\n",
    "from telethon import TelegramClient"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c16115f1",
   "metadata": {},
   "source": [
    "# Прасим конфиг"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d391dcc7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Определяем парсер конфига\n",
    "config = configparser.ConfigParser()\n",
    "\n",
    "config.read('configs/telegram_api.ini', encoding='utf-8')\n",
    "channels = eval(config['DATA']['channels'])\n",
    "save_root = config['DATA']['save_root']\n",
    "\n",
    "# Секретные ключи\n",
    "config.read('configs/telegram_api_secret.ini', encoding='utf-8')\n",
    "api_id = config['DATA_SECRET']['api_id']\n",
    "api_hash = config['DATA_SECRET']['api_hash']\n",
    "phone = config['DATA_SECRET']['phone']\n",
    "username = config['DATA_SECRET']['username']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4679f572",
   "metadata": {},
   "source": [
    "# Пишем парсер телеграма"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "33d80321",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Клиент, через который будем подключаться\n",
    "client = TelegramClient('metadata/tg', api_id, api_hash, system_version='4.16.30-vxCUSTOM')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5bd60573",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'https://t.me/markettwits'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "channels[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "496e2fd6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Client Created\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 100/373588 [00:00<17:10, 362.26it/s]\n"
     ]
    }
   ],
   "source": [
    "# Распарсим 1-ые 100 новостей.\n",
    "await client.start(phone=phone)\n",
    "print(\"Client Created\")\n",
    "\n",
    "\n",
    "async def get_channel_message_count(client, channel_entity):\n",
    "\n",
    "    messages = await client.get_messages(\n",
    "        channel_entity, \n",
    "        limit=0 \n",
    "        )\n",
    "    \n",
    "    return messages.total\n",
    "\n",
    "my_channel = await client.get_entity(channels[0])\n",
    "message_count = await get_channel_message_count(client, my_channel)\n",
    "\n",
    "# Контейнер для сообщений\n",
    "all_messages = []\n",
    "\n",
    "# Итерируемся по сообщениям в канале и записываем в контейнер\n",
    "async for message in tqdm(client.iter_messages(entity=my_channel, limit=100), total=message_count):\n",
    "    all_messages.append(message.to_dict())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5cd448b6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'_': 'Message',\n",
       " 'id': 382477,\n",
       " 'peer_id': {'_': 'PeerChannel', 'channel_id': 1203560567},\n",
       " 'date': datetime.datetime(2026, 8, 26, 17, 17, 9, tzinfo=datetime.timezone.utc),\n",
       " 'message': '⬇️🛢🇷🇺#нефть #россия \\nЭкспорт нефти из Новороссийска снизился в августе в 4,4 раза — Ъ',\n",
       " 'out': False,\n",
       " 'mentioned': False,\n",
       " 'media_unread': False,\n",
       " 'silent': False,\n",
       " 'post': True,\n",
       " 'from_scheduled': False,\n",
       " 'legacy': False,\n",
       " 'edit_hide': False,\n",
       " 'pinned': False,\n",
       " 'noforwards': False,\n",
       " 'invert_media': False,\n",
       " 'offline': False,\n",
       " 'video_processing_pending': False,\n",
       " 'paid_suggested_post_stars': False,\n",
       " 'paid_suggested_post_ton': False,\n",
       " 'from_id': None,\n",
       " 'from_boosts_applied': None,\n",
       " 'saved_peer_id': None,\n",
       " 'fwd_from': None,\n",
       " 'via_bot_id': None,\n",
       " 'via_business_bot_id': None,\n",
       " 'reply_to': None,\n",
       " 'media': None,\n",
       " 'reply_markup': None,\n",
       " 'entities': [{'_': 'MessageEntityHashtag', 'offset': 8, 'length': 6},\n",
       "  {'_': 'MessageEntityHashtag', 'offset': 15, 'length': 7},\n",
       "  {'_': 'MessageEntityBold', 'offset': 31, 'length': 6},\n",
       "  {'_': 'MessageEntityTextUrl',\n",
       "   'offset': 85,\n",
       "   'length': 3,\n",
       "   'url': 'https://www.kommersant.ru/doc/8909105'}],\n",
       " 'views': 14225,\n",
       " 'forwards': 68,\n",
       " 'replies': None,\n",
       " 'edit_date': None,\n",
       " 'post_author': None,\n",
       " 'grouped_id': None,\n",
       " 'reactions': None,\n",
       " 'restriction_reason': [],\n",
       " 'ttl_period': None,\n",
       " 'quick_reply_shortcut_id': None,\n",
       " 'effect': None,\n",
       " 'factcheck': None,\n",
       " 'report_delivery_until_date': None,\n",
       " 'paid_message_stars': None,\n",
       " 'suggested_post': None}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_messages[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "552994ae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Client Created\n",
      "Парсим Dividend_News100\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 4591/4591 [00:48<00:00, 93.81it/s] \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Парсим Stock_News100\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  3%|▎         | 2200/69655 [00:22<11:21, 98.91it/s] \n"
     ]
    },
    {
     "ename": "CancelledError",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mCancelledError\u001b[39m                            Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 30\u001b[39m\n\u001b[32m     27\u001b[39m         df.to_parquet(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00msave_root\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mchannel[\u001b[32m13\u001b[39m:]\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.parquet\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m     29\u001b[39m \u001b[38;5;66;03m# Запускаем\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m30\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m main(phone, channels[\u001b[32m1\u001b[39m:], save_root)\n\u001b[32m     32\u001b[39m \u001b[38;5;66;03m# Если запускать в py файле, то надо запустить сначала loop, все для этого есть в самом клиенте\u001b[39;00m\n\u001b[32m     33\u001b[39m \u001b[38;5;66;03m# Инициалируем ассинхронный loop\u001b[39;00m\n\u001b[32m     34\u001b[39m \u001b[38;5;66;03m# async with client:\u001b[39;00m\n\u001b[32m     35\u001b[39m \u001b[38;5;66;03m#     client.loop.run_until_complete(main(phone, channels, save_root))\u001b[39;00m\n",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 19\u001b[39m, in \u001b[36mmain\u001b[39m\u001b[34m(phone, channels, save_root)\u001b[39m\n\u001b[32m     16\u001b[39m all_messages = []\n\u001b[32m     18\u001b[39m \u001b[38;5;66;03m# Итерируемся по сообщениям в канале и записываем в контейнер\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m19\u001b[39m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mfor\u001b[39;00m message \u001b[38;5;129;01min\u001b[39;00m tqdm(client.iter_messages(entity=my_channel), total=message_count):\n\u001b[32m     20\u001b[39m     all_messages.append(message.to_dict())\n\u001b[32m     22\u001b[39m \u001b[38;5;66;03m# Достаем нужную информацию из словаря\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\tqdm\\asyncio.py:42\u001b[39m, in \u001b[36mtqdm_asyncio.__anext__\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m     40\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m     41\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.iterable_awaitable:\n\u001b[32m---> \u001b[39m\u001b[32m42\u001b[39m         res = \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.iterable_next()\n\u001b[32m     43\u001b[39m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m     44\u001b[39m         res = \u001b[38;5;28mself\u001b[39m.iterable_next()\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\telethon\\requestiter.py:67\u001b[39m, in \u001b[36mRequestIter.__anext__\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m     64\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.index == \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.buffer):\n\u001b[32m     65\u001b[39m     \u001b[38;5;66;03m# asyncio will handle times <= 0 to sleep 0 seconds\u001b[39;00m\n\u001b[32m     66\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.wait_time:\n\u001b[32m---> \u001b[39m\u001b[32m67\u001b[39m         \u001b[38;5;28;01mawait\u001b[39;00m asyncio.sleep(\n\u001b[32m     68\u001b[39m             \u001b[38;5;28mself\u001b[39m.wait_time - (time.time() - \u001b[38;5;28mself\u001b[39m.last_load)\n\u001b[32m     69\u001b[39m         )\n\u001b[32m     70\u001b[39m         \u001b[38;5;28mself\u001b[39m.last_load = time.time()\n\u001b[32m     72\u001b[39m     \u001b[38;5;28mself\u001b[39m.index = \u001b[32m0\u001b[39m\n",
      "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\asyncio\\tasks.py:718\u001b[39m, in \u001b[36msleep\u001b[39m\u001b[34m(delay, result)\u001b[39m\n\u001b[32m    714\u001b[39m h = loop.call_later(delay,\n\u001b[32m    715\u001b[39m                     futures._set_result_unless_cancelled,\n\u001b[32m    716\u001b[39m                     future, result)\n\u001b[32m    717\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m718\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m future\n\u001b[32m    719\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m    720\u001b[39m     h.cancel()\n",
      "\u001b[31mCancelledError\u001b[39m: "
     ]
    }
   ],
   "source": [
    "async def main(phone, channels, save_root):\n",
    "\n",
    "    # Инициализируем клиент\n",
    "    await client.start(phone=phone)\n",
    "    print(\"Client Created\")\n",
    "\n",
    "    # Итерируемся по каналам\n",
    "    for channel in channels:\n",
    "        \n",
    "        # \"Переходим\" в канал, откуда будем парсить сообщения\n",
    "        my_channel = await client.get_entity(channel)\n",
    "        message_count = await get_channel_message_count(client, my_channel)\n",
    "        print('Парсим', channel[13:])\n",
    "        \n",
    "        # Контейнер для сообщений\n",
    "        all_messages = []\n",
    "        \n",
    "        # Итерируемся по сообщениям в канале и записываем в контейнер\n",
    "        async for message in tqdm(client.iter_messages(entity=my_channel), total=message_count):\n",
    "            all_messages.append(message.to_dict())\n",
    "        \n",
    "        # Достаем нужную информацию из словаря\n",
    "        all_messages = [[el['date'], el.get('message', None)] for el in all_messages]\n",
    "\n",
    "        # Сохраняем в виде pandas датафрейма\n",
    "        df = pd.DataFrame(data=all_messages, columns=['date', 'message'])\n",
    "        df.to_parquet(f'{save_root}/{channel[13:]}.parquet')\n",
    "\n",
    "# Запускаем\n",
    "await main(phone, channels[1:], save_root)\n",
    "\n",
    "# Если запускать в py файле, то надо запустить сначала loop, все для этого есть в самом клиенте\n",
    "# Инициалируем ассинхронный loop\n",
    "# async with client:\n",
    "#     client.loop.run_until_complete(main(phone, channels, save_root))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "2cf0f545",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>message</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2026-08-26 15:05:26+00:00</td>\n",
       "      <td>🔴В 2025 году Россияне заработали 5,3 млрд рубл...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2026-08-26 05:04:45+00:00</td>\n",
       "      <td>#Дивиденды\\n\\nЗаймер (#ZAYM)\\nСовет директоров...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2026-07-16 18:00:59+00:00</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2026-07-16 18:00:59+00:00</td>\n",
       "      <td>Рос рынок за месяц</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2026-05-20 17:20:11+00:00</td>\n",
       "      <td>⛔️ Совет директоров Газпрома рекомендовал не в...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4586</th>\n",
       "      <td>2021-02-05 14:58:22+00:00</td>\n",
       "      <td>#Дивиденды #VRS\\n⚡️Verso объявляет квартальные...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4587</th>\n",
       "      <td>2021-02-05 14:56:46+00:00</td>\n",
       "      <td>#Дивиденды #NLSN\\n⚡️Nielsen объявляет кварталь...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4588</th>\n",
       "      <td>2021-02-05 14:56:11+00:00</td>\n",
       "      <td>⚡️Ubiquiti объявляет квартальные дивиденды в р...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4589</th>\n",
       "      <td>2021-02-05 14:54:34+00:00</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4590</th>\n",
       "      <td>2021-02-05 13:22:59+00:00</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4591 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                          date  \\\n",
       "0    2026-08-26 15:05:26+00:00   \n",
       "1    2026-08-26 05:04:45+00:00   \n",
       "2    2026-07-16 18:00:59+00:00   \n",
       "3    2026-07-16 18:00:59+00:00   \n",
       "4    2026-05-20 17:20:11+00:00   \n",
       "...                        ...   \n",
       "4586 2021-02-05 14:58:22+00:00   \n",
       "4587 2021-02-05 14:56:46+00:00   \n",
       "4588 2021-02-05 14:56:11+00:00   \n",
       "4589 2021-02-05 14:54:34+00:00   \n",
       "4590 2021-02-05 13:22:59+00:00   \n",
       "\n",
       "                                                message  \n",
       "0     🔴В 2025 году Россияне заработали 5,3 млрд рубл...  \n",
       "1     #Дивиденды\\n\\nЗаймер (#ZAYM)\\nСовет директоров...  \n",
       "2                                                        \n",
       "3                                    Рос рынок за месяц  \n",
       "4     ⛔️ Совет директоров Газпрома рекомендовал не в...  \n",
       "...                                                 ...  \n",
       "4586  #Дивиденды #VRS\\n⚡️Verso объявляет квартальные...  \n",
       "4587  #Дивиденды #NLSN\\n⚡️Nielsen объявляет кварталь...  \n",
       "4588  ⚡️Ubiquiti объявляет квартальные дивиденды в р...  \n",
       "4589                                               None  \n",
       "4590                                               None  \n",
       "\n",
       "[4591 rows x 2 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_parquet('telegram_data/Dividend_News100.parquet')\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82b67aec",
   "metadata": {},
   "source": [
    "# Парсинг ВК"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f3c55c0a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "[notice] A new release of pip is available: 26.1.2 -> 26.2.1\n",
      "[notice] To update, run: python.exe -m pip install --upgrade pip\n"
     ]
    }
   ],
   "source": [
    "!pip install vk_api --quiet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "3ef2c860",
   "metadata": {},
   "outputs": [],
   "source": [
    "import configparser\n",
    "\n",
    "import vk_api\n",
    "from tqdm import tqdm # Неасинхронный tqdm\n",
    "from datetime import datetime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "39c3d953",
   "metadata": {},
   "outputs": [],
   "source": [
    "config = configparser.ConfigParser()\n",
    "\n",
    "config.read('configs/vk_api.ini', encoding='utf-8')\n",
    "list_of_groups = eval(config['DATA']['list_of_groups'])\n",
    "n_posts = eval(config['DATA']['n_posts'])\n",
    "save_root = config['DATA']['save_root']\n",
    "\n",
    "# Секретные ключи\n",
    "config.read('configs/vk_api_secret.ini', encoding='utf-8')\n",
    "key = config['DATA_SECRET']['key']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1bb08afd",
   "metadata": {},
   "outputs": [],
   "source": [
    "api = vk_api.VkApi(token=key)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1badacce",
   "metadata": {},
   "source": [
    "Парсинг производится пачками по n постов, чтобы распарсить весь паблик, надо знать количество постов в нем.\n",
    "\n",
    "В ответе приходят токько текстовые данные. Если хочется скачать еще фото, то придется из текста достать ссылку и по ней уже скачать основное фото."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2523fdf7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Функция для определения максимального количества постов в сообществе\n",
    "def get_max_offset(group):\n",
    "    return api.method(method=\"wall.get\", values={\n",
    "        \"domain\": group,\n",
    "        \"offset\": 0,\n",
    "        \"count\": 1\n",
    "        })['count']\n",
    "\n",
    "def parse_group(group):\n",
    "    group_data = [] # Хранилище для данных\n",
    "    current_offset = 0 # Парсим с начала\n",
    "    max_offset = get_max_offset(group) # Получаем общее количество постов\n",
    "    # Пока критерий остановки не сработатет парсим по n_post постов\n",
    "    for current_offset in tqdm(range(max_offset // n_posts + 1)): # Считаем, сколько раз\n",
    "        group_data.extend(api.method(method=\"wall.get\", values={\n",
    "            \"domain\": group,\n",
    "            \"offset\": current_offset * n_posts,\n",
    "            \"count\": n_posts\n",
    "        })['items'])\n",
    "        \n",
    "        current_offset += n_posts # Обновляем текущий счетчик\n",
    "\n",
    "    return group_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "bb0dced6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ef_event'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list_of_groups[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "ca8de409",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 6/6 [00:10<00:00,  1.79s/it]\n"
     ]
    }
   ],
   "source": [
    "result = parse_group(list_of_groups[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ee25c1a6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "534"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "793435df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'inner_type': 'wall_wallpost',\n",
       " 'comments': {'count': 0},\n",
       " 'marked_as_ads': 0,\n",
       " 'hash': 'e3FNbK0vu7rpCn6I4g',\n",
       " 'type': 'post',\n",
       " 'push_subscription': {'is_subscribed': False},\n",
       " 'attachments': [{'type': 'photo',\n",
       "   'photo': {'album_id': -7,\n",
       "    'date': 1787734411,\n",
       "    'id': 457243240,\n",
       "    'owner_id': -221794501,\n",
       "    'access_key': 'c0f560249a51dc3906',\n",
       "    'post_id': 1549,\n",
       "    'sizes': [{'height': 72,\n",
       "      'type': 's',\n",
       "      'width': 72,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=72x0'},\n",
       "     {'height': 160,\n",
       "      'type': 'm',\n",
       "      'width': 160,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=160x0'},\n",
       "     {'height': 640,\n",
       "      'type': 'x',\n",
       "      'width': 640,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=640x0'},\n",
       "     {'height': 1080,\n",
       "      'type': 'y',\n",
       "      'width': 1080,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=1080x0'},\n",
       "     {'height': 1080,\n",
       "      'type': 'z',\n",
       "      'width': 1080,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=1080x0'},\n",
       "     {'height': 108,\n",
       "      'type': 'o',\n",
       "      'width': 108,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=108x0'},\n",
       "     {'height': 240,\n",
       "      'type': 'p',\n",
       "      'width': 240,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=240x0'},\n",
       "     {'height': 360,\n",
       "      'type': 'q',\n",
       "      'width': 360,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=360x0'},\n",
       "     {'height': 540,\n",
       "      'type': 'r',\n",
       "      'width': 540,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu&cs=540x0'},\n",
       "     {'height': 1080,\n",
       "      'type': 'base',\n",
       "      'width': 1080,\n",
       "      'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu'}],\n",
       "    'text': '',\n",
       "    'user_id': 100,\n",
       "    'web_view_token': '93f318e6a28909e986',\n",
       "    'orig_photo': {'height': 1080,\n",
       "     'type': 'base',\n",
       "     'url': 'https://sun9-5.userapi.com/s/v1/ig2/wtlR23nzmZml62mVOHpAkF7fqcbaS2uPV4LJLYwfhf8lCHm7tvub9224CgUf5k3qEPvy6qH8bj_pol1y4zgvEaPw.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080&from=bu',\n",
       "     'width': 1080}}}],\n",
       " 'date': 1787734411,\n",
       " 'from_id': -221794501,\n",
       " 'id': 1549,\n",
       " 'likes': {'can_like': 0, 'count': 0, 'user_likes': 0},\n",
       " 'owner_id': -221794501,\n",
       " 'post_type': 'post',\n",
       " 'reposts': {'count': 0},\n",
       " 'text': 'А что, если в новом учебном году попробовать себя в роли преподавателя? 👀\\n\\nНа Экономическом факультете МГУ уже много лет работает Экономико-математическая школа — ЭМШ. Это бесплатная вечерняя школа для учеников 8–11 классов, где школьники изучают экономику, математику и другие дисциплины, а многие занятия проходят в формате авторских курсов.\\n\\n➡️И придумать такой курс можете вы! \\n\\n29 августа и 5 сентября пройдут Дни ЭМШового первокурсника — встречи для тех, кто хочет попробовать себя в преподавании, разобраться, как устроена работа в ЭМШ, и начать разрабатывать программу авторского курса.\\n\\n❗️Первая встреча состоится 29 августа в 15:00, ауд. 413. Регистрация доступна по ссылке: https://docs.google.com/forms/d/e/1FAIpQLSeEbQiDXmNZMPg2OQ1beDiZY5j6HHp_jxiBjaAP-XDPy83pTg/viewform?usp=publish-editor\\n\\nПрограмма:\\n▫️рассказ о преподавании в ЭМШ и разбор шаблона программы курса вместе с координатором Методсовета;\\n▫️тренинги и упражнения, которые помогут начать работу над собственной авторской программой.\\n\\nА уже 5 сентября можно будет попробовать свои силы на демоверсии заседания Методсовета и представить собственный курс (или его черновую версию).\\n\\nP.s. По всем вопросам можно обратиться к организаторам: Саша Мелкова — [id177935522|@melkooova], Катя Барак — [id134161390|@polundra_kk], Анна Ванеян — [id543187555|@anna_vaneyan]',\n",
       " 'views': {'count': 24}}"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ba3d239b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1753693666"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result[0]['date']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "fdf1f425",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>message</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2025-07-28 12:07:46</td>\n",
       "      <td>🎉 ЭФ Event — 2 года вместе с вами! \\n\\nСегодня...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2026-08-26 11:53:31</td>\n",
       "      <td>А что, если в новом учебном году попробовать с...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2026-07-28 12:54:11</td>\n",
       "      <td>3 года ЭФ Event: подводим итоги\\n\\n🎂 Сегодня н...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2026-07-16 11:40:07</td>\n",
       "      <td>Продлеваем набор кураторов первокурсников ЭФ \\...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2026-07-11 17:49:39</td>\n",
       "      <td>Пока будущие первокурсники ЭФ пишут ДВИ по мат...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>529</th>\n",
       "      <td>2023-08-14 12:00:01</td>\n",
       "      <td>ТЕЛЕГРАМ-КАНАЛ \\n\\nЭкономический факультет МГУ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>530</th>\n",
       "      <td>2023-08-11 14:42:55</td>\n",
       "      <td>ПРИВЕТСТВУЕМ ПЕРВОКУРСНИКОВ! 🎉 \\n\\nВы успешно ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>531</th>\n",
       "      <td>2023-08-09 17:45:20</td>\n",
       "      <td>ЯРКИЕ МОМЕНТЫ ПРОШЛОГО ГОДА🌠\\n \\nКаждый год на...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>532</th>\n",
       "      <td>2023-08-07 13:10:00</td>\n",
       "      <td>ОРГАНИЗАТОРЫ 👥\\n\\n🤗 Дорогие студенты! Сегодня ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>533</th>\n",
       "      <td>2023-08-05 17:29:13</td>\n",
       "      <td>ПРИВЕТСТВУЕМ ВСЕХ 🙋\\n\\n📣 Приветствуем всех сту...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>534 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                   date                                            message\n",
       "0   2025-07-28 12:07:46  🎉 ЭФ Event — 2 года вместе с вами! \\n\\nСегодня...\n",
       "1   2026-08-26 11:53:31  А что, если в новом учебном году попробовать с...\n",
       "2   2026-07-28 12:54:11  3 года ЭФ Event: подводим итоги\\n\\n🎂 Сегодня н...\n",
       "3   2026-07-16 11:40:07  Продлеваем набор кураторов первокурсников ЭФ \\...\n",
       "4   2026-07-11 17:49:39  Пока будущие первокурсники ЭФ пишут ДВИ по мат...\n",
       "..                  ...                                                ...\n",
       "529 2023-08-14 12:00:01  ТЕЛЕГРАМ-КАНАЛ \\n\\nЭкономический факультет МГУ...\n",
       "530 2023-08-11 14:42:55  ПРИВЕТСТВУЕМ ПЕРВОКУРСНИКОВ! 🎉 \\n\\nВы успешно ...\n",
       "531 2023-08-09 17:45:20  ЯРКИЕ МОМЕНТЫ ПРОШЛОГО ГОДА🌠\\n \\nКаждый год на...\n",
       "532 2023-08-07 13:10:00  ОРГАНИЗАТОРЫ 👥\\n\\n🤗 Дорогие студенты! Сегодня ...\n",
       "533 2023-08-05 17:29:13  ПРИВЕТСТВУЕМ ВСЕХ 🙋\\n\\n📣 Приветствуем всех сту...\n",
       "\n",
       "[534 rows x 2 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Достаем нужную информацию из словаря\n",
    "all_messages = [[datetime.fromtimestamp(el['date']), el.get('text', None)] for el in result]\n",
    "\n",
    "# Сохраняем в виде pandas датафрейма\n",
    "df = pd.DataFrame(data=all_messages, columns=['date', 'message'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "07c9fda2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Парсим efmsu\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 40/40 [01:06<00:00,  1.67s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Парсим ef_event\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 6/6 [00:10<00:00,  1.77s/it]\n"
     ]
    }
   ],
   "source": [
    "for group in list_of_groups:\n",
    "    print(f'Парсим {group}')\n",
    "    result = parse_group(group)\n",
    "    all_messages = [[datetime.fromtimestamp(el['date']), el.get('text', None)] for el in result]\n",
    "\n",
    "    # Сохраняем в виде pandas датафрейма\n",
    "    df = pd.DataFrame(data=all_messages, columns=['date', 'message'])\n",
    "    df.to_parquet(f'{save_root}/{group}.parquet')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7745eb61",
   "metadata": {},
   "source": [
    "Если хочется получить комментарии под постами, то это можно сделать через `wall.getComments`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "34dd5493",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_post_cooments(owner_id, post_id):\n",
    "    return api.method(method=\"wall.getComments\", values={\n",
    "        'owner_id': owner_id,\n",
    "        'post_id': post_id,\n",
    "        'count': n_posts # Если комментариев много, то тоже придется скачивать большой пачкой или в цикле\n",
    "        })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "05b0d0bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = get_post_cooments(result[0]['owner_id'], result[0]['id'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "9f7073ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(res['items'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "541b66d5",
   "metadata": {},
   "source": [
    "# Прасинг API Мосбиржи"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "dbd5b83c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import io # Пригодится для считывания байт-кода из результатов запроса\n",
    "import requests\n",
    "import datetime # Чтобы задать дату для парсинга\n",
    "\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "cdb1f521",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Наши тикеры\n",
    "tickers = ['GMKN', 'GAZP', 'LKOH', 'TATN']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "2cdfecd2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2021-01'"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = datetime.date(2021, 1, 1)\n",
    "d.strftime('%Y') + '-' + d.strftime('%m')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "28c4c507",
   "metadata": {},
   "outputs": [],
   "source": [
    "def parse_moex_requests(date_start, date_finish, ticker):\n",
    "    agg_data = pd.DataFrame()\n",
    "    finish = date_finish.strftime('%Y') + '-' + date_finish.strftime('%m') + '-' + date_finish.strftime('%d')\n",
    "    while date_start < date_finish:\n",
    "        start = date_start.strftime('%Y') + '-' + date_start.strftime('%m') + '-' + date_start.strftime('%d')\n",
    "        # Задаем ссылку\n",
    "        url = f'http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/TQBR/securities/{ticker}.csv?from={start}&till={finish}'\n",
    "        # Делаем get запрос через requestsб аргумент stream=True нужен, чтобы вести скачивание\n",
    "        result = io.BytesIO(requests.get(url, stream=True).content)\n",
    "        # Считываем таблицу\n",
    "        data = pd.read_csv(result, sep=';', header=1, encoding=\"WINDOWS-1251\").reset_index(drop=True).dropna(subset='SECID')\n",
    "        agg_data = pd.concat([agg_data, data])\n",
    "        # Обновляем счетчик дней\n",
    "        date_start += datetime.timedelta(days=100)\n",
    "    return agg_data.drop_duplicates() # Удаляем дупликаты, потому что API возвращает 100 торговых дней, а мы по обычным итерировались для простоты"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "98be0e6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def parse_all_tickers(tickers, parsing_foo, date_start=datetime.date(2021, 1, 1), date_finish=datetime.date(2025, 8, 14)):\n",
    "    agg_df = pd.DataFrame()\n",
    "    for ticker in tickers:\n",
    "        data = parsing_foo(date_start, date_finish, ticker)\n",
    "        agg_df = pd.concat([agg_df, data])\n",
    "        print(f'{ticker} parsed')\n",
    "    return agg_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "e59306d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GMKN parsed\n",
      "GAZP parsed\n",
      "LKOH parsed\n",
      "TATN parsed\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BOARDID</th>\n",
       "      <th>TRADEDATE</th>\n",
       "      <th>SHORTNAME</th>\n",
       "      <th>SECID</th>\n",
       "      <th>NUMTRADES</th>\n",
       "      <th>VALUE</th>\n",
       "      <th>OPEN</th>\n",
       "      <th>LOW</th>\n",
       "      <th>HIGH</th>\n",
       "      <th>LEGALCLOSEPRICE</th>\n",
       "      <th>...</th>\n",
       "      <th>MARKETPRICE3</th>\n",
       "      <th>ADMITTEDQUOTE</th>\n",
       "      <th>MP2VALTRD</th>\n",
       "      <th>MARKETPRICE3TRADESVALUE</th>\n",
       "      <th>ADMITTEDVALUE</th>\n",
       "      <th>WAVAL</th>\n",
       "      <th>TRADINGSESSION</th>\n",
       "      <th>CURRENCYID</th>\n",
       "      <th>TRENDCLSPR</th>\n",
       "      <th>TRADE_SESSION_DATE</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-04</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>31293.0</td>\n",
       "      <td>6.488472e+09</td>\n",
       "      <td>23820.0</td>\n",
       "      <td>23812.0</td>\n",
       "      <td>24584.0</td>\n",
       "      <td>24550.0</td>\n",
       "      <td>...</td>\n",
       "      <td>24284.0</td>\n",
       "      <td>24550.0</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>2.67</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-05</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>23256.0</td>\n",
       "      <td>5.184019e+09</td>\n",
       "      <td>24304.0</td>\n",
       "      <td>24116.0</td>\n",
       "      <td>24698.0</td>\n",
       "      <td>24538.0</td>\n",
       "      <td>...</td>\n",
       "      <td>24492.0</td>\n",
       "      <td>24538.0</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.49</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-06</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>29709.0</td>\n",
       "      <td>5.951988e+09</td>\n",
       "      <td>24660.0</td>\n",
       "      <td>24590.0</td>\n",
       "      <td>25088.0</td>\n",
       "      <td>25002.0</td>\n",
       "      <td>...</td>\n",
       "      <td>24856.0</td>\n",
       "      <td>25002.0</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.41</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-08</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>67631.0</td>\n",
       "      <td>1.635197e+10</td>\n",
       "      <td>25608.0</td>\n",
       "      <td>25552.0</td>\n",
       "      <td>26708.0</td>\n",
       "      <td>26318.0</td>\n",
       "      <td>...</td>\n",
       "      <td>26286.0</td>\n",
       "      <td>26318.0</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>6.07</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-11</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>56238.0</td>\n",
       "      <td>1.590998e+10</td>\n",
       "      <td>26300.0</td>\n",
       "      <td>26008.0</td>\n",
       "      <td>27144.0</td>\n",
       "      <td>26386.0</td>\n",
       "      <td>...</td>\n",
       "      <td>26614.0</td>\n",
       "      <td>26386.0</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-0.96</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-08</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>43083.0</td>\n",
       "      <td>2.751028e+09</td>\n",
       "      <td>703.4</td>\n",
       "      <td>695.2</td>\n",
       "      <td>731.4</td>\n",
       "      <td>715.2</td>\n",
       "      <td>...</td>\n",
       "      <td>707.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.207840e+09</td>\n",
       "      <td>2.207840e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>3.66</td>\n",
       "      <td>2025-08-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-11</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>51581.0</td>\n",
       "      <td>2.554129e+09</td>\n",
       "      <td>729.0</td>\n",
       "      <td>718.1</td>\n",
       "      <td>746.0</td>\n",
       "      <td>721.6</td>\n",
       "      <td>...</td>\n",
       "      <td>724.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.931356e+09</td>\n",
       "      <td>1.931356e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-1.03</td>\n",
       "      <td>2025-08-11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-12</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>24159.0</td>\n",
       "      <td>1.019088e+09</td>\n",
       "      <td>722.0</td>\n",
       "      <td>717.2</td>\n",
       "      <td>726.9</td>\n",
       "      <td>722.4</td>\n",
       "      <td>...</td>\n",
       "      <td>722.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>9.095617e+08</td>\n",
       "      <td>9.095617e+08</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>0.28</td>\n",
       "      <td>2025-08-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-13</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>33053.0</td>\n",
       "      <td>1.298539e+09</td>\n",
       "      <td>723.0</td>\n",
       "      <td>710.1</td>\n",
       "      <td>726.3</td>\n",
       "      <td>711.4</td>\n",
       "      <td>...</td>\n",
       "      <td>718.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.105441e+09</td>\n",
       "      <td>1.105441e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-1.48</td>\n",
       "      <td>2025-08-13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-14</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>31551.0</td>\n",
       "      <td>1.373282e+09</td>\n",
       "      <td>712.5</td>\n",
       "      <td>708.6</td>\n",
       "      <td>724.0</td>\n",
       "      <td>718.4</td>\n",
       "      <td>...</td>\n",
       "      <td>716.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.114595e+09</td>\n",
       "      <td>1.114595e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.28</td>\n",
       "      <td>2025-08-14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4692 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   BOARDID   TRADEDATE   SHORTNAME SECID  NUMTRADES         VALUE     OPEN  \\\n",
       "0     TQBR  2021-01-04   ГМКНорНик  GMKN    31293.0  6.488472e+09  23820.0   \n",
       "1     TQBR  2021-01-05   ГМКНорНик  GMKN    23256.0  5.184019e+09  24304.0   \n",
       "2     TQBR  2021-01-06   ГМКНорНик  GMKN    29709.0  5.951988e+09  24660.0   \n",
       "3     TQBR  2021-01-08   ГМКНорНик  GMKN    67631.0  1.635197e+10  25608.0   \n",
       "4     TQBR  2021-01-11   ГМКНорНик  GMKN    56238.0  1.590998e+10  26300.0   \n",
       "..     ...         ...         ...   ...        ...           ...      ...   \n",
       "57    TQBR  2025-08-08  Татнфт 3ао  TATN    43083.0  2.751028e+09    703.4   \n",
       "58    TQBR  2025-08-11  Татнфт 3ао  TATN    51581.0  2.554129e+09    729.0   \n",
       "59    TQBR  2025-08-12  Татнфт 3ао  TATN    24159.0  1.019088e+09    722.0   \n",
       "60    TQBR  2025-08-13  Татнфт 3ао  TATN    33053.0  1.298539e+09    723.0   \n",
       "61    TQBR  2025-08-14  Татнфт 3ао  TATN    31551.0  1.373282e+09    712.5   \n",
       "\n",
       "        LOW     HIGH  LEGALCLOSEPRICE  ...  MARKETPRICE3  ADMITTEDQUOTE  \\\n",
       "0   23812.0  24584.0          24550.0  ...       24284.0        24550.0   \n",
       "1   24116.0  24698.0          24538.0  ...       24492.0        24538.0   \n",
       "2   24590.0  25088.0          25002.0  ...       24856.0        25002.0   \n",
       "3   25552.0  26708.0          26318.0  ...       26286.0        26318.0   \n",
       "4   26008.0  27144.0          26386.0  ...       26614.0        26386.0   \n",
       "..      ...      ...              ...  ...           ...            ...   \n",
       "57    695.2    731.4            715.2  ...         707.2            NaN   \n",
       "58    718.1    746.0            721.6  ...         724.0            NaN   \n",
       "59    717.2    726.9            722.4  ...         722.1            NaN   \n",
       "60    710.1    726.3            711.4  ...         718.2            NaN   \n",
       "61    708.6    724.0            718.4  ...         716.5            NaN   \n",
       "\n",
       "       MP2VALTRD  MARKETPRICE3TRADESVALUE  ADMITTEDVALUE  WAVAL  \\\n",
       "0   5.598104e+09             5.598104e+09   5.598104e+09    0.0   \n",
       "1   4.639079e+09             4.639079e+09   4.639079e+09    0.0   \n",
       "2   5.308193e+09             5.308193e+09   5.308193e+09    0.0   \n",
       "3   1.517160e+10             1.517160e+10   1.517160e+10    0.0   \n",
       "4   1.540545e+10             1.540545e+10   1.540545e+10    0.0   \n",
       "..           ...                      ...            ...    ...   \n",
       "57  2.207840e+09             2.207840e+09            NaN    0.0   \n",
       "58  1.931356e+09             1.931356e+09            NaN    0.0   \n",
       "59  9.095617e+08             9.095617e+08            NaN    0.0   \n",
       "60  1.105441e+09             1.105441e+09            NaN    0.0   \n",
       "61  1.114595e+09             1.114595e+09            NaN    0.0   \n",
       "\n",
       "    TRADINGSESSION  CURRENCYID  TRENDCLSPR  TRADE_SESSION_DATE  \n",
       "0              3.0         SUR        2.67                 NaN  \n",
       "1              3.0         SUR        1.49                 NaN  \n",
       "2              3.0         SUR        1.41                 NaN  \n",
       "3              3.0         SUR        6.07                 NaN  \n",
       "4              3.0         SUR       -0.96                 NaN  \n",
       "..             ...         ...         ...                 ...  \n",
       "57             3.0         SUR        3.66          2025-08-08  \n",
       "58             3.0         SUR       -1.03          2025-08-11  \n",
       "59             3.0         SUR        0.28          2025-08-12  \n",
       "60             3.0         SUR       -1.48          2025-08-13  \n",
       "61             3.0         SUR        1.28          2025-08-14  \n",
       "\n",
       "[4692 rows x 24 columns]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = parse_all_tickers(tickers, parse_moex_requests)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "64b815a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BOARDID</th>\n",
       "      <th>TRADEDATE</th>\n",
       "      <th>SHORTNAME</th>\n",
       "      <th>SECID</th>\n",
       "      <th>NUMTRADES</th>\n",
       "      <th>VALUE</th>\n",
       "      <th>OPEN</th>\n",
       "      <th>LOW</th>\n",
       "      <th>HIGH</th>\n",
       "      <th>LEGALCLOSEPRICE</th>\n",
       "      <th>...</th>\n",
       "      <th>MARKETPRICE3</th>\n",
       "      <th>ADMITTEDQUOTE</th>\n",
       "      <th>MP2VALTRD</th>\n",
       "      <th>MARKETPRICE3TRADESVALUE</th>\n",
       "      <th>ADMITTEDVALUE</th>\n",
       "      <th>WAVAL</th>\n",
       "      <th>TRADINGSESSION</th>\n",
       "      <th>CURRENCYID</th>\n",
       "      <th>TRENDCLSPR</th>\n",
       "      <th>TRADE_SESSION_DATE</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-04</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>31293.0</td>\n",
       "      <td>6.488472e+09</td>\n",
       "      <td>23820.00</td>\n",
       "      <td>23812.00</td>\n",
       "      <td>24584.00</td>\n",
       "      <td>24550.00</td>\n",
       "      <td>...</td>\n",
       "      <td>24284.00</td>\n",
       "      <td>24550.0</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>2.67</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-05</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>23256.0</td>\n",
       "      <td>5.184019e+09</td>\n",
       "      <td>24304.00</td>\n",
       "      <td>24116.00</td>\n",
       "      <td>24698.00</td>\n",
       "      <td>24538.00</td>\n",
       "      <td>...</td>\n",
       "      <td>24492.00</td>\n",
       "      <td>24538.0</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.49</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-06</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>29709.0</td>\n",
       "      <td>5.951988e+09</td>\n",
       "      <td>24660.00</td>\n",
       "      <td>24590.00</td>\n",
       "      <td>25088.00</td>\n",
       "      <td>25002.00</td>\n",
       "      <td>...</td>\n",
       "      <td>24856.00</td>\n",
       "      <td>25002.0</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.41</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-08</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>67631.0</td>\n",
       "      <td>1.635197e+10</td>\n",
       "      <td>25608.00</td>\n",
       "      <td>25552.00</td>\n",
       "      <td>26708.00</td>\n",
       "      <td>26318.00</td>\n",
       "      <td>...</td>\n",
       "      <td>26286.00</td>\n",
       "      <td>26318.0</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>6.07</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-11</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>56238.0</td>\n",
       "      <td>1.590998e+10</td>\n",
       "      <td>26300.00</td>\n",
       "      <td>26008.00</td>\n",
       "      <td>27144.00</td>\n",
       "      <td>26386.00</td>\n",
       "      <td>...</td>\n",
       "      <td>26614.00</td>\n",
       "      <td>26386.0</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-0.96</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-08</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>38244.0</td>\n",
       "      <td>2.587567e+09</td>\n",
       "      <td>126.00</td>\n",
       "      <td>124.10</td>\n",
       "      <td>128.80</td>\n",
       "      <td>127.22</td>\n",
       "      <td>...</td>\n",
       "      <td>125.90</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.658767e+09</td>\n",
       "      <td>1.658767e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>2.23</td>\n",
       "      <td>2025-08-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-11</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>67387.0</td>\n",
       "      <td>3.967016e+09</td>\n",
       "      <td>130.00</td>\n",
       "      <td>126.90</td>\n",
       "      <td>130.96</td>\n",
       "      <td>128.38</td>\n",
       "      <td>...</td>\n",
       "      <td>129.08</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.372312e+09</td>\n",
       "      <td>2.372312e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-0.16</td>\n",
       "      <td>2025-08-11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-12</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>32483.0</td>\n",
       "      <td>1.542892e+09</td>\n",
       "      <td>128.20</td>\n",
       "      <td>126.54</td>\n",
       "      <td>128.68</td>\n",
       "      <td>128.50</td>\n",
       "      <td>...</td>\n",
       "      <td>127.44</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.226032e+09</td>\n",
       "      <td>1.226032e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>0.08</td>\n",
       "      <td>2025-08-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-13</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>26197.0</td>\n",
       "      <td>1.711504e+09</td>\n",
       "      <td>128.32</td>\n",
       "      <td>127.58</td>\n",
       "      <td>129.50</td>\n",
       "      <td>128.98</td>\n",
       "      <td>...</td>\n",
       "      <td>128.52</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.248184e+09</td>\n",
       "      <td>1.248184e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>0.00</td>\n",
       "      <td>2025-08-13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-14</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>40206.0</td>\n",
       "      <td>3.309582e+09</td>\n",
       "      <td>127.72</td>\n",
       "      <td>127.08</td>\n",
       "      <td>131.64</td>\n",
       "      <td>131.10</td>\n",
       "      <td>...</td>\n",
       "      <td>129.76</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.537859e+09</td>\n",
       "      <td>2.537859e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>2.54</td>\n",
       "      <td>2025-08-14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1173 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   BOARDID   TRADEDATE  SHORTNAME SECID  NUMTRADES         VALUE      OPEN  \\\n",
       "0     TQBR  2021-01-04  ГМКНорНик  GMKN    31293.0  6.488472e+09  23820.00   \n",
       "1     TQBR  2021-01-05  ГМКНорНик  GMKN    23256.0  5.184019e+09  24304.00   \n",
       "2     TQBR  2021-01-06  ГМКНорНик  GMKN    29709.0  5.951988e+09  24660.00   \n",
       "3     TQBR  2021-01-08  ГМКНорНик  GMKN    67631.0  1.635197e+10  25608.00   \n",
       "4     TQBR  2021-01-11  ГМКНорНик  GMKN    56238.0  1.590998e+10  26300.00   \n",
       "..     ...         ...        ...   ...        ...           ...       ...   \n",
       "57    TQBR  2025-08-08  ГМКНорНик  GMKN    38244.0  2.587567e+09    126.00   \n",
       "58    TQBR  2025-08-11  ГМКНорНик  GMKN    67387.0  3.967016e+09    130.00   \n",
       "59    TQBR  2025-08-12  ГМКНорНик  GMKN    32483.0  1.542892e+09    128.20   \n",
       "60    TQBR  2025-08-13  ГМКНорНик  GMKN    26197.0  1.711504e+09    128.32   \n",
       "61    TQBR  2025-08-14  ГМКНорНик  GMKN    40206.0  3.309582e+09    127.72   \n",
       "\n",
       "         LOW      HIGH  LEGALCLOSEPRICE  ...  MARKETPRICE3  ADMITTEDQUOTE  \\\n",
       "0   23812.00  24584.00         24550.00  ...      24284.00        24550.0   \n",
       "1   24116.00  24698.00         24538.00  ...      24492.00        24538.0   \n",
       "2   24590.00  25088.00         25002.00  ...      24856.00        25002.0   \n",
       "3   25552.00  26708.00         26318.00  ...      26286.00        26318.0   \n",
       "4   26008.00  27144.00         26386.00  ...      26614.00        26386.0   \n",
       "..       ...       ...              ...  ...           ...            ...   \n",
       "57    124.10    128.80           127.22  ...        125.90            NaN   \n",
       "58    126.90    130.96           128.38  ...        129.08            NaN   \n",
       "59    126.54    128.68           128.50  ...        127.44            NaN   \n",
       "60    127.58    129.50           128.98  ...        128.52            NaN   \n",
       "61    127.08    131.64           131.10  ...        129.76            NaN   \n",
       "\n",
       "       MP2VALTRD  MARKETPRICE3TRADESVALUE  ADMITTEDVALUE  WAVAL  \\\n",
       "0   5.598104e+09             5.598104e+09   5.598104e+09    0.0   \n",
       "1   4.639079e+09             4.639079e+09   4.639079e+09    0.0   \n",
       "2   5.308193e+09             5.308193e+09   5.308193e+09    0.0   \n",
       "3   1.517160e+10             1.517160e+10   1.517160e+10    0.0   \n",
       "4   1.540545e+10             1.540545e+10   1.540545e+10    0.0   \n",
       "..           ...                      ...            ...    ...   \n",
       "57  1.658767e+09             1.658767e+09            NaN    0.0   \n",
       "58  2.372312e+09             2.372312e+09            NaN    0.0   \n",
       "59  1.226032e+09             1.226032e+09            NaN    0.0   \n",
       "60  1.248184e+09             1.248184e+09            NaN    0.0   \n",
       "61  2.537859e+09             2.537859e+09            NaN    0.0   \n",
       "\n",
       "    TRADINGSESSION  CURRENCYID  TRENDCLSPR  TRADE_SESSION_DATE  \n",
       "0              3.0         SUR        2.67                 NaN  \n",
       "1              3.0         SUR        1.49                 NaN  \n",
       "2              3.0         SUR        1.41                 NaN  \n",
       "3              3.0         SUR        6.07                 NaN  \n",
       "4              3.0         SUR       -0.96                 NaN  \n",
       "..             ...         ...         ...                 ...  \n",
       "57             3.0         SUR        2.23          2025-08-08  \n",
       "58             3.0         SUR       -0.16          2025-08-11  \n",
       "59             3.0         SUR        0.08          2025-08-12  \n",
       "60             3.0         SUR        0.00          2025-08-13  \n",
       "61             3.0         SUR        2.54          2025-08-14  \n",
       "\n",
       "[1173 rows x 24 columns]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['SECID'] == 'GMKN']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93f0e48e",
   "metadata": {},
   "source": [
    "Но на самом деле можно немного проще, потому что pandas поддерживает чтение из ссылок. Requests до этого мы воспользовались для понимания общего случая."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "355c5f1f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def parse_moex(date_start, date_finish, ticker):\n",
    "    agg_data = pd.DataFrame()\n",
    "    finish = date_finish.strftime('%Y') + '-' + date_finish.strftime('%m') + '-' + date_finish.strftime('%d')\n",
    "    while date_start < date_finish:\n",
    "        start = date_start.strftime('%Y') + '-' + date_start.strftime('%m') + '-' + date_start.strftime('%d')\n",
    "        url = f'http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/TQBR/securities/{ticker}.csv?from={start}&till={finish}'\n",
    "        data = pd.read_csv(url, sep=';', header=1, encoding = \"WINDOWS-1251\").reset_index(drop=True).dropna(subset='SECID')\n",
    "        agg_data = pd.concat([agg_data, data])\n",
    "        date_start += datetime.timedelta(days=100)\n",
    "    return agg_data.drop_duplicates()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "c8da7b36",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GMKN parsed\n",
      "GAZP parsed\n",
      "LKOH parsed\n",
      "TATN parsed\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BOARDID</th>\n",
       "      <th>TRADEDATE</th>\n",
       "      <th>SHORTNAME</th>\n",
       "      <th>SECID</th>\n",
       "      <th>NUMTRADES</th>\n",
       "      <th>VALUE</th>\n",
       "      <th>OPEN</th>\n",
       "      <th>LOW</th>\n",
       "      <th>HIGH</th>\n",
       "      <th>LEGALCLOSEPRICE</th>\n",
       "      <th>...</th>\n",
       "      <th>MARKETPRICE3</th>\n",
       "      <th>ADMITTEDQUOTE</th>\n",
       "      <th>MP2VALTRD</th>\n",
       "      <th>MARKETPRICE3TRADESVALUE</th>\n",
       "      <th>ADMITTEDVALUE</th>\n",
       "      <th>WAVAL</th>\n",
       "      <th>TRADINGSESSION</th>\n",
       "      <th>CURRENCYID</th>\n",
       "      <th>TRENDCLSPR</th>\n",
       "      <th>TRADE_SESSION_DATE</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-04</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>31293.0</td>\n",
       "      <td>6.488472e+09</td>\n",
       "      <td>23820.0</td>\n",
       "      <td>23812.0</td>\n",
       "      <td>24584.0</td>\n",
       "      <td>24550.0</td>\n",
       "      <td>...</td>\n",
       "      <td>24284.0</td>\n",
       "      <td>24550.0</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>5.598104e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>2.67</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-05</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>23256.0</td>\n",
       "      <td>5.184019e+09</td>\n",
       "      <td>24304.0</td>\n",
       "      <td>24116.0</td>\n",
       "      <td>24698.0</td>\n",
       "      <td>24538.0</td>\n",
       "      <td>...</td>\n",
       "      <td>24492.0</td>\n",
       "      <td>24538.0</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>4.639079e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.49</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-06</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>29709.0</td>\n",
       "      <td>5.951988e+09</td>\n",
       "      <td>24660.0</td>\n",
       "      <td>24590.0</td>\n",
       "      <td>25088.0</td>\n",
       "      <td>25002.0</td>\n",
       "      <td>...</td>\n",
       "      <td>24856.0</td>\n",
       "      <td>25002.0</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>5.308193e+09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.41</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-08</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>67631.0</td>\n",
       "      <td>1.635197e+10</td>\n",
       "      <td>25608.0</td>\n",
       "      <td>25552.0</td>\n",
       "      <td>26708.0</td>\n",
       "      <td>26318.0</td>\n",
       "      <td>...</td>\n",
       "      <td>26286.0</td>\n",
       "      <td>26318.0</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>1.517160e+10</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>6.07</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2021-01-11</td>\n",
       "      <td>ГМКНорНик</td>\n",
       "      <td>GMKN</td>\n",
       "      <td>56238.0</td>\n",
       "      <td>1.590998e+10</td>\n",
       "      <td>26300.0</td>\n",
       "      <td>26008.0</td>\n",
       "      <td>27144.0</td>\n",
       "      <td>26386.0</td>\n",
       "      <td>...</td>\n",
       "      <td>26614.0</td>\n",
       "      <td>26386.0</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>1.540545e+10</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-0.96</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-08</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>43083.0</td>\n",
       "      <td>2.751028e+09</td>\n",
       "      <td>703.4</td>\n",
       "      <td>695.2</td>\n",
       "      <td>731.4</td>\n",
       "      <td>715.2</td>\n",
       "      <td>...</td>\n",
       "      <td>707.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.207840e+09</td>\n",
       "      <td>2.207840e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>3.66</td>\n",
       "      <td>2025-08-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-11</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>51581.0</td>\n",
       "      <td>2.554129e+09</td>\n",
       "      <td>729.0</td>\n",
       "      <td>718.1</td>\n",
       "      <td>746.0</td>\n",
       "      <td>721.6</td>\n",
       "      <td>...</td>\n",
       "      <td>724.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.931356e+09</td>\n",
       "      <td>1.931356e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-1.03</td>\n",
       "      <td>2025-08-11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-12</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>24159.0</td>\n",
       "      <td>1.019088e+09</td>\n",
       "      <td>722.0</td>\n",
       "      <td>717.2</td>\n",
       "      <td>726.9</td>\n",
       "      <td>722.4</td>\n",
       "      <td>...</td>\n",
       "      <td>722.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>9.095617e+08</td>\n",
       "      <td>9.095617e+08</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>0.28</td>\n",
       "      <td>2025-08-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-13</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>33053.0</td>\n",
       "      <td>1.298539e+09</td>\n",
       "      <td>723.0</td>\n",
       "      <td>710.1</td>\n",
       "      <td>726.3</td>\n",
       "      <td>711.4</td>\n",
       "      <td>...</td>\n",
       "      <td>718.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.105441e+09</td>\n",
       "      <td>1.105441e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>-1.48</td>\n",
       "      <td>2025-08-13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>TQBR</td>\n",
       "      <td>2025-08-14</td>\n",
       "      <td>Татнфт 3ао</td>\n",
       "      <td>TATN</td>\n",
       "      <td>31551.0</td>\n",
       "      <td>1.373282e+09</td>\n",
       "      <td>712.5</td>\n",
       "      <td>708.6</td>\n",
       "      <td>724.0</td>\n",
       "      <td>718.4</td>\n",
       "      <td>...</td>\n",
       "      <td>716.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.114595e+09</td>\n",
       "      <td>1.114595e+09</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>SUR</td>\n",
       "      <td>1.28</td>\n",
       "      <td>2025-08-14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4692 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   BOARDID   TRADEDATE   SHORTNAME SECID  NUMTRADES         VALUE     OPEN  \\\n",
       "0     TQBR  2021-01-04   ГМКНорНик  GMKN    31293.0  6.488472e+09  23820.0   \n",
       "1     TQBR  2021-01-05   ГМКНорНик  GMKN    23256.0  5.184019e+09  24304.0   \n",
       "2     TQBR  2021-01-06   ГМКНорНик  GMKN    29709.0  5.951988e+09  24660.0   \n",
       "3     TQBR  2021-01-08   ГМКНорНик  GMKN    67631.0  1.635197e+10  25608.0   \n",
       "4     TQBR  2021-01-11   ГМКНорНик  GMKN    56238.0  1.590998e+10  26300.0   \n",
       "..     ...         ...         ...   ...        ...           ...      ...   \n",
       "57    TQBR  2025-08-08  Татнфт 3ао  TATN    43083.0  2.751028e+09    703.4   \n",
       "58    TQBR  2025-08-11  Татнфт 3ао  TATN    51581.0  2.554129e+09    729.0   \n",
       "59    TQBR  2025-08-12  Татнфт 3ао  TATN    24159.0  1.019088e+09    722.0   \n",
       "60    TQBR  2025-08-13  Татнфт 3ао  TATN    33053.0  1.298539e+09    723.0   \n",
       "61    TQBR  2025-08-14  Татнфт 3ао  TATN    31551.0  1.373282e+09    712.5   \n",
       "\n",
       "        LOW     HIGH  LEGALCLOSEPRICE  ...  MARKETPRICE3  ADMITTEDQUOTE  \\\n",
       "0   23812.0  24584.0          24550.0  ...       24284.0        24550.0   \n",
       "1   24116.0  24698.0          24538.0  ...       24492.0        24538.0   \n",
       "2   24590.0  25088.0          25002.0  ...       24856.0        25002.0   \n",
       "3   25552.0  26708.0          26318.0  ...       26286.0        26318.0   \n",
       "4   26008.0  27144.0          26386.0  ...       26614.0        26386.0   \n",
       "..      ...      ...              ...  ...           ...            ...   \n",
       "57    695.2    731.4            715.2  ...         707.2            NaN   \n",
       "58    718.1    746.0            721.6  ...         724.0            NaN   \n",
       "59    717.2    726.9            722.4  ...         722.1            NaN   \n",
       "60    710.1    726.3            711.4  ...         718.2            NaN   \n",
       "61    708.6    724.0            718.4  ...         716.5            NaN   \n",
       "\n",
       "       MP2VALTRD  MARKETPRICE3TRADESVALUE  ADMITTEDVALUE  WAVAL  \\\n",
       "0   5.598104e+09             5.598104e+09   5.598104e+09    0.0   \n",
       "1   4.639079e+09             4.639079e+09   4.639079e+09    0.0   \n",
       "2   5.308193e+09             5.308193e+09   5.308193e+09    0.0   \n",
       "3   1.517160e+10             1.517160e+10   1.517160e+10    0.0   \n",
       "4   1.540545e+10             1.540545e+10   1.540545e+10    0.0   \n",
       "..           ...                      ...            ...    ...   \n",
       "57  2.207840e+09             2.207840e+09            NaN    0.0   \n",
       "58  1.931356e+09             1.931356e+09            NaN    0.0   \n",
       "59  9.095617e+08             9.095617e+08            NaN    0.0   \n",
       "60  1.105441e+09             1.105441e+09            NaN    0.0   \n",
       "61  1.114595e+09             1.114595e+09            NaN    0.0   \n",
       "\n",
       "    TRADINGSESSION  CURRENCYID  TRENDCLSPR  TRADE_SESSION_DATE  \n",
       "0              3.0         SUR        2.67                 NaN  \n",
       "1              3.0         SUR        1.49                 NaN  \n",
       "2              3.0         SUR        1.41                 NaN  \n",
       "3              3.0         SUR        6.07                 NaN  \n",
       "4              3.0         SUR       -0.96                 NaN  \n",
       "..             ...         ...         ...                 ...  \n",
       "57             3.0         SUR        3.66          2025-08-08  \n",
       "58             3.0         SUR       -1.03          2025-08-11  \n",
       "59             3.0         SUR        0.28          2025-08-12  \n",
       "60             3.0         SUR       -1.48          2025-08-13  \n",
       "61             3.0         SUR        1.28          2025-08-14  \n",
       "\n",
       "[4692 rows x 24 columns]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = parse_all_tickers(tickers, parse_moex)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec6dea97",
   "metadata": {},
   "source": [
    "Если вдруг есть подписка на MOEX, то придется залогиниться через создание сессии. В таком случае воспользоваться pandas нельзя.\n",
    "\n",
    "В таком случае код будет выглядеть примерно так:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "231869bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "def parse_moex_requests_session(session: requests.Session, date_start, date_finish, ticker):\n",
    "    agg_data = pd.DataFrame()\n",
    "    finish = date_finish.strftime('%Y') + '-' + date_finish.strftime('%m') + '-' + date_finish.strftime('%d')\n",
    "    while date_start < date_finish:\n",
    "        start = date_start.strftime('%Y') + '-' + date_start.strftime('%m') + '-' + date_start.strftime('%d')\n",
    "        # Задаем ссылку\n",
    "        url = f'http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/TQBR/securities/{ticker}.csv?from={start}&till={finish}'\n",
    "        # Делаем get запрос через requests аргумент stream=True нужен, чтобы вести скачивание\n",
    "        result = io.BytesIO(session.get(url, stream=True).content)\n",
    "        # Считываем таблицу\n",
    "        data = pd.read_csv(result, sep=';', header=1, encoding=\"WINDOWS-1251\").reset_index(drop=True).dropna(subset='SECID')\n",
    "        agg_data = pd.concat([agg_data, data])\n",
    "        # Обновляем счетчик дней\n",
    "        date_start += datetime.timedelta(days=100)\n",
    "    return agg_data.drop_duplicates()\n",
    "\n",
    "# Логин и пароль. Ключи буквально такие у Мосбиржи\n",
    "payload = {\n",
    "    'user[credentials]': 'login',\n",
    "    'user[password]': 'password'\n",
    "    }\n",
    "\n",
    "proxy_dict = {'http': 'http://'} # Прокси, чтобы подключаться из организации, так как вряд ли на личный аккаунт купите подписку (она дорогая)\n",
    "\n",
    "# Делаем сессию, чтобы можно было один раз залогиниться и из нее слать запросы\n",
    "with requests.Session() as s:\n",
    "    # Делаем post запрос, залогиниться\n",
    "    p = s.post('https://passport.moex.com/login/?return_to=https://www.moex.com%2fs1631', # Настоящая ссылка для того, чтобы логиниться\n",
    "                data=payload,\n",
    "                headers={'Connection':'close'},\n",
    "                proxies=proxy_dict)\n",
    "    \n",
    "    agg_df = parse_all_tickers(tickers, parse_moex_requests_session)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "712e7b56",
   "metadata": {},
   "source": [
    "# Парсинг скрытого API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "6197aced",
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "a3a9c4be",
   "metadata": {},
   "outputs": [],
   "source": [
    "result = requests.get('https://api.vedomosti.ru/v2/lists/all-story-list-top')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "30cc320c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Response [200]>"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Успешный ответ от сервера\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "ad77f044",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'id': 140737488356568,\n",
       " 'slug': 'all-story-list-top',\n",
       " 'description': None,\n",
       " 'documents': [{'archived': False,\n",
       "   'background_color': 'dark',\n",
       "   'categories': {'kinds': {'path': 'kinds.story_page',\n",
       "     'slug': 'story_page',\n",
       "     'title': 'Страница сюжета',\n",
       "     'position': 90,\n",
       "     'subscribable': False},\n",
       "    'story': [{'path': 'story.editorschoice',\n",
       "      'slug': 'editorschoice',\n",
       "      'title': 'Выбор редакции',\n",
       "      'position': 2690,\n",
       "      'subscribable': False}],\n",
       "    'domains': {'path': 'domains.vedomosti_ru',\n",
       "     'slug': 'vedomosti.ru',\n",
       "     'title': 'vedomosti.ru',\n",
       "     'position': 0,\n",
       "     'subscribable': False},\n",
       "    'project': {'path': 'project.vedomosti',\n",
       "     'slug': 'vedomosti',\n",
       "     'title': 'Ведомости',\n",
       "     'position': 10,\n",
       "     'subscribable': False}},\n",
       "   'clickable': False,\n",
       "   'company_title': '',\n",
       "   'company_url': '',\n",
       "   'disclaimer': '',\n",
       "   'editor_id': 0,\n",
       "   'favorite': False,\n",
       "   'h1': None,\n",
       "   'hide_in_app': False,\n",
       "   'hide_mobile_partner_announcement_logo': False,\n",
       "   'hide_mobile_partner_logo': False,\n",
       "   'hide_partner_announcement_logo': False,\n",
       "   'hide_partner_logo': False,\n",
       "   'id': 140737489420429,\n",
       "   'image': {'small': {'url': '/image/2026/2p/11xeul/small-1d5k.jpg',\n",
       "     'size': 8081,\n",
       "     'width': 168,\n",
       "     'height': 95,\n",
       "     'filename': 'small-1d5k.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/small-1d5k.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'small-1d5k.webp'},\n",
       "    'level1': {'url': '/image/2026/2p/11xeul/level1-1d5l.jpg',\n",
       "     'size': 26941,\n",
       "     'width': 369,\n",
       "     'height': 208,\n",
       "     'filename': 'level1-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/level1-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'level1-1d5l.webp'},\n",
       "    'level2': {'url': '/image/2026/2p/11xeul/level2-1d5k.jpg',\n",
       "     'size': 16166,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'level2-1d5k.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/level2-1d5k.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'level2-1d5k.webp'},\n",
       "    'normal': {'url': '/image/2026/2p/11xeul/normal-1d5l.jpg',\n",
       "     'size': 57139,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'normal-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/normal-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'normal-1d5l.webp'},\n",
       "    'default': {'url': '/image/2026/2p/11xeul/default-1d5l.jpg',\n",
       "     'size': 57139,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'default-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/default-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'default-1d5l.webp'},\n",
       "    '_preview': {'url': '/image/2026/2p/11xeul/_preview-1d5l.jpg',\n",
       "     'size': 5267,\n",
       "     'width': 121,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/_preview-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': '_preview-1d5l.webp'},\n",
       "    'original': {'url': '/image/2026/2p/11xeul/original-1d5k.jpg',\n",
       "     'size': 232173,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'original-1d5k.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/original-1d5k.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'original-1d5k.webp'},\n",
       "    'thumbnail': {'url': '/image/2026/2p/11xeul/thumbnail-1d5l.jpg',\n",
       "     'size': 2668,\n",
       "     'width': 75,\n",
       "     'height': 42,\n",
       "     'filename': 'thumbnail-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/thumbnail-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'thumbnail-1d5l.webp'},\n",
       "    'fullscreen': {'url': '/image/2026/2p/11xeul/fullscreen-1d5k.jpg',\n",
       "     'size': 232173,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'fullscreen-1d5k.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/fullscreen-1d5k.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'fullscreen-1d5k.webp'},\n",
       "    'mobile_low': {'url': '/image/2026/2p/11xeul/mobile_low-1d5l.jpg',\n",
       "     'size': 69251,\n",
       "     'width': 640,\n",
       "     'height': 360,\n",
       "     'filename': 'mobile_low-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/mobile_low-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'mobile_low-1d5l.webp'},\n",
       "    'mobile_high': {'url': '/image/2026/2p/11xeul/mobile_high-1d5l.jpg',\n",
       "     'size': 153240,\n",
       "     'width': 960,\n",
       "     'height': 540,\n",
       "     'filename': 'mobile_high-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/mobile_high-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'mobile_high-1d5l.webp'},\n",
       "    'thumbnail_low': {'url': '/image/2026/2p/11xeul/thumbnail_low-1d5k.jpg',\n",
       "     'size': 9130,\n",
       "     'width': 180,\n",
       "     'height': 101,\n",
       "     'filename': 'thumbnail_low-1d5k.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/thumbnail_low-1d5k.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'thumbnail_low-1d5k.webp'},\n",
       "    'thumbnail_high': {'url': '/image/2026/2p/11xeul/thumbnail_high-1d5l.jpg',\n",
       "     'size': 16166,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'thumbnail_high-1d5l.jpg',\n",
       "     'url_webp': '/image/2026/2p/11xeul/thumbnail_high-1d5l.webp',\n",
       "     'attachment_id': 140737489280147,\n",
       "     'filename_webp': 'thumbnail_high-1d5l.webp'}},\n",
       "   'last_published_at': 1778585482,\n",
       "   'links': {},\n",
       "   'list': {'id': 140737488357794,\n",
       "    'slug': 'story-editorschoice-top',\n",
       "    'seo_title': None,\n",
       "    'seo_keywords': None,\n",
       "    'seo_description': None},\n",
       "   'main_token': '',\n",
       "   'narrow': {'_preview': {'url': '/image/2026/2p/zbq37/_preview-19s5.jpg',\n",
       "     'size': 4626,\n",
       "     'width': 121,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-19s5.jpg',\n",
       "     'url_webp': '/image/2026/2p/zbq37/_preview-19s5.webp',\n",
       "     'attachment_id': 140737489280125,\n",
       "     'filename_webp': '_preview-19s5.webp'},\n",
       "    'original': {'url': '/image/2026/2p/zbq37/original-19s5.jpg',\n",
       "     'size': 219301,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'original-19s5.jpg',\n",
       "     'url_webp': '/image/2026/2p/zbq37/original-19s5.webp',\n",
       "     'attachment_id': 140737489280125,\n",
       "     'filename_webp': 'original-19s5.webp'}},\n",
       "   'partner_logo_text': '',\n",
       "   'partner_url': '',\n",
       "   'publish_delay_datetime': None,\n",
       "   'publish_delay_set': False,\n",
       "   'published_at': '2026-05-12T14:31:22.266+03:00',\n",
       "   'show_news': False,\n",
       "   'slider': {'default': {'url': '/image/2026/2p/zaky3/default-19qo.jpg',\n",
       "     'size': 117756,\n",
       "     'width': 1200,\n",
       "     'height': 326,\n",
       "     'filename': 'default-19qo.jpg',\n",
       "     'url_webp': '/image/2026/2p/zaky3/default-19qo.webp',\n",
       "     'attachment_id': 140737489280123,\n",
       "     'filename_webp': 'default-19qo.webp'},\n",
       "    '_preview': {'url': '/image/2026/2p/zaky3/_preview-19qo.jpg',\n",
       "     'size': 8571,\n",
       "     'width': 250,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-19qo.jpg',\n",
       "     'url_webp': '/image/2026/2p/zaky3/_preview-19qo.webp',\n",
       "     'attachment_id': 140737489280123,\n",
       "     'filename_webp': '_preview-19qo.webp'},\n",
       "    'original': {'url': '/image/2026/2p/zaky3/original-19qo.jpg',\n",
       "     'size': 123483,\n",
       "     'width': 1252,\n",
       "     'height': 340,\n",
       "     'filename': 'original-19qo.jpg',\n",
       "     'url_webp': '/image/2026/2p/zaky3/original-19qo.webp',\n",
       "     'attachment_id': 140737489280123,\n",
       "     'filename_webp': 'original-19qo.webp'}},\n",
       "   'story_page_token': '',\n",
       "   'subtitle': 'Лучшие материалы «Ведомостей»',\n",
       "   'taggings': [],\n",
       "   'title': 'Выбор редакции',\n",
       "   'url': 'vedomosti.ru/story/editorschoice'},\n",
       "  {'archived': False,\n",
       "   'background_color': 'dark',\n",
       "   'categories': {'kinds': {'path': 'kinds.story_page',\n",
       "     'slug': 'story_page',\n",
       "     'title': 'Страница сюжета',\n",
       "     'position': 90,\n",
       "     'subscribable': False},\n",
       "    'story': [{'path': 'story.perelomnyj1991',\n",
       "      'slug': 'perelomnyj1991',\n",
       "      'title': 'Переломный 1991-й: как СССР прошел точку невозврата',\n",
       "      'position': 2780,\n",
       "      'subscribable': False}],\n",
       "    'domains': {'path': 'domains.vedomosti_ru',\n",
       "     'slug': 'vedomosti.ru',\n",
       "     'title': 'vedomosti.ru',\n",
       "     'position': 0,\n",
       "     'subscribable': False},\n",
       "    'project': {'path': 'project.vedomosti',\n",
       "     'slug': 'vedomosti',\n",
       "     'title': 'Ведомости',\n",
       "     'position': 10,\n",
       "     'subscribable': False}},\n",
       "   'clickable': False,\n",
       "   'company_title': '',\n",
       "   'company_url': '',\n",
       "   'disclaimer': '',\n",
       "   'editor_id': 0,\n",
       "   'favorite': False,\n",
       "   'h1': None,\n",
       "   'hide_in_app': False,\n",
       "   'hide_mobile_partner_announcement_logo': False,\n",
       "   'hide_mobile_partner_logo': False,\n",
       "   'hide_partner_announcement_logo': False,\n",
       "   'hide_partner_logo': False,\n",
       "   'id': 140737489452111,\n",
       "   'image': {'small': {'url': '/image/2026/6a/153j2k/small-1h9h.jpg',\n",
       "     'size': 11428,\n",
       "     'width': 168,\n",
       "     'height': 95,\n",
       "     'filename': 'small-1h9h.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/small-1h9h.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'small-1h9h.webp'},\n",
       "    'level1': {'url': '/image/2026/6a/153j2k/level1-1h9g.jpg',\n",
       "     'size': 45223,\n",
       "     'width': 369,\n",
       "     'height': 208,\n",
       "     'filename': 'level1-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/level1-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'level1-1h9g.webp'},\n",
       "    'level2': {'url': '/image/2026/6a/153j2k/level2-1h9g.jpg',\n",
       "     'size': 25386,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'level2-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/level2-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'level2-1h9g.webp'},\n",
       "    'normal': {'url': '/image/2026/6a/153j2k/normal-1h9g.jpg',\n",
       "     'size': 115656,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'normal-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/normal-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'normal-1h9g.webp'},\n",
       "    'default': {'url': '/image/2026/6a/153j2k/default-1h9g.jpg',\n",
       "     'size': 115656,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'default-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/default-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'default-1h9g.webp'},\n",
       "    '_preview': {'url': '/image/2026/6a/153j2k/_preview-1h9g.jpg',\n",
       "     'size': 7025,\n",
       "     'width': 121,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/_preview-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': '_preview-1h9g.webp'},\n",
       "    'original': {'url': '/image/2026/6a/153j2k/original-1h9h.jpg',\n",
       "     'size': 540989,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'original-1h9h.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/original-1h9h.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'original-1h9h.webp'},\n",
       "    'thumbnail': {'url': '/image/2026/6a/153j2k/thumbnail-1h9g.jpg',\n",
       "     'size': 3427,\n",
       "     'width': 75,\n",
       "     'height': 42,\n",
       "     'filename': 'thumbnail-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/thumbnail-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'thumbnail-1h9g.webp'},\n",
       "    'fullscreen': {'url': '/image/2026/6a/153j2k/fullscreen-1h9h.jpg',\n",
       "     'size': 540989,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'fullscreen-1h9h.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/fullscreen-1h9h.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'fullscreen-1h9h.webp'},\n",
       "    'mobile_low': {'url': '/image/2026/6a/153j2k/mobile_low-1h9h.jpg',\n",
       "     'size': 147953,\n",
       "     'width': 640,\n",
       "     'height': 360,\n",
       "     'filename': 'mobile_low-1h9h.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/mobile_low-1h9h.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'mobile_low-1h9h.webp'},\n",
       "    'mobile_high': {'url': '/image/2026/6a/153j2k/mobile_high-1h9g.jpg',\n",
       "     'size': 370188,\n",
       "     'width': 960,\n",
       "     'height': 540,\n",
       "     'filename': 'mobile_high-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/mobile_high-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'mobile_high-1h9g.webp'},\n",
       "    'thumbnail_low': {'url': '/image/2026/6a/153j2k/thumbnail_low-1h9h.jpg',\n",
       "     'size': 13034,\n",
       "     'width': 180,\n",
       "     'height': 101,\n",
       "     'filename': 'thumbnail_low-1h9h.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/thumbnail_low-1h9h.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'thumbnail_low-1h9h.webp'},\n",
       "    'thumbnail_high': {'url': '/image/2026/6a/153j2k/thumbnail_high-1h9g.jpg',\n",
       "     'size': 25386,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'thumbnail_high-1h9g.jpg',\n",
       "     'url_webp': '/image/2026/6a/153j2k/thumbnail_high-1h9g.webp',\n",
       "     'attachment_id': 140737489314768,\n",
       "     'filename_webp': 'thumbnail_high-1h9g.webp'}},\n",
       "   'last_published_at': 1787259427,\n",
       "   'links': {},\n",
       "   'list': {'id': 140737488357822,\n",
       "    'slug': 'story-perelomnyj1991-top',\n",
       "    'seo_title': None,\n",
       "    'seo_keywords': None,\n",
       "    'seo_description': None},\n",
       "   'main_token': '',\n",
       "   'partner_logo_text': '',\n",
       "   'partner_url': '',\n",
       "   'publish_delay_datetime': None,\n",
       "   'publish_delay_set': False,\n",
       "   'published_at': '2026-08-15T20:41:58.279+03:00',\n",
       "   'show_news': False,\n",
       "   'slider': {'default': {'url': '/image/2026/6a/1533t7/default-1h8x.jpg',\n",
       "     'size': 323651,\n",
       "     'width': 1200,\n",
       "     'height': 326,\n",
       "     'filename': 'default-1h8x.jpg',\n",
       "     'url_webp': '/image/2026/6a/1533t7/default-1h8x.webp',\n",
       "     'attachment_id': 140737489314767,\n",
       "     'filename_webp': 'default-1h8x.webp'},\n",
       "    '_preview': {'url': '/image/2026/6a/1533t7/_preview-1h8x.jpg',\n",
       "     'size': 13731,\n",
       "     'width': 250,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1h8x.jpg',\n",
       "     'url_webp': '/image/2026/6a/1533t7/_preview-1h8x.webp',\n",
       "     'attachment_id': 140737489314767,\n",
       "     'filename_webp': '_preview-1h8x.webp'},\n",
       "    'original': {'url': '/image/2026/6a/1533t7/original-1h8x.jpg',\n",
       "     'size': 330979,\n",
       "     'width': 1252,\n",
       "     'height': 340,\n",
       "     'filename': 'original-1h8x.jpg',\n",
       "     'url_webp': '/image/2026/6a/1533t7/original-1h8x.webp',\n",
       "     'attachment_id': 140737489314767,\n",
       "     'filename_webp': 'original-1h8x.webp'}},\n",
       "   'story_page_token': '',\n",
       "   'subtitle': '19 августа 1991 г. в Москве был сформирован Государственный комитет Чрезвычайного положения, куда вошли вице-президент Советского Союза Геннадий Янаев, председатель КГБ Владимир Крючков, министр обороны Дмитрий Язов, глава МВД Борис Пуго, премьер Валентин Павлов и еще три советских чиновника. Они попытались остановить подписание разработанного президентом Михаилом Горбачевым нового Союзного договора, фактически «переучреждавшего» СССР: силовики справедливо полагали, что за этим последует распад государства. По иронии, августовский путч сам явился той точкой невозврата, которую 35 лет назад прошел коммунистическим строй в России: ГКЧП не решился на штурм Белого дома, на ступеньках которого президент РСФСР Борис Ельцин с танка формировал новую российскую государственность. Что привело к попытке переворота, как прошли эти три дня и почему дальнейшая судьба Союза была предрешена – в сюжете «Ведомостей».',\n",
       "   'taggings': [],\n",
       "   'title': 'Переломный 1991-й: как СССР прошел точку невозврата',\n",
       "   'url': 'vedomosti.ru/story/perelomnyj1991'},\n",
       "  {'archived': False,\n",
       "   'background_color': 'dark',\n",
       "   'categories': {'kinds': {'path': 'kinds.story_page',\n",
       "     'slug': 'story_page',\n",
       "     'title': 'Страница сюжета',\n",
       "     'position': 90,\n",
       "     'subscribable': False},\n",
       "    'story': [{'path': 'story.toplivo',\n",
       "      'slug': 'toplivo',\n",
       "      'title': 'Ситуация на топливном рынке в России',\n",
       "      'position': 2760,\n",
       "      'subscribable': False}],\n",
       "    'domains': {'path': 'domains.vedomosti_ru',\n",
       "     'slug': 'vedomosti.ru',\n",
       "     'title': 'vedomosti.ru',\n",
       "     'position': 0,\n",
       "     'subscribable': False},\n",
       "    'project': {'path': 'project.vedomosti',\n",
       "     'slug': 'vedomosti',\n",
       "     'title': 'Ведомости',\n",
       "     'position': 10,\n",
       "     'subscribable': False}},\n",
       "   'clickable': False,\n",
       "   'company_title': '',\n",
       "   'company_url': '',\n",
       "   'disclaimer': '',\n",
       "   'editor_id': 0,\n",
       "   'favorite': False,\n",
       "   'h1': None,\n",
       "   'hide_in_app': False,\n",
       "   'hide_mobile_partner_announcement_logo': False,\n",
       "   'hide_mobile_partner_logo': False,\n",
       "   'hide_partner_announcement_logo': False,\n",
       "   'hide_partner_logo': False,\n",
       "   'id': 140737489441586,\n",
       "   'image': {'_preview': {'url': '/image/2026/50/xypey/_preview-180m.jpg',\n",
       "     'size': 5079,\n",
       "     'width': 110,\n",
       "     'height': 73,\n",
       "     'filename': '_preview-180m.jpg',\n",
       "     'url_webp': '/image/2026/50/xypey/_preview-180m.webp',\n",
       "     'attachment_id': 140737489302553,\n",
       "     'filename_webp': '_preview-180m.webp'},\n",
       "    'original': {'url': '/image/2026/50/xypey/original-180m.jpg',\n",
       "     'size': 312287,\n",
       "     'width': 1500,\n",
       "     'height': 1000,\n",
       "     'filename': 'original-180m.jpg',\n",
       "     'url_webp': '/image/2026/50/xypey/original-180m.webp',\n",
       "     'attachment_id': 140737489302553,\n",
       "     'filename_webp': 'original-180m.webp'}},\n",
       "   'last_published_at': 1782840508,\n",
       "   'links': {},\n",
       "   'list': {'id': 140737488357815,\n",
       "    'slug': 'story-toplivo-top',\n",
       "    'seo_title': None,\n",
       "    'seo_keywords': None,\n",
       "    'seo_description': None},\n",
       "   'main_token': '',\n",
       "   'partner_logo_text': '',\n",
       "   'partner_url': '',\n",
       "   'publish_delay_datetime': None,\n",
       "   'publish_delay_set': False,\n",
       "   'published_at': '2026-06-30T20:28:28.514+03:00',\n",
       "   'show_news': False,\n",
       "   'slider': {'_preview': {'url': '/image/2026/50/xywta/_preview-180w.jpg',\n",
       "     'size': 9608,\n",
       "     'width': 250,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-180w.jpg',\n",
       "     'url_webp': '/image/2026/50/xywta/_preview-180w.webp',\n",
       "     'attachment_id': 140737489302554,\n",
       "     'filename_webp': '_preview-180w.webp'},\n",
       "    'original': {'url': '/image/2026/50/xywta/original-180x.jpg',\n",
       "     'size': 1,\n",
       "     'width': 5353,\n",
       "     'height': 1454,\n",
       "     'filename': 'original-180x.jpg',\n",
       "     'url_webp': '/image/2026/50/xywta/original-180x.webp',\n",
       "     'attachment_id': 140737489302554,\n",
       "     'filename_webp': 'original-180x.webp'}},\n",
       "   'story_page_token': '',\n",
       "   'subtitle': 'В начале лета на фоне проблем с логистикой в ряде регионов России возник ажиотажный спрос на бензин. Стараясь не допустить дефицита, губернаторы стали вводить ограничение на отпуск горючего в одни руки. 28 июня президент Владимир Путин поручил принять дополнительные меры для обеспечения бесперебойного снабжения внутреннего рынка, особенно – нужд предприятий агропромышленного комплекса. Речь идет о наращивании предложения и сохранении экономически обоснованной цены на горючее. Также глава государства допустил временный запрет на экспорт бензина, авиакеросина и дизельного топлива. Специальный штаб по оперативному мониторингу ситуации работает в круглосуточном режиме. Атмосфера на АЗС, последствия для потребителей и прогнозы экспертов – в сюжете «Ведомостей».',\n",
       "   'taggings': [],\n",
       "   'title': 'Ситуация на топливном рынке: меры, динамика, прогнозы',\n",
       "   'url': 'vedomosti.ru/story/toplivo'},\n",
       "  {'archived': False,\n",
       "   'background_color': 'dark',\n",
       "   'categories': {'kinds': {'path': 'kinds.story_page',\n",
       "     'slug': 'story_page',\n",
       "     'title': 'Страница сюжета',\n",
       "     'position': 90,\n",
       "     'subscribable': False},\n",
       "    'story': [{'path': 'story.duma',\n",
       "      'slug': 'duma',\n",
       "      'title': 'Выборы в Госдуму: каким был и будет российский парламент',\n",
       "      'position': 2700,\n",
       "      'subscribable': False}],\n",
       "    'domains': {'path': 'domains.vedomosti_ru',\n",
       "     'slug': 'vedomosti.ru',\n",
       "     'title': 'vedomosti.ru',\n",
       "     'position': 0,\n",
       "     'subscribable': False},\n",
       "    'project': {'path': 'project.vedomosti',\n",
       "     'slug': 'vedomosti',\n",
       "     'title': 'Ведомости',\n",
       "     'position': 10,\n",
       "     'subscribable': False}},\n",
       "   'clickable': False,\n",
       "   'company_title': '',\n",
       "   'company_url': '',\n",
       "   'disclaimer': '',\n",
       "   'editor_id': 0,\n",
       "   'favorite': False,\n",
       "   'h1': None,\n",
       "   'hide_in_app': False,\n",
       "   'hide_mobile_partner_announcement_logo': False,\n",
       "   'hide_mobile_partner_logo': False,\n",
       "   'hide_partner_announcement_logo': False,\n",
       "   'hide_partner_logo': False,\n",
       "   'id': 140737489427463,\n",
       "   'image': {'small': {'url': '/image/2026/3i/11cie8/small-1cei.jpg',\n",
       "     'size': 11851,\n",
       "     'width': 168,\n",
       "     'height': 95,\n",
       "     'filename': 'small-1cei.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/small-1cei.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'small-1cei.webp'},\n",
       "    'level1': {'url': '/image/2026/3i/11cie8/level1-1ceh.jpg',\n",
       "     'size': 47199,\n",
       "     'width': 369,\n",
       "     'height': 208,\n",
       "     'filename': 'level1-1ceh.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/level1-1ceh.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'level1-1ceh.webp'},\n",
       "    'level2': {'url': '/image/2026/3i/11cie8/level2-1cei.jpg',\n",
       "     'size': 26722,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'level2-1cei.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/level2-1cei.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'level2-1cei.webp'},\n",
       "    'normal': {'url': '/image/2026/3i/11cie8/normal-1ceh.jpg',\n",
       "     'size': 108435,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'normal-1ceh.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/normal-1ceh.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'normal-1ceh.webp'},\n",
       "    'default': {'url': '/image/2026/3i/11cie8/default-1ceh.jpg',\n",
       "     'size': 108435,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'default-1ceh.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/default-1ceh.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'default-1ceh.webp'},\n",
       "    '_preview': {'url': '/image/2026/3i/11cie8/_preview-1ceh.jpg',\n",
       "     'size': 7270,\n",
       "     'width': 121,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1ceh.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/_preview-1ceh.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': '_preview-1ceh.webp'},\n",
       "    'original': {'url': '/image/2026/3i/11cie8/original-1ceh.jpg',\n",
       "     'size': 407780,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'original-1ceh.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/original-1ceh.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'original-1ceh.webp'},\n",
       "    'thumbnail': {'url': '/image/2026/3i/11cie8/thumbnail-1ceh.jpg',\n",
       "     'size': 3549,\n",
       "     'width': 75,\n",
       "     'height': 42,\n",
       "     'filename': 'thumbnail-1ceh.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/thumbnail-1ceh.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'thumbnail-1ceh.webp'},\n",
       "    'fullscreen': {'url': '/image/2026/3i/11cie8/fullscreen-1cei.jpg',\n",
       "     'size': 407780,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'fullscreen-1cei.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/fullscreen-1cei.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'fullscreen-1cei.webp'},\n",
       "    'mobile_low': {'url': '/image/2026/3i/11cie8/mobile_low-1ceh.jpg',\n",
       "     'size': 132134,\n",
       "     'width': 640,\n",
       "     'height': 360,\n",
       "     'filename': 'mobile_low-1ceh.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/mobile_low-1ceh.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'mobile_low-1ceh.webp'},\n",
       "    'mobile_high': {'url': '/image/2026/3i/11cie8/mobile_high-1cei.jpg',\n",
       "     'size': 285582,\n",
       "     'width': 960,\n",
       "     'height': 540,\n",
       "     'filename': 'mobile_high-1cei.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/mobile_high-1cei.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'mobile_high-1cei.webp'},\n",
       "    'thumbnail_low': {'url': '/image/2026/3i/11cie8/thumbnail_low-1cei.jpg',\n",
       "     'size': 13469,\n",
       "     'width': 180,\n",
       "     'height': 101,\n",
       "     'filename': 'thumbnail_low-1cei.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/thumbnail_low-1cei.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'thumbnail_low-1cei.webp'},\n",
       "    'thumbnail_high': {'url': '/image/2026/3i/11cie8/thumbnail_high-1cei.jpg',\n",
       "     'size': 26722,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'thumbnail_high-1cei.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cie8/thumbnail_high-1cei.webp',\n",
       "     'attachment_id': 140737489287971,\n",
       "     'filename_webp': 'thumbnail_high-1cei.webp'}},\n",
       "   'last_published_at': 1778178136,\n",
       "   'links': {},\n",
       "   'list': {'id': 140737488357797,\n",
       "    'slug': 'story-duma-top',\n",
       "    'seo_title': None,\n",
       "    'seo_keywords': None,\n",
       "    'seo_description': None},\n",
       "   'main_token': '',\n",
       "   'narrow': {'_preview': {'url': '/image/2026/3i/11cw7y/_preview-1cez.jpg',\n",
       "     'size': 7270,\n",
       "     'width': 121,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1cez.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cw7y/_preview-1cez.webp',\n",
       "     'attachment_id': 140737489287972,\n",
       "     'filename_webp': '_preview-1cez.webp'},\n",
       "    'original': {'url': '/image/2026/3i/11cw7y/original-1cez.jpg',\n",
       "     'size': 407780,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'original-1cez.jpg',\n",
       "     'url_webp': '/image/2026/3i/11cw7y/original-1cez.webp',\n",
       "     'attachment_id': 140737489287972,\n",
       "     'filename_webp': 'original-1cez.webp'}},\n",
       "   'partner_logo_text': '',\n",
       "   'partner_url': '',\n",
       "   'publish_delay_datetime': None,\n",
       "   'publish_delay_set': False,\n",
       "   'published_at': '2026-05-07T21:22:16.894+03:00',\n",
       "   'show_news': False,\n",
       "   'slider': {'default': {'url': '/image/2026/3i/11d85u/default-1cfe.png',\n",
       "     'size': 614822,\n",
       "     'width': 1200,\n",
       "     'height': 326,\n",
       "     'filename': 'default-1cfe.png',\n",
       "     'url_webp': '/image/2026/3i/11d85u/default-1cfe.webp',\n",
       "     'attachment_id': 140737489287973,\n",
       "     'filename_webp': 'default-1cfe.webp'},\n",
       "    '_preview': {'url': '/image/2026/3i/11d85u/_preview-1cff.png',\n",
       "     'size': 27737,\n",
       "     'width': 250,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1cff.png',\n",
       "     'url_webp': '/image/2026/3i/11d85u/_preview-1cff.webp',\n",
       "     'attachment_id': 140737489287973,\n",
       "     'filename_webp': '_preview-1cff.webp'},\n",
       "    'original': {'url': '/image/2026/3i/11d85u/original-1cff.png',\n",
       "     'size': 742346,\n",
       "     'width': 1252,\n",
       "     'height': 340,\n",
       "     'filename': 'original-1cff.png',\n",
       "     'url_webp': '/image/2026/3i/11d85u/original-1cff.webp',\n",
       "     'attachment_id': 140737489287973,\n",
       "     'filename_webp': 'original-1cff.webp'}},\n",
       "   'story_page_token': '',\n",
       "   'subtitle': '120 лет назад началась история отечественного парламентаризма: 27 апреля (10 мая) 1906 г. в Таврическом дворце впервые собрались депутаты избранного населением законодательного органа России. С тех пор Государственную думу трижды распускали, однажды возрождали и еще семь раз обновляли. В преддверии выборов в IX созыв нижней палаты «Ведомости» рассказывают, как зарождались законодательные традиции России, какую роль Дума играет в современной политической жизни, и, наконец, как она изменится после 20 сентября 2026 г.',\n",
       "   'taggings': [],\n",
       "   'title': 'Выборы в Госдуму: каким был и будет российский парламент',\n",
       "   'url': 'vedomosti.ru/story/duma'},\n",
       "  {'archived': False,\n",
       "   'background_color': 'dark',\n",
       "   'categories': {'kinds': {'path': 'kinds.story_page',\n",
       "     'slug': 'story_page',\n",
       "     'title': 'Страница сюжета',\n",
       "     'position': 90,\n",
       "     'subscribable': False},\n",
       "    'story': [{'path': 'story.IzrailvsIran',\n",
       "      'slug': 'IzrailvsIran',\n",
       "      'title': 'Война на Ближнем Востоке: эскалация между Израилем и Ираном',\n",
       "      'position': 2530,\n",
       "      'subscribable': False}],\n",
       "    'domains': {'path': 'domains.vedomosti_ru',\n",
       "     'slug': 'vedomosti.ru',\n",
       "     'title': 'vedomosti.ru',\n",
       "     'position': 0,\n",
       "     'subscribable': False},\n",
       "    'project': {'path': 'project.vedomosti',\n",
       "     'slug': 'vedomosti',\n",
       "     'title': 'Ведомости',\n",
       "     'position': 10,\n",
       "     'subscribable': False}},\n",
       "   'clickable': False,\n",
       "   'company_title': '',\n",
       "   'company_url': '',\n",
       "   'disclaimer': '',\n",
       "   'editor_id': 0,\n",
       "   'favorite': False,\n",
       "   'h1': '',\n",
       "   'hide_in_app': False,\n",
       "   'hide_mobile_partner_announcement_logo': False,\n",
       "   'hide_mobile_partner_logo': False,\n",
       "   'hide_partner_announcement_logo': False,\n",
       "   'hide_partner_logo': False,\n",
       "   'id': 140737489348855,\n",
       "   'image': {'small': {'url': '/image/2025/4l/tw0pu/small-12qj.jpg',\n",
       "     'size': 10893,\n",
       "     'width': 168,\n",
       "     'height': 95,\n",
       "     'filename': 'small-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/small-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'small-12qj.webp'},\n",
       "    'level1': {'url': '/image/2025/4l/tw0pu/level1-12qj.jpg',\n",
       "     'size': 49770,\n",
       "     'width': 369,\n",
       "     'height': 208,\n",
       "     'filename': 'level1-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/level1-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'level1-12qj.webp'},\n",
       "    'level2': {'url': '/image/2025/4l/tw0pu/level2-12qj.jpg',\n",
       "     'size': 25761,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'level2-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/level2-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'level2-12qj.webp'},\n",
       "    'normal': {'url': '/image/2025/4l/tw0pu/normal-12qj.jpg',\n",
       "     'size': 131891,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'normal-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/normal-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'normal-12qj.webp'},\n",
       "    'default': {'url': '/image/2025/4l/tw0pu/default-12qj.jpg',\n",
       "     'size': 131891,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'default-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/default-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'default-12qj.webp'},\n",
       "    '_preview': {'url': '/image/2025/4l/tw0pu/_preview-12qj.jpg',\n",
       "     'size': 6519,\n",
       "     'width': 121,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/_preview-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': '_preview-12qj.webp'},\n",
       "    'original': {'url': '/image/2025/4l/tw0pu/original-12qj.jpg',\n",
       "     'size': 587798,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'original-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/original-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'original-12qj.webp'},\n",
       "    'thumbnail': {'url': '/image/2025/4l/tw0pu/thumbnail-12qj.jpg',\n",
       "     'size': 3269,\n",
       "     'width': 75,\n",
       "     'height': 42,\n",
       "     'filename': 'thumbnail-12qj.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/thumbnail-12qj.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'thumbnail-12qj.webp'},\n",
       "    'fullscreen': {'url': '/image/2025/4l/tw0pu/fullscreen-12qk.jpg',\n",
       "     'size': 587798,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'fullscreen-12qk.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/fullscreen-12qk.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'fullscreen-12qk.webp'},\n",
       "    'mobile_low': {'url': '/image/2025/4l/tw0pu/mobile_low-12qk.jpg',\n",
       "     'size': 169051,\n",
       "     'width': 640,\n",
       "     'height': 360,\n",
       "     'filename': 'mobile_low-12qk.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/mobile_low-12qk.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'mobile_low-12qk.webp'},\n",
       "    'mobile_high': {'url': '/image/2025/4l/tw0pu/mobile_high-12qi.jpg',\n",
       "     'size': 407688,\n",
       "     'width': 960,\n",
       "     'height': 540,\n",
       "     'filename': 'mobile_high-12qi.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/mobile_high-12qi.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'mobile_high-12qi.webp'},\n",
       "    'thumbnail_low': {'url': '/image/2025/4l/tw0pu/thumbnail_low-12qi.jpg',\n",
       "     'size': 12380,\n",
       "     'width': 180,\n",
       "     'height': 101,\n",
       "     'filename': 'thumbnail_low-12qi.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/thumbnail_low-12qi.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'thumbnail_low-12qi.webp'},\n",
       "    'thumbnail_high': {'url': '/image/2025/4l/tw0pu/thumbnail_high-12qi.jpg',\n",
       "     'size': 25761,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'thumbnail_high-12qi.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw0pu/thumbnail_high-12qi.webp',\n",
       "     'attachment_id': 140737489205707,\n",
       "     'filename_webp': 'thumbnail_high-12qi.webp'}},\n",
       "   'last_published_at': 1772277448,\n",
       "   'links': {},\n",
       "   'list': {'id': 140737488357665,\n",
       "    'slug': 'story-IzrailvsIran-top',\n",
       "    'seo_title': None,\n",
       "    'seo_keywords': None,\n",
       "    'seo_description': None},\n",
       "   'main_token': '',\n",
       "   'partner_logo_text': '',\n",
       "   'partner_url': '',\n",
       "   'publish_delay_datetime': None,\n",
       "   'publish_delay_set': False,\n",
       "   'published_at': '2025-06-14T14:01:38.059+03:00',\n",
       "   'show_news': False,\n",
       "   'slider': {'default': {'url': '/image/2025/4l/tw3dz/default-12qm.jpg',\n",
       "     'size': 325520,\n",
       "     'width': 1200,\n",
       "     'height': 326,\n",
       "     'filename': 'default-12qm.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw3dz/default-12qm.webp',\n",
       "     'attachment_id': 140737489205708,\n",
       "     'filename_webp': 'default-12qm.webp'},\n",
       "    '_preview': {'url': '/image/2025/4l/tw3dz/_preview-12qm.jpg',\n",
       "     'size': 13289,\n",
       "     'width': 250,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-12qm.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw3dz/_preview-12qm.webp',\n",
       "     'attachment_id': 140737489205708,\n",
       "     'filename_webp': '_preview-12qm.webp'},\n",
       "    'original': {'url': '/image/2025/4l/tw3dz/original-12qm.jpg',\n",
       "     'size': 339269,\n",
       "     'width': 1252,\n",
       "     'height': 340,\n",
       "     'filename': 'original-12qm.jpg',\n",
       "     'url_webp': '/image/2025/4l/tw3dz/original-12qm.webp',\n",
       "     'attachment_id': 140737489205708,\n",
       "     'filename_webp': 'original-12qm.webp'}},\n",
       "   'story_page_token': '',\n",
       "   'subtitle': '28 февраля Израиль и США начали военную операцию против Ирана с целью ликвидации «экзистенциальной угрозы», которая исходит со стороны исламской республики. Под удары попали как минимум семь иранских городов, включая столицу Тегеран. Были атакованы президентский дворец, штаб разведки Корпуса стражей исламской революции и другие стратегические объекты. Как заявил президент США Дональд Трамп, операция под названием «Эпическая ярость» (израильская сторона назвала ее «Рычанием льва») призвана не допустить появления у Ирана ядерного оружия, а также дать жителям\\xa0республики\\xa0шанс свергнуть режим аятолл. По предварительным данным, верховный лидер Али Хаменеи в результате атаки не пострадал. В ответ Иран ударил баллистическими ракетами по территории Израиля. Главное о новом витке конфликта на Ближнем Востоке – в сюжете «Ведомостей».',\n",
       "   'taggings': [],\n",
       "   'title': 'Война на Ближнем Востоке: операция Израиля и США против Ирана',\n",
       "   'url': 'vedomosti.ru/story/IzrailvsIran'},\n",
       "  {'archived': False,\n",
       "   'background_color': 'dark',\n",
       "   'categories': {'domains': {'path': 'domains.vedomosti_ru',\n",
       "     'slug': 'vedomosti.ru',\n",
       "     'title': 'vedomosti.ru',\n",
       "     'position': 0,\n",
       "     'subscribable': False},\n",
       "    'project': {'path': 'project.sport',\n",
       "     'slug': 'sport',\n",
       "     'title': 'Спорт',\n",
       "     'position': 60,\n",
       "     'subscribable': False},\n",
       "    'sport_kinds': {'path': 'sport_kinds.sport_story_page',\n",
       "     'slug': 'sport_story_page',\n",
       "     'title': 'Страница сюжета',\n",
       "     'position': 40,\n",
       "     'subscribable': False},\n",
       "    'sport_story': [{'path': 'sport_story.worldcup2026',\n",
       "      'slug': 'worldcup2026',\n",
       "      'title': 'Чемпионат мира-2026: герои, сюжеты, финансы',\n",
       "      'position': 0,\n",
       "      'subscribable': False}]},\n",
       "   'clickable': False,\n",
       "   'company_title': '',\n",
       "   'company_url': '',\n",
       "   'disclaimer': '',\n",
       "   'editor_id': 0,\n",
       "   'favorite': False,\n",
       "   'h1': None,\n",
       "   'hide_in_app': False,\n",
       "   'hide_mobile_partner_announcement_logo': False,\n",
       "   'hide_mobile_partner_logo': False,\n",
       "   'hide_partner_announcement_logo': False,\n",
       "   'hide_partner_logo': False,\n",
       "   'id': 140737489436220,\n",
       "   'image': {'small': {'url': '/image/2026/4f/1bk3wy/small-1pmw.jpg',\n",
       "     'size': 7964,\n",
       "     'width': 168,\n",
       "     'height': 95,\n",
       "     'filename': 'small-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/small-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'small-1pmw.webp'},\n",
       "    'level1': {'url': '/image/2026/4f/1bk3wy/level1-1pmw.jpg',\n",
       "     'size': 24402,\n",
       "     'width': 369,\n",
       "     'height': 208,\n",
       "     'filename': 'level1-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/level1-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'level1-1pmw.webp'},\n",
       "    'level2': {'url': '/image/2026/4f/1bk3wy/level2-1pmw.jpg',\n",
       "     'size': 15699,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'level2-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/level2-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'level2-1pmw.webp'},\n",
       "    'normal': {'url': '/image/2026/4f/1bk3wy/normal-1pmw.jpg',\n",
       "     'size': 46126,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'normal-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/normal-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'normal-1pmw.webp'},\n",
       "    'default': {'url': '/image/2026/4f/1bk3wy/default-1pmw.jpg',\n",
       "     'size': 46126,\n",
       "     'width': 570,\n",
       "     'height': 321,\n",
       "     'filename': 'default-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/default-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'default-1pmw.webp'},\n",
       "    '_preview': {'url': '/image/2026/4f/1bk3wy/_preview-1pmx.jpg',\n",
       "     'size': 5159,\n",
       "     'width': 121,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1pmx.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/_preview-1pmx.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': '_preview-1pmx.webp'},\n",
       "    'original': {'url': '/image/2026/4f/1bk3wy/original-1pmw.jpg',\n",
       "     'size': 122022,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'original-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/original-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'original-1pmw.webp'},\n",
       "    'thumbnail': {'url': '/image/2026/4f/1bk3wy/thumbnail-1pmw.jpg',\n",
       "     'size': 2483,\n",
       "     'width': 75,\n",
       "     'height': 42,\n",
       "     'filename': 'thumbnail-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/thumbnail-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'thumbnail-1pmw.webp'},\n",
       "    'fullscreen': {'url': '/image/2026/4f/1bk3wy/fullscreen-1pmx.jpg',\n",
       "     'size': 122022,\n",
       "     'width': 1200,\n",
       "     'height': 675,\n",
       "     'filename': 'fullscreen-1pmx.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/fullscreen-1pmx.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'fullscreen-1pmx.webp'},\n",
       "    'mobile_low': {'url': '/image/2026/4f/1bk3wy/mobile_low-1pmx.jpg',\n",
       "     'size': 53370,\n",
       "     'width': 640,\n",
       "     'height': 360,\n",
       "     'filename': 'mobile_low-1pmx.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/mobile_low-1pmx.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'mobile_low-1pmx.webp'},\n",
       "    'mobile_high': {'url': '/image/2026/4f/1bk3wy/mobile_high-1pmx.jpg',\n",
       "     'size': 97690,\n",
       "     'width': 960,\n",
       "     'height': 540,\n",
       "     'filename': 'mobile_high-1pmx.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/mobile_high-1pmx.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'mobile_high-1pmx.webp'},\n",
       "    'thumbnail_low': {'url': '/image/2026/4f/1bk3wy/thumbnail_low-1pmw.jpg',\n",
       "     'size': 9133,\n",
       "     'width': 180,\n",
       "     'height': 101,\n",
       "     'filename': 'thumbnail_low-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/thumbnail_low-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'thumbnail_low-1pmw.webp'},\n",
       "    'thumbnail_high': {'url': '/image/2026/4f/1bk3wy/thumbnail_high-1pmw.jpg',\n",
       "     'size': 15699,\n",
       "     'width': 270,\n",
       "     'height': 152,\n",
       "     'filename': 'thumbnail_high-1pmw.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bk3wy/thumbnail_high-1pmw.webp',\n",
       "     'attachment_id': 140737489297106,\n",
       "     'filename_webp': 'thumbnail_high-1pmw.webp'}},\n",
       "   'last_published_at': 1786634275,\n",
       "   'links': {},\n",
       "   'list': {'id': 140737488357812,\n",
       "    'slug': 'sport_story-worldcup2026-top',\n",
       "    'seo_title': '',\n",
       "    'seo_keywords': '',\n",
       "    'seo_description': ''},\n",
       "   'main_token': '',\n",
       "   'narrow': {},\n",
       "   'partner_logo_text': '',\n",
       "   'partner_url': '',\n",
       "   'publish_delay_datetime': None,\n",
       "   'publish_delay_set': False,\n",
       "   'published_at': '2026-06-09T09:44:55.144+03:00',\n",
       "   'show_news': False,\n",
       "   'slider': {'default': {'url': '/image/2026/4f/1bkedl/default-1pn9.jpg',\n",
       "     'size': 65035,\n",
       "     'width': 1200,\n",
       "     'height': 326,\n",
       "     'filename': 'default-1pn9.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bkedl/default-1pn9.webp',\n",
       "     'attachment_id': 140737489297108,\n",
       "     'filename_webp': 'default-1pn9.webp'},\n",
       "    '_preview': {'url': '/image/2026/4f/1bkedl/_preview-1pn9.jpg',\n",
       "     'size': 7517,\n",
       "     'width': 250,\n",
       "     'height': 68,\n",
       "     'filename': '_preview-1pn9.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bkedl/_preview-1pn9.webp',\n",
       "     'attachment_id': 140737489297108,\n",
       "     'filename_webp': '_preview-1pn9.webp'},\n",
       "    'original': {'url': '/image/2026/4f/1bkedl/original-1pn9.jpg',\n",
       "     'size': 63033,\n",
       "     'width': 1252,\n",
       "     'height': 340,\n",
       "     'filename': 'original-1pn9.jpg',\n",
       "     'url_webp': '/image/2026/4f/1bkedl/original-1pn9.webp',\n",
       "     'attachment_id': 140737489297108,\n",
       "     'filename_webp': 'original-1pn9.webp'}},\n",
       "   'story_page_token': '',\n",
       "   'subtitle': '',\n",
       "   'taggings': [],\n",
       "   'title': 'Чемпионат мира-2026: герои, сюжеты, финансы',\n",
       "   'url': 'vedomosti.ru/sport/story/worldcup2026'}],\n",
       " 'relative_url': '',\n",
       " 'header': '',\n",
       " 'template': '',\n",
       " 'total': 6,\n",
       " 'seo_title': '',\n",
       " 'seo_description': '',\n",
       " 'seo_keywords': ''}"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Довольно часто в API встречается формат json, requests позволяет с ним работать \"из коробки\"\n",
    "# Получили обычный словарь с информацией\n",
    "result.json()['list']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e689f78",
   "metadata": {},
   "source": [
    "### Open AI API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "22234ae3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: openai in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (0.28.0)\n",
      "Collecting openai\n",
      "  Downloading openai-3.3.1-py3-none-any.whl.metadata (41 kB)\n",
      "Requirement already satisfied: anyio<5,>=4.10.0 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from openai) (4.11.0)\n",
      "Collecting httpx2<3,>=2.7.0 (from openai)\n",
      "  Downloading httpx2-2.12.0-py3-none-any.whl.metadata (9.5 kB)\n",
      "Collecting jiter<1,>=0.16.0 (from openai)\n",
      "  Downloading jiter-0.16.0-cp313-cp313-win_amd64.whl.metadata (5.3 kB)\n",
      "Requirement already satisfied: pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,<3,>=1.10.13 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from openai) (2.12.4)\n",
      "Requirement already satisfied: sniffio in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from openai) (1.3.1)\n",
      "Requirement already satisfied: typing-extensions<5,>=4.14 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from openai) (4.15.0)\n",
      "Requirement already satisfied: idna>=2.8 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from anyio<5,>=4.10.0->openai) (3.11)\n",
      "Collecting httpcore2==2.12.0 (from httpx2<3,>=2.7.0->openai)\n",
      "  Downloading httpcore2-2.12.0-py3-none-any.whl.metadata (25 kB)\n",
      "Collecting idna>=2.8 (from anyio<5,>=4.10.0->openai)\n",
      "  Downloading idna-3.19-py3-none-any.whl.metadata (9.2 kB)\n",
      "Collecting truststore>=0.10 (from httpx2<3,>=2.7.0->openai)\n",
      "  Downloading truststore-0.10.4-py3-none-any.whl.metadata (4.4 kB)\n",
      "Requirement already satisfied: h11>=0.16 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from httpcore2==2.12.0->httpx2<3,>=2.7.0->openai) (0.16.0)\n",
      "Requirement already satisfied: annotated-types>=0.6.0 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,<3,>=1.10.13->openai) (0.7.0)\n",
      "Requirement already satisfied: pydantic-core==2.41.5 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,<3,>=1.10.13->openai) (2.41.5)\n",
      "Requirement already satisfied: typing-inspection>=0.4.2 in c:\\Users\\boris\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages (from pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,<3,>=1.10.13->openai) (0.4.2)\n",
      "Downloading openai-3.3.1-py3-none-any.whl (1.7 MB)\n",
      "   ---------------------------------------- 0.0/1.7 MB ? eta -:--:--\n",
      "   ------------ --------------------------- 0.5/1.7 MB 4.8 MB/s eta 0:00:01\n",
      "   ---------------------------------------- 1.7/1.7 MB 9.3 MB/s  0:00:00\n",
      "Downloading httpx2-2.12.0-py3-none-any.whl (95 kB)\n",
      "Downloading httpcore2-2.12.0-py3-none-any.whl (83 kB)\n",
      "Downloading jiter-0.16.0-cp313-cp313-win_amd64.whl (196 kB)\n",
      "Downloading idna-3.19-py3-none-any.whl (68 kB)\n",
      "Downloading truststore-0.10.4-py3-none-any.whl (18 kB)\n",
      "Installing collected packages: truststore, jiter, idna, httpcore2, httpx2, openai\n",
      "\n",
      "  Attempting uninstall: idna\n",
      "\n",
      "    Found existing installation: idna 3.11\n",
      "\n",
      "    Uninstalling idna-3.11:\n",
      "\n",
      "      Successfully uninstalled idna-3.11\n",
      "\n",
      "   ------------- -------------------------- 2/6 [idna]\n",
      "   -------------------- ------------------- 3/6 [httpcore2]\n",
      "   -------------------- ------------------- 3/6 [httpcore2]\n",
      "   -------------------- ------------------- 3/6 [httpcore2]\n",
      "   -------------------------- ------------- 4/6 [httpx2]\n",
      "   -------------------------- ------------- 4/6 [httpx2]\n",
      "   -------------------------- ------------- 4/6 [httpx2]\n",
      "  Attempting uninstall: openai\n",
      "   -------------------------- ------------- 4/6 [httpx2]\n",
      "    Found existing installation: openai 0.28.0\n",
      "   -------------------------- ------------- 4/6 [httpx2]\n",
      "    Uninstalling openai-0.28.0:\n",
      "   -------------------------- ------------- 4/6 [httpx2]\n",
      "      Successfully uninstalled openai-0.28.0\n",
      "   -------------------------- ------------- 4/6 [httpx2]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   --------------------------------- ------ 5/6 [openai]\n",
      "   ---------------------------------------- 6/6 [openai]\n",
      "\n",
      "Successfully installed httpcore2-2.12.0 httpx2-2.12.0 idna-3.19 jiter-0.16.0 openai-3.3.1 truststore-0.10.4\n"
     ]
    }
   ],
   "source": [
    "!pip install openai"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "05bfa997",
   "metadata": {},
   "outputs": [],
   "source": [
    "import configparser\n",
    "from openai import OpenAI\n",
    "\n",
    "# Определяем парсер конфига\n",
    "config = configparser.ConfigParser()\n",
    "\n",
    "config.read('configs/open_ai_secret.ini', encoding='utf-8')\n",
    "key = config['SECRET']['key']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "45004ff6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ответ модели:\n",
      " Коротко: REST API — это способ, как программа может общаться с веб-сервисом по протоколу HTTP, манипулируя “ресурсами” через понятные URL и стандартные методы.\n",
      "\n",
      "Что стоит знать простыми словами\n",
      "- Ресурс: это то, чем управляет сервис (например, книга, задача, пользователь). Каждый ресурс имеет свой URL, например /books или /tasks/42.\n",
      "- URL (адрес ресурса): указывает, к какому ресурсу обращаемся.\n",
      "- HTTP-методы — что делаем с ресурсом:\n",
      "  - GET — прочитать (получить данные)\n",
      "  - POST — создать новый ресурс\n",
      "  - PUT — заменить целиком ресурс\n",
      "  - PATCH — частично обновить ресурс\n",
      "  - DELETE — удалить ресурс\n",
      "- Представление ресурса: ответ сервера чаще всего приходит в формате JSON (пример ниже). Клиент получает \"представление\" ресурса и может сохранить его или отобразить пользователю.\n",
      "- Бездомовая архитектура (stateless): сервер не хранит состояние клиента между запросами. Каждый запрос сам по себе содержит всю необходимую информацию (например, токен авторизации).\n",
      "- Единый интерфейс (uniform interface): единые принципы именования и форматов, что упрощает использование и развитие API.\n",
      "- Чаще всего возвращаются коды статуса HTTP: 200 OK, 201 Created, 204 No Content, 400 Bad Request, 404 Not Found, 500 Internal Server Error и т.д.\n",
      "- Форматы данных: JSON — самый популярный формат; XML встречается реже.\n",
      "\n",
      "Небольшой пример, чтобы было понятно\n",
      "Предположим, у нас есть API для книг.\n",
      "\n",
      "1) Получить список книг\n",
      "- Запрос:\n",
      "  GET /books\n",
      "- Ответ (пример):\n",
      "  200 OK\n",
      "  [\n",
      "    { \"id\": 1, \"title\": \"Граф Монте-Кристо\", \"author\": \"А. Дюма\" },\n",
      "    { \"id\": 2, \"title\": \"Преступление и наказание\", \"author\": \"Ф. Достоевский\" }\n",
      "  ]\n",
      "\n",
      "2) Добавить новую книгу\n",
      "- Запрос:\n",
      "  POST /books\n",
      "  Content-Type: application/json\n",
      "  { \"title\": \"Машина времени\", \"author\": \"Г. Уэллс\" }\n",
      "- Ответ:\n",
      "  201 Created\n",
      "  Location: /books/3\n",
      "  { \"id\": 3, \"title\": \"Машина времени\", \"author\": \"Г. Уэллс\" }\n",
      "\n",
      "3) Обновить часть информации о книге\n",
      "- Запрос:\n",
      "  PATCH /books/3\n",
      "  Content-Type: application/json\n",
      "  { \"title\": \"Машина времени (издание 2)\" }\n",
      "- Ответ:\n",
      "  200 OK\n",
      "  { \"id\": 3, \"title\": \"Машина времени (издание 2)\", \"author\": \"Г. Уэллс\" }\n",
      "\n",
      "4) Удалить книгу\n",
      "- Запрос:\n",
      "  DELETE /books/3\n",
      "- Ответ:\n",
      "  204 No Content\n",
      "\n",
      "Преимущества REST\n",
      "- Простота и понятность: можно быстро понять, что делает каждый эндпоинт.\n",
      "- Масштабируемость: независимо развиваемый клиент и сервер.\n",
      "- Широкая совместимость: HTTP и JSON поддерживаются почти в любом языке.\n",
      "- Легко тестировать и документировать.\n",
      "\n",
      "Когда REST подходит, а когда не обязательно\n",
      "- Хорошо: публичный API, взаимодействие между сервисами, мобильные и веб-приложения.\n",
      "- Не обязательно: если нужны очень высокие темпы изменений, сложные процедуры перехода между состояниями (часто применяют более гибкие архитектуры, например gRPC, GraphQL). Но REST остаётся очень популярным выбором.\n",
      "\n",
      "Если хочешь, могу привести мини-задание: спроектируем простой REST API для списка задач (tasks) и нарисуем набор эндпоинтов с примером запросов и ответов. Или могу ответить на конкретные вопросы по REST. Что предпочитаешь?\n"
     ]
    }
   ],
   "source": [
    "# Инициализация клиента (ключ лучше хранить в переменных окружения)\n",
    "client = OpenAI(api_key=key)\n",
    "\n",
    "# Произвольный текст от пользователя\n",
    "user_text = \"Объясни, что такое REST API\"\n",
    "\n",
    "# Формат ChatML: массив сообщений (messages)\n",
    "messages = [\n",
    "    {\n",
    "        \"role\": \"system\", \n",
    "        \"content\": \"Ты — дружелюбный и понятный преподаватель для летней школы.\"\n",
    "    },\n",
    "    {\n",
    "        \"role\": \"user\", \n",
    "        \"content\": user_text\n",
    "    },\n",
    "    # {\"role\": \"assistant\",\n",
    "    #  \"content\": \"Прошлый ответ модели\"\n",
    "    # }\n",
    "]\n",
    "\n",
    "# Отправка запроса\n",
    "response = client.chat.completions.create(\n",
    "    model=\"gpt-5-nano\",\n",
    "    messages=messages\n",
    ")\n",
    "\n",
    "# Получение ответа\n",
    "assistant_reply = response.choices[0].message.content\n",
    "print(\"Ответ модели:\\n\", assistant_reply)"
   ]
  }
 ],
 "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.13.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
