{"componentChunkName":"component---src-templates-material-js","path":"/workshops/2021/04/23/pishem-svoego-robota-na-python-urok-3/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":254,"header":"Пишем своего робота на Python. Урок 3","lead":"Учимся получать данные из сети, использовать библиотеку Requests и API сторонних сервисов","category":"workshops","entry_image":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-1920x960px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-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":"png","url_1x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-1920x960px_1x.png","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-1920x960px_2x.png","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/bd1f05ace7c441cbacb7179bf4b79c2d-1272x636px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-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":"png","url_1x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-1272x636px_1x.png","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-1272x636px_2x.png","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/bd1f05ace7c441cbacb7179bf4b79c2d-912x456px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-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":"png","url_1x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-912x456px_1x.png","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-912x456px_2x.png","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/bd1f05ace7c441cbacb7179bf4b79c2d-600x400px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-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":"png","url_1x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-600x400px_1x.png","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-600x400px_2x.png","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/bd1f05ace7c441cbacb7179bf4b79c2d-360x360px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-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":"png","url_1x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-360x360px_1x.png","url_2x":"https://static.istories.media/uploaded/images/bd1f05ace7c441cbacb7179bf4b79c2d-360x360px_2x.png","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":"Продолжаем наш цикл уроков, где мы пишем робота на Python, который будет собирать данные крупнейших госконтрактов в России и присылать их вам на почту.&nbsp;Сегодня мы поработаем с библиотекой Requests, научимся получать данные из сети и разберемся, что такое API.&nbsp;","type":"p","className":""},{"data":{"data":{"url":"https://www.youtube.com/embed/ziE7VceZZ1M","text":"Видео: Глеб Лиманский","provider":"youtube","rawInput":"https://www.youtube.com/watch?v=ziE7VceZZ1M","ratio_mobile":"16:9","ratio_desktop":"16:9"},"category":"video-embed"},"type":"video-embed"},{"data":"Откроем наш проект в редакторе Visual Studio Code, очистим терминал уже известной нам командой <strong>clear</strong>, чтобы было удобнее работать, и активируем виртуальное окружение командой <strong>pipenv shell</strong>.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/5536ca37cf164f0d9998f1ab5476ada9-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/5536ca37cf164f0d9998f1ab5476ada9-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":202,"real_height_2x":406},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/5536ca37cf164f0d9998f1ab5476ada9-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/5536ca37cf164f0d9998f1ab5476ada9-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":202,"real_height_2x":406}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"<a href=\"https://istories.media/workshops/2021/04/16/pishem-svoego-robota-na-python-urok-2/\" data-type=\"usual\" target=\"_blank\">В прошлый раз</a> мы установили библиотеку Requests —&nbsp;она позволяет нам делать запросы (те самые requests) и получать данные из интернета. Для примера возьмем одну из статей «Важных историй» и попробуем проанализировать ее текст. ","type":"p","className":""},{"data":"Делаем первый запрос","type":"h2","className":""},{"data":"Чтобы начать пользоваться библиотекой Requests, ее нужно импортировать в наш файл. Для этого в текстовой области нашего файла main.py пишем <strong>import requests</strong> и выполняем команду.&nbsp;","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/90f2118a2f1e4f6688893ee9783e6637-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/90f2118a2f1e4f6688893ee9783e6637-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":405,"real_height_2x":810},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/90f2118a2f1e4f6688893ee9783e6637-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/90f2118a2f1e4f6688893ee9783e6637-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":405,"real_height_2x":810}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Далее нужно задать адрес страницы, содержимое которой мы хотим получить и проанализировать. В нашем примере это будет <a href=\"https://istories.media/investigations/2021/04/07/chudesnaya-villa-na-ostrove-millionerov/\" data-type=\"usual\" target=\"_blank\">статья «Чудесная вилла на острове миллионеров»</a>. Скопируем ее адрес и создадим в нашем файле новую переменную <strong>url = ‘адрес нужной страницы’</strong>. Обратите внимание, что адрес мы записываем обязательно в кавычках, чтобы он не переносился на новую строку.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/87383e13bb824b4e9123dac24fd6fc78-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/87383e13bb824b4e9123dac24fd6fc78-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":231,"real_height_2x":462},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/87383e13bb824b4e9123dac24fd6fc78-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/87383e13bb824b4e9123dac24fd6fc78-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":231,"real_height_2x":462}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Теперь, чтобы получить данные, нам нужна всего одна строчка кода. Создадим новую переменную <strong>data</strong> с использованием библиотеки Requests и метода <strong>get</strong>, который мы направляем на нашу статью, то есть <strong>url</strong>: <strong>data = requests.get(url)</strong>.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/5a8f7bd5a7bd42f9b5103ef824989b5b-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/5a8f7bd5a7bd42f9b5103ef824989b5b-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":233,"real_height_2x":466},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/5a8f7bd5a7bd42f9b5103ef824989b5b-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/5a8f7bd5a7bd42f9b5103ef824989b5b-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":233,"real_height_2x":466}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Распечатаем полученные данные и посмотрим, что вышло: <strong>print(data)</strong>.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/e1a9efec4ec440fb9e6f823b92a54400-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/e1a9efec4ec440fb9e6f823b92a54400-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":606,"real_height_2x":1212},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/e1a9efec4ec440fb9e6f823b92a54400-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/e1a9efec4ec440fb9e6f823b92a54400-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":606,"real_height_2x":1212}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Мы видим, что в терминале нам вернулся Response [200] — это значит, что наш запрос был успешно отправлен, и сервер нам ответил. Чтобы посмотреть, что именно ответил сервер, нужно добавить опцию <strong>text </strong>— тогда команда примет вид <strong>print(data.text)</strong>. Посмотрим, что теперь отобразится в терминале.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/02db509b6eed4f3f97ef77a1b0995d6a-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/02db509b6eed4f3f97ef77a1b0995d6a-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":252,"real_height_2x":503},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/02db509b6eed4f3f97ef77a1b0995d6a-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/02db509b6eed4f3f97ef77a1b0995d6a-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":252,"real_height_2x":503}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Как видите, мы получили сырые данные — HTML-код всей страницы, доступной по заданному нами адресу. В этих данных есть множество ненужных нам элементов. Текст можно проанализировать даже в таком виде, но для этого нам бы пришлось установить еще несколько библиотек. В будущем мы расскажем о таких библиотеках. Но все-таки лучше получать данные в нормальном виде, и в этом нам помогут API.&nbsp;","type":"p","className":""},{"data":"<strong>API</strong> — это аббревиатура от английского application programming interface, то есть, это интерфейс приложения со своим набором функций. API используются буквально везде: в платежных системах, в онлайн-бронировании, в социальных сетях. Давайте посмотрим, как это работает на примере.","type":"p","className":""},{"data":"Пробуем работать с госконтрактами вручную","type":"h2","className":""},{"data":"Для работы с госконтрактами мы будем использовать <a href=\"https://clearspending.ru/\" data-type=\"usual\" target=\"_blank\">сервис «ГосЗатраты»</a>. Под капотом у сервиса — данные с&nbsp;<a href=\"https://zakupki.gov.ru/\" data-type=\"usual\" target=\"_blank\">официального портала госконтрактов</a>. Попробуем для начала поискать что-нибудь в «ГосЗатратах» с помощью поисковой строки на сайте — так, как это делают обычные пользователи.&nbsp;","type":"p","className":""},{"data":{"data":{"images":[{"credit":"Сервис «ГосЗатраты»: clearspending.ru","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/024851c055a64989b94372fc9969c331-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/024851c055a64989b94372fc9969c331-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":296,"real_height_2x":592},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/024851c055a64989b94372fc9969c331-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/024851c055a64989b94372fc9969c331-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":296,"real_height_2x":592}]},{"credit":"Расширенный поиск","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/e8b82d4b218c4b28ba91d2d0a747635d-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/e8b82d4b218c4b28ba91d2d0a747635d-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":422,"real_height_2x":844},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/e8b82d4b218c4b28ba91d2d0a747635d-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/e8b82d4b218c4b28ba91d2d0a747635d-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":422,"real_height_2x":844}]}]},"category":"two-images-embed"},"type":"two-images-embed"},{"data":"Выбираем раздел «Контракты», нажимаем на «Расширенный поиск». Теперь попробуем получить все госконтракты из Ярославской области —&nbsp;в списке «Регион госзаказчика» выбираем нужную область и нажимаем кнопку «Найти».","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/a5d7be4a485a4ae6979dcb9346f56493-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/a5d7be4a485a4ae6979dcb9346f56493-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":502,"real_height_2x":1006},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/a5d7be4a485a4ae6979dcb9346f56493-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/a5d7be4a485a4ae6979dcb9346f56493-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":502,"real_height_2x":1006}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"У нас появился список госконтрактов. Теперь отфильтруем контракты по дате заключения. Вернемся к параметрам расширенного поиска и в пункте «Дата заключения контракта» выберем, например, период с 1 по 7 апреля и снова нажмем «Найти».","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/8079b21daab14892ba0e5dd879902790-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/8079b21daab14892ba0e5dd879902790-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":458,"real_height_2x":915},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/8079b21daab14892ba0e5dd879902790-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/8079b21daab14892ba0e5dd879902790-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":458,"real_height_2x":915}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Мы получили 57 контрактов из Ярославской области, заключенных с 1 по 7 апреля. Теперь их можно отсортировать от самых крупных к самым мелким, нажав на кнопку «по сумме контракта».","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/3fe2dde4d0174c178dcc74b4bfb2d487-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/3fe2dde4d0174c178dcc74b4bfb2d487-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":463,"real_height_2x":926},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/3fe2dde4d0174c178dcc74b4bfb2d487-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/3fe2dde4d0174c178dcc74b4bfb2d487-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":463,"real_height_2x":926}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"С одной стороны, мы уже получили очень интересные данные для анализа. С другой стороны, мы ограничены в дальнейшем анализе этих данных —&nbsp;например, мы не можем быстро посчитать сумму всех заключенных за неделю контрактов, для этого нам придется скачивать их, вручную открывать каждый в Excel и только затем считать. Для автоматизации таких задач и существует API.","type":"p","className":""},{"data":"Давайте внимательно посмотрим на адресную строку страницы с нашими госконтрактами.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/54e8ac6a049048f89919ae6b4b69afce-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/54e8ac6a049048f89919ae6b4b69afce-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":264,"real_height_2x":528},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/54e8ac6a049048f89919ae6b4b69afce-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/54e8ac6a049048f89919ae6b4b69afce-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":264,"real_height_2x":528}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"В строке перечислены различные параметры: в <strong>productsearch</strong> пусто, в других тоже, а вот в <strong>datarange</strong> есть значения — они совпадают с теми датами, которые задавали при поиске. Если мы прямо в адресной строке изменим эти значения — соответственно изменится и поисковая выдача. Например, заменим 7 апреля на 1 апреля, чтобы отобразились госконтракты только за 1 апреля, и нажмем Enter, чтобы перезагрузить страницу с обновленным адресом.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"Меняем дату на 1 апреля","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/5690d3a18f8643f799feecc4d75eedd2-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/5690d3a18f8643f799feecc4d75eedd2-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":394,"real_height_2x":790},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/5690d3a18f8643f799feecc4d75eedd2-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/5690d3a18f8643f799feecc4d75eedd2-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":394,"real_height_2x":790}]},{"credit":"Мы получили контракты только за 1 апреля — их 28","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/1dd047fc16a9490996ad3381cf7f7a07-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1dd047fc16a9490996ad3381cf7f7a07-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":442,"real_height_2x":884},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/1dd047fc16a9490996ad3381cf7f7a07-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/1dd047fc16a9490996ad3381cf7f7a07-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":442,"real_height_2x":884}]}]},"category":"two-images-embed"},"type":"two-images-embed"},{"data":"Попробуем сделать то же самое с регионом. У нас есть параметр <strong>customerregion</strong> и его значение 76, которое соответствует коду Ярославской области. Поменяем его на 77 (Москва) и еще раз нажмем Enter.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"Меняем регион на 77","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/1acc063f80e64ed1a3e8c4f10d55f80d-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1acc063f80e64ed1a3e8c4f10d55f80d-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":378,"real_height_2x":756},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/1acc063f80e64ed1a3e8c4f10d55f80d-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/1acc063f80e64ed1a3e8c4f10d55f80d-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":378,"real_height_2x":756}]},{"credit":"Мы получили контракты из Москвы за 1 апреля","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/5765adfbe1d34377a7e7e38c8b981dbf-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/5765adfbe1d34377a7e7e38c8b981dbf-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":412,"real_height_2x":824},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/5765adfbe1d34377a7e7e38c8b981dbf-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/5765adfbe1d34377a7e7e38c8b981dbf-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":412,"real_height_2x":824}]}]},"category":"two-images-embed"},"type":"two-images-embed"},{"data":"Только что вы сделали первые запросы к API какого-то сервиса, в данном случае «ГосЗатрат». Но, конечно, API придумывалось не для того, чтобы вручную менять какие-то данные в адресной строке.&nbsp;","type":"p","className":""},{"data":"Тестируем работу API в браузере","type":"h2","className":""},{"data":"Чтобы разобраться, как работает API «ГосЗатрат», нужно почитать <a href=\"https://github.com/clearspending/clearspending-examples/wiki\" data-type=\"usual\" target=\"_blank\">документацию</a> и изучить, какие есть методы и как лучше с ними работать. В документации мы видим базовый URL, а ниже перечислены параметры поиска, которые можно использовать. Некоторые из них мы уже встречали —&nbsp;например, <strong>datarange</strong> и <strong>customerregion</strong>.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/36ef9cfe659f4959b1c779dfa0985a40-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/36ef9cfe659f4959b1c779dfa0985a40-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":794,"real_height_2x":1589},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/36ef9cfe659f4959b1c779dfa0985a40-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/36ef9cfe659f4959b1c779dfa0985a40-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":794,"real_height_2x":1589}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Попробуем воспользоваться знаниями из документации и настроить поиск в адресной строке браузера с нуля. Скопируем базовый URL и перейдем по нему. Мы увидим надпись «Invalid request», потому что не задали никаких параметров поиска. Добавим параметр, который покажет контракты только по Ярославской области. Добавляем к базовому URL вопросительный знак, название параметра (в нашем случае <strong>customerregion</strong>), знак равенства и номер региона (в нашем случае <strong>76</strong>).","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/e14ad3ed16ce4d4f9f718410abaaba38-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/e14ad3ed16ce4d4f9f718410abaaba38-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/e14ad3ed16ce4d4f9f718410abaaba38-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/e14ad3ed16ce4d4f9f718410abaaba38-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}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Нажмем Enter и увидим JSON-объект с контрактами. JSON это формат данных, который похож на <a href=\"https://istories.media/workshops/2020/12/09/vvedenie-v-python-chast-6-slovari/\" data-type=\"usual\" target=\"_blank\">словари</a> в Python. У нас есть список <strong>data</strong>, и каждый элемент в этом списке это словарь, у которого есть ключи и их значения: номер контракта, дата подписания, цена заключения и так далее.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/9faeb13ae1414f31b9c2460c779a9747-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/9faeb13ae1414f31b9c2460c779a9747-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":660,"real_height_2x":1320},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/9faeb13ae1414f31b9c2460c779a9747-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/9faeb13ae1414f31b9c2460c779a9747-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":660,"real_height_2x":1320}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Работаем с госконтрактами через API и Python","type":"h2","className":""},{"data":"Наконец, попробуем получить такие же данные с помощью программирования. В текстовой области нашего файла main.py апишем небольшую функцию: <strong>def get_contracts_by_region():</strong>. Пока она ничего не будет делать, поэтому внизу напишем <strong>pass</strong> — это ключевое слово будет временной «заглушкой».&nbsp;","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/caa57a308c9b485db9013a43cfced825-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/caa57a308c9b485db9013a43cfced825-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":320,"real_height_2x":640},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/caa57a308c9b485db9013a43cfced825-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/caa57a308c9b485db9013a43cfced825-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":320,"real_height_2x":640}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Теперь скопируем URL из браузера, который мы использовали для поиска госконтрактов по Ярославской области через API, создадим в проекте переменную <strong>url</strong> вместо <strong>pass</strong> и вставим туда наш адрес (не забывайте про кавычки).","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/17cb7c972c214717b446d9738b3fb29f-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/17cb7c972c214717b446d9738b3fb29f-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":228,"real_height_2x":457},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/17cb7c972c214717b446d9738b3fb29f-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/17cb7c972c214717b446d9738b3fb29f-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":228,"real_height_2x":457}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Далее используем нашу библиотеку Requests: на следующей строке дописываем data = requests.get(url), как делали в начале урока, и добавляем формат получаемых данных <strong>json</strong> (а не <strong>text</strong>, как до этого). Эти данные нам нужно вернуть с помощью <strong>return data</strong>.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/42a77cf49d0745b4a01e36c42c388e46-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/42a77cf49d0745b4a01e36c42c388e46-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":229,"real_height_2x":458},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/42a77cf49d0745b4a01e36c42c388e46-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/42a77cf49d0745b4a01e36c42c388e46-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":229,"real_height_2x":458}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Теперь проверим результат: присвоим нашей функции <strong>get_contracts_by_region()</strong> значение <strong>result</strong> и с помощью <strong>print</strong> посмотрим, что у нас получилось.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/7c69770cf0744f9dbbf6ef40a5ee4a07-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/7c69770cf0744f9dbbf6ef40a5ee4a07-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":662,"real_height_2x":1324},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/7c69770cf0744f9dbbf6ef40a5ee4a07-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/7c69770cf0744f9dbbf6ef40a5ee4a07-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":662,"real_height_2x":1324}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Как видите, сейчас в терминале мы получили тот же список контрактов, который до этого видели в браузере, но подготовленный для анализа программными методами.&nbsp;","type":"p","className":""},{"data":"Начинаем улучшать функцию","type":"h2","className":""},{"data":"Теперь сделаем так, чтобы наша функция возвращала данные не только из Ярославской области, но и из любого другого региона. Для этого зададим функции <strong>get_contracts_by_region()</strong> параметр <strong>region_code</strong> — этот параметр должен встать в следующую строку на место кода Ярославской области.&nbsp;","type":"p","className":""},{"data":"В <a href=\"https://istories.media/workshops/2020/11/18/vvedenie-v-python-chast-3/\" data-type=\"usual\" target=\"_blank\">одном из уроков</a> по введению в Python мы проходили форматирование строк, где рассказывали, что можно поставить букву <strong>f</strong> перед открывающими строку кавычками и далее внутрь кавычек вводить любые параметры в фигурных скобках <strong>{}</strong>. Сейчас это нам пригодится — вместо 76 мы вставим <strong>{region_code}</strong>.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/2d2bce8ba5864e9b9639359be8577747-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/2d2bce8ba5864e9b9639359be8577747-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":338,"real_height_2x":676},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/2d2bce8ba5864e9b9639359be8577747-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/2d2bce8ba5864e9b9639359be8577747-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":338,"real_height_2x":676}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"Попробуем снова вызвать нашу функцию, но уже с другим регионом 78 (Санкт-Петербург). Для этого в строку <strong>result get_contracts_by_region()</strong> добавим в скобки номер региона и запустим <strong>print</strong> еще раз.","type":"p","className":""},{"data":{"data":{"images":[{"credit":"В терминале мы получили все контракты из Санкт-Петербурга","caption":"","imagesList":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/a30e2550a4bb4857a72642fcece5be00-1200xautopx_1x.webp","url_2x":"https://static.istories.media/uploaded/images/a30e2550a4bb4857a72642fcece5be00-1200xautopx_2x.webp","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":695,"real_height_2x":1390},{"format":"png","url_1x":"https://static.istories.media/uploaded/images/a30e2550a4bb4857a72642fcece5be00-1200xautopx_1x.png","url_2x":"https://static.istories.media/uploaded/images/a30e2550a4bb4857a72642fcece5be00-1200xautopx_2x.png","for_width":1200,"for_height":"auto","real_width_1x":1200,"real_width_2x":2400,"real_height_1x":695,"real_height_2x":1390}]}]},"category":"image-embed"},"type":"image-embed"},{"data":"В следующих уроках мы продолжим улучшать функцию, добавляя ей новые возможности —&nbsp;чтобы она возвращала данные не только по регионам, но и по дате подписания, цене и другим параметрам, которые мы видели в документации к API портала «ГосЗатраты». Если у вас возникли вопросы по уроку — не стесняйтесь задавать их в нашем <a href=\"https://t.me/istories_helloworld\" data-type=\"usual\" target=\"_blank\">чате</a> в Telegram.","type":"p","className":""}],"created_at_date":"2021-04-23","updated_at_date":null,"created_at_date_time":null,"updated_at_date_time":null,"is_exclusive":false,"is_urgent":false,"initially_published_at":"2021-04-23T06:21:03.980Z","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/04/23/pishem-svoego-robota-na-python-urok-3/","is_published":true,"authors_list":[{"id":5,"lead":"Редактор «Важных историй»","_path":"roman-anin","avatar":[{"format":"webp","url_1x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-896x504px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-896x504px_2x.webp","for_width":896,"for_height":504,"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/1435d3e9c5384ab4902bab6b024b8c38-896x504px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-896x504px_2x.jpg","for_width":896,"for_height":504,"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/1435d3e9c5384ab4902bab6b024b8c38-688x387px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-688x387px_2x.webp","for_width":688,"for_height":387,"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/1435d3e9c5384ab4902bab6b024b8c38-688x387px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-688x387px_2x.jpg","for_width":688,"for_height":387,"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/1435d3e9c5384ab4902bab6b024b8c38-416x234px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-416x234px_2x.webp","for_width":416,"for_height":234,"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/1435d3e9c5384ab4902bab6b024b8c38-416x234px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-416x234px_2x.jpg","for_width":416,"for_height":234,"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/1435d3e9c5384ab4902bab6b024b8c38-336x189px_1x.webp","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-336x189px_2x.webp","for_width":336,"for_height":189,"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/1435d3e9c5384ab4902bab6b024b8c38-336x189px_1x.jpg","url_2x":"https://static.istories.media/uploaded/images/1435d3e9c5384ab4902bab6b024b8c38-336x189px_2x.jpg","for_width":336,"for_height":189,"real_width_1x":336,"real_width_2x":672,"real_height_1x":188,"real_height_2x":378}],"lead_en":"","ordering":null,"position":"Редактор","is_public":true,"last_name":"Анин","first_name":"Роман","position_en":"Editor","last_name_en":"Anin","first_name_en":"Roman"}],"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":254,"topics":[],"meta":{"og_title":"","og_description":"","twitter_title":"","twitter_description":"","og_image":"https://static.istories.media/uploaded/images/share/6eedd20c55c54d92a413a88242b14784.png","twitter_image":"https://static.istories.media/uploaded/images/share/6eedd20c55c54d92a413a88242b14784.png","vk_image":"https://static.istories.media/uploaded/images/share/vk/855573c88d764f969b0361ebdaf5516f.png"},"tags":["python","requests","ddj","api"],"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":{}}