{"componentChunkName":"component---src-templates-material-js","path":"/workshops/2021/06/25/pishem-svoego-robota-na-python-urok-10/index.html","result":{"pageContext":{"pageParameters":{"isPreview":false,"isMirror":true,"delay_to_show_donate_popup_seconds":7,"about_page":false,"games_page":true,"games_page_link_in_header":false,"donate_popup_show_ru":true,"donate_popup_title_ru":"Без вас — нас не будет","donate_popup_content_ru":"Помогите нам добывать и рассказывать важные истории. Участие каждого — важно!","donate_popup_show_en":true,"donate_popup_title_en":"We can’t do it alone!","donate_popup_content_en":"Help us uncover and share the stories that matter. Every contribution makes a difference","display_regular_donors_banner":false,"showPatreonMethod":true,"useNewMaterialDonationBanner":true,"new_donations_page_design":true,"donations_popup_variants":{"ru":[{"id":"kc19b","title":"Сохраните журналистику для людей в России ","subtitle":"Читают нас прежде всего люди в России, но будущее «Важных историй» зависит от тех, кто живет за пределами страны. Поддержите нас ежемесячным донатом — сохраните независимую журналистику для ваших близких, которые остаются в России.","is_active":true,"background":"linear-gradient(10deg, #421f20 5%, #994146)"},{"id":"33tc9","title":"У пропаганды есть миллиарды из бюджета. У нас — только вы","subtitle":"Перемены возможны, если независимые от власти журналисты продолжают свою работу день за днем, год за годом. Мы рассказываем важные истории уже шесть лет. Помогите нам продолжать.","is_active":true,"background":"linear-gradient(10deg, #421f20 5%, #994146)"}],"en":[{"id":"nj1py","title":"Important stories don’t tell themselves","subtitle":"Independent journalism comes at a cost. We answer to no owners or advertisers — only to you, our readers.  Your ongoing support allows us to keep exposing the truth. Without you, we won’t be here.","is_active":true,"background":"linear-gradient(10deg, #421f20 5%, #994146)"},{"id":"xdfc1","title":"Help us outlast the Kremlin censorship","subtitle":"Censorship lose to journalism that keeps showing up, year after year. Monthly donors are what make that possible","is_active":true,"background":"linear-gradient(10deg, #421f20 5%, #994146)"},{"id":"ck121","title":"State propaganda has billions to spend. We have only you to rely on","subtitle":"Change happens when independent journalists keep showing up — day after day, year after year. Six years in, we're still showing up. Help us keep going with a monthly donation.","is_active":true,"background":"linear-gradient(10deg, #421f20 5%, #994146)"}]},"feedback_page":true,"donorsCount":0,"showAuthorsRequestAfterMaterial":true,"radioPage":true,"radioExists":{"ru":true,"en":false},"singlePlaylistPath":{"ru":"/radio/2025/12/22/razgovori-ovazhnikh/index.html"},"with_bookmarks":true,"news_feed":true,"news_feed_skeleton":false,"news_page_redesign":true,"with_topics":true,"materials_topics":false,"topics_page":true,"with_pdf_share":false,"with_native_share":false,"preferred_source_page":true,"charon_new_form":true,"preferred_source_promos":true,"charon_en_page":true},"pk":282,"header":"Пишем своего робота на Python. Урок 10","lead":"Заполняем HTML-таблицу данными о госконтрактах с помощью Python-библиотеки Jinja2","category":"workshops","entry_image":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1920x960px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1920x960px_2x.webp","for_width":1920,"for_height":960,"real_width_1x":1920,"real_width_2x":3840,"real_height_1x":960,"real_height_2x":1920},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1920x960px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1920x960px_2x.jpg","for_width":1920,"for_height":960,"real_width_1x":1920,"real_width_2x":3840,"real_height_1x":960,"real_height_2x":1920},{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1272x636px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1272x636px_2x.webp","for_width":1272,"for_height":636,"real_width_1x":1272,"real_width_2x":2544,"real_height_1x":636,"real_height_2x":1272},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1272x636px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-1272x636px_2x.jpg","for_width":1272,"for_height":636,"real_width_1x":1272,"real_width_2x":2544,"real_height_1x":636,"real_height_2x":1272},{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-912x456px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-912x456px_2x.webp","for_width":912,"for_height":456,"real_width_1x":912,"real_width_2x":1824,"real_height_1x":456,"real_height_2x":912},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-912x456px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-912x456px_2x.jpg","for_width":912,"for_height":456,"real_width_1x":912,"real_width_2x":1824,"real_height_1x":456,"real_height_2x":912},{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-600x400px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-600x400px_2x.webp","for_width":600,"for_height":400,"real_width_1x":600,"real_width_2x":1200,"real_height_1x":400,"real_height_2x":800},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-600x400px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-600x400px_2x.jpg","for_width":600,"for_height":400,"real_width_1x":600,"real_width_2x":1200,"real_height_1x":400,"real_height_2x":800},{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-360x360px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-360x360px_2x.webp","for_width":360,"for_height":360,"real_width_1x":360,"real_width_2x":720,"real_height_1x":360,"real_height_2x":720},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-360x360px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/edfe5e59b5774d47904984f375c739d2-360x360px_2x.jpg","for_width":360,"for_height":360,"real_width_1x":360,"real_width_2x":720,"real_height_1x":360,"real_height_2x":720}],"entry_image_credit":"","blocks":[{"data":"На прошлом <a href=\"https://istories.media/workshops/2021/06/18/pishem-svoego-robota-na-python-urok-9/\" data-type=\"usual\" target=\"_blank\">уроке</a> мы изучили основы языков для верстки сайтов HTML и CSS и создали с помощью них таблицу. А сегодня мы научим нашего робота автоматически собирать спарсенные данные о госконтрактах в эту таблицу. Для этого мы будем использовать Python-библиотеку <strong>Jinja2</strong>. ","type":"p","className":""},{"data":{"id":2552,"data":{"url":"https://www.youtube.com/embed/8wr0Qy28a8Q","caption":"Видео: Глеб Лиманский","provider":"youtube","rawInput":"https://www.youtube.com/watch?v=8wr0Qy28a8Q","ratio_mobile":"16:9","ratio_desktop":"16:9"},"category":"video-embed"},"type":"video-embed"},{"data":"<a href=\"http://jinja.pocoo.org/\" data-type=\"usual\" target=\"_blank\">Jinja2</a>&nbsp;— это шаблонитизатор, с помощью которого можно подставлять переменные из Python на страницы в браузере. В нашем случае это будут спарсенные данные о госконтрактах, которые мы подставим в нашу таблицу.&nbsp;Принцип работы Jinja2 похож на метод f-строк. Только переменные заключаются в двойные фигурные скобки, а не одинарные. ","type":"p","className":""},{"data":"Давайте посмотрим, как это работает, на простом примере. Для начала установите бибилиотеку через команду в терминале <strong>pipenv install Jinja2</strong>. Затем нужно импортировать класс Template. Создааем шаблон приветствия: Hello и имя, которое будем в этот шаблон как раз подставлять. В переменную <strong>template</strong> кладем наш шаблон (получаем объект template, то есть экземпляр класса <strong>Template</strong>). Затем применяем к объекту template метод <strong>render()</strong>, который обрабатывает наш шаблон. Так Jinja2 подставляет значение аргумента name, которое мы указали — Harry — в указанное нами место в шаблоне.&nbsp;Получаем результат: Hello, Harry. А вот как бы мы записали это с помощью f-строки. ","type":"p","className":""},{"data":{"id":2545,"data":{"images":[{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/9ac320fa48f74ad99db994f16084a407-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/9ac320fa48f74ad99db994f16084a407-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":268,"real_height_2x":535},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/9ac320fa48f74ad99db994f16084a407-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/9ac320fa48f74ad99db994f16084a407-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":268,"real_height_2x":535}]},{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/eca4e017086a4e95ad347a4bd1b4ff4c-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/eca4e017086a4e95ad347a4bd1b4ff4c-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":332,"real_height_2x":665},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/eca4e017086a4e95ad347a4bd1b4ff4c-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/eca4e017086a4e95ad347a4bd1b4ff4c-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":332,"real_height_2x":665}]}]},"category":"two-images-embed"},"type":"two-images-embed"},{"data":"Метод render() обрабатывает шаблон, используя именованные аргументы, которые ему передаются (как в примере с именем), или используя словарь. Для нашего случая нам нужен список со десятью словарями, где каждый словарь содержит данные о контракте из топа-10 крупнейших за неделю. Создадим такой список с помощью функции <strong>get_top_contracts()</strong>. Внутри нее нам пригодится наша рекурсивная функция, которую мы <a href=\"https://istories.media/workshops/2021/05/01/pishem-svoego-robota-na-python-urok-4/\" data-type=\"usual\" target=\"_blank\">писали</a> на предыдущих уроках. Также необходимо прописать условие для случаев, когда данных о поставщике контракта нет (к сожалению, на госзакупках это стало часто происходить). И возвращает наша функция первые 10 госконтрактов (словарей).&nbsp;","type":"p","className":""},{"data":{"id":2539,"data":{"images":[{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/ee6c909d50c543d39aba53f7f285871b-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/ee6c909d50c543d39aba53f7f285871b-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":1156,"real_height_2x":2312},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/ee6c909d50c543d39aba53f7f285871b-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/ee6c909d50c543d39aba53f7f285871b-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":1156,"real_height_2x":2312}]},{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/a95fcd09ed3243c59314000c656f4423-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/a95fcd09ed3243c59314000c656f4423-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":592,"real_height_2x":1183},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/a95fcd09ed3243c59314000c656f4423-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/a95fcd09ed3243c59314000c656f4423-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":592,"real_height_2x":1183}]}]},"category":"two-images-embed"},"type":"two-images-embed"},{"data":"Перейдем к нашу HTML-коду, который мы написали на прошлом уроке: его нужно обновить и подготовить для работы с Jinja2. Во-первых, добавим количество столбцов и правильно их переименуем. Во-вторых, пропишем выражения Jinja2 (как мы указывали name в двойных фигурных скобках в начале урока).&nbsp;Так как у нас довольно большой объем данных, нам нужно использовать цикл для их обработки. Открываем цикл Дзиндзя с помощью синтаксиса этой библиотеки, где items это наш список со словарями. Цикл будет ходить по каждому элементу словаря и заполнять наши строки в таблице (каждая строка в таблице это один словарь). В конце закрываем этот цикл тоже по правилу Jinja2.&nbsp;","type":"p","className":""},{"data":{"id":2536,"data":{"images":[{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/e3f89e69596549fc8226de4f719cbc0f-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/e3f89e69596549fc8226de4f719cbc0f-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":1263,"real_height_2x":2526},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/e3f89e69596549fc8226de4f719cbc0f-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/e3f89e69596549fc8226de4f719cbc0f-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":1263,"real_height_2x":2526}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Теперь создадим папку templates в нашем проекте robot в Visual studio code и положим туда наш обновленный HTML-код. А в нашем основном документе — main.py — напишем функцию <strong>create_message()</strong> для того, чтобы отрендерить шаблон. Вверху кода, где у нас все импорты, добавим:","type":"p","className":""},{"data":"<strong>from jinja2 import Template</strong>","type":"p","className":""},{"data":"<strong>from jinja2 import Environment, FileSystemLoader, select_autoescape</strong>","type":"p","className":""},{"data":"Функция create_message() на вход получает наш список со словарями. Теперь нужно дать понять Jinja2, где ей брать HTML-шаблон.&nbsp;FileSystemLoader находит нашу папку с шаблонами. В select_autoescape прописываем форматы. А в переменную template загружается шаблон из файла — table.html. Затем рендерим наш шаблон с помощью уже известного нам метода, указываем что items в коде HTML — это наш список со словарями (top_contracts). Теперь message&nbsp;— это переменная, в которой лежит таблица с собранными данными о госконтрактах. Запишем ее в новый HTML-файл, чтобы потом можно было посмотреть результат в браузере.&nbsp;Наша функция возвращает сообщение с информацией про контракты в табличном виде, чтобы в дальнейшем мы могли передать это сообщение  по почте.&nbsp;","type":"p","className":""},{"data":{"id":2540,"data":{"images":[{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/b0f361f9f8b34e78b71ec15a0dee3704-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/b0f361f9f8b34e78b71ec15a0dee3704-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":563,"real_height_2x":1126},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/b0f361f9f8b34e78b71ec15a0dee3704-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/b0f361f9f8b34e78b71ec15a0dee3704-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":563,"real_height_2x":1126}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Добавим в наш итог (<strong>result</strong>) из <a href=\"https://github.com/datacoon/clearspending-examples/wiki/%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-API-%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82%D1%8B\" data-type=\"usual\" target=\"_blank\">документации</a> API Clearspending сортировку по убыванию цены (<strong>sort='-price'</strong>) и применим две сегодняшние функции. ","type":"p","className":""},{"data":{"id":2543,"data":{"images":[{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/a59d394e559742ff8fed7fc073402736-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/a59d394e559742ff8fed7fc073402736-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":206,"real_height_2x":412},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/a59d394e559742ff8fed7fc073402736-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/a59d394e559742ff8fed7fc073402736-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":206,"real_height_2x":412}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Теперь откроем файл с новой таблицей и посмотрим через расширение Live server на итоговую таблицу в браузере.","type":"p","className":""},{"data":{"id":2544,"data":{"images":[{"imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/54873091e8f5457da67bbd6180def631-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/54873091e8f5457da67bbd6180def631-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":508,"real_height_2x":1016},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/54873091e8f5457da67bbd6180def631-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/54873091e8f5457da67bbd6180def631-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":508,"real_height_2x":1016}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"К сожалению, как мы видим, данные о всех поставщиках скрыты с госзакупок. Такую картину по крупных контарктам мы наблюдаем уже несколько месяцев. Реестр становится все более закрытым. ","type":"p","className":""}],"created_at_date":"2021-06-25","updated_at_date":null,"created_at_date_time":null,"updated_at_date_time":null,"is_exclusive":false,"is_urgent":false,"initially_published_at":"2021-06-25T07:38:58.196Z","has_additional_facts":false,"locale":"ru","has_visualization_without_fallback":false,"spec_project":null,"header_secondary":"","warning":"","is_translated_by_ai":false,"with_donation_banner":true,"donation_banner_header":"","donation_banner_text":"","media_outlet__codename":null,"with_authors_request_banner":false,"faq":[],"_path":"/workshops/2021/06/25/pishem-svoego-robota-na-python-urok-10/","is_published":true,"authors_list":[{"id":9,"lead":"Журналистка «Важных историй»","_path":"irina-dolinina","avatar":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-896x504px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-896x504px_2x.webp","crop_zone":null,"for_width":896,"for_height":504,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":896,"real_width_2x":1792,"real_height_1x":504,"real_height_2x":1008},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-896x504px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-896x504px_2x.jpg","crop_zone":null,"for_width":896,"for_height":504,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":896,"real_width_2x":1792,"real_height_1x":504,"real_height_2x":1008},{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-688x387px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-688x387px_2x.webp","crop_zone":null,"for_width":688,"for_height":387,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":688,"real_width_2x":1376,"real_height_1x":387,"real_height_2x":774},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-688x387px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-688x387px_2x.jpg","crop_zone":null,"for_width":688,"for_height":387,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":688,"real_width_2x":1376,"real_height_1x":387,"real_height_2x":774},{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-416x234px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-416x234px_2x.webp","crop_zone":null,"for_width":416,"for_height":234,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":416,"real_width_2x":832,"real_height_1x":234,"real_height_2x":468},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-416x234px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-416x234px_2x.jpg","crop_zone":null,"for_width":416,"for_height":234,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":416,"real_width_2x":832,"real_height_1x":234,"real_height_2x":468},{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-336x189px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-336x189px_2x.webp","crop_zone":null,"for_width":336,"for_height":189,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":336,"real_width_2x":672,"real_height_1x":188,"real_height_2x":378},{"format":"jpg","url_1x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-336x189px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-336x189px_2x.jpg","crop_zone":null,"for_width":336,"for_height":189,"original_url":"https://static.istories.media/uploaded/images/1ce8f6c2725d44ee82748f09aa73e8a1-original.jpg","real_width_1x":336,"real_width_2x":672,"real_height_1x":188,"real_height_2x":378}],"lead_en":"IStories' investigative reporter","ordering":null,"position":"Авторка","is_public":true,"last_name":"Долинина","first_name":"Ирина","position_en":"Author","last_name_en":"Dolinina","first_name_en":"Irina"}],"external_authors_list":[],"editors_list":[],"external_editors_list":[],"participants_list":[],"external_participants_list":[],"partners_list":[],"case":null,"translated_material":null,"audio_material":null,"text_material":null,"id":282,"topics":[],"meta":{"og_title":"","og_description":"","twitter_title":"","twitter_description":"","og_image":"https://static.istories.media/uploaded/images/share/fc65e80bfdce4e62b817839a05c700f2.jpg","twitter_image":"https://static.istories.media/uploaded/images/share/fc65e80bfdce4e62b817839a05c700f2.jpg","vk_image":"https://static.istories.media/uploaded/images/share/vk/7b1d815053a74fb488a92da32a065e68.jpg"},"tags":["python","api","ddj","html"],"playlist":null,"socialMediaBanners":[{"id":10,"text":"У пропаганды есть миллиарды из бюджета. У нас — только вы","link":"","codename":"donation"},{"id":14,"text":"Список погибших и пропавших без вести российских военных","link":"","codename":"haron"},{"id":18,"text":"","link":"","codename":"mobile_app"},{"id":6,"text":"Оставайтесь на связи: подпишитесь на нашу рассылку","link":"","codename":"newsletter"}]}},"staticQueryHashes":["764694655"],"slicesMap":{}}