Продолжаем наш цикл уроков, где мы пишем робота на Python, который будет собирать данные крупнейших госконтрактов в России и присылать их вам на почту. Сегодня мы поработаем с библиотекой Requests, научимся получать данные из сети и разберемся, что такое API. 

Видео: Глеб Лиманский

Откроем наш проект в редакторе Visual Studio Code, очистим терминал уже известной нам командой clear, чтобы было удобнее работать, и активируем виртуальное окружение командой pipenv shell.

В прошлый раз мы установили библиотеку Requests — она позволяет нам делать запросы (те самые requests) и получать данные из интернета. Для примера возьмем одну из статей «Важных историй» и попробуем проанализировать ее текст.

Делаем первый запрос

Чтобы начать пользоваться библиотекой Requests, ее нужно импортировать в наш файл. Для этого в текстовой области нашего файла main.py пишем import requests и выполняем команду. 

Далее нужно задать адрес страницы, содержимое которой мы хотим получить и проанализировать. В нашем примере это будет статья «Чудесная вилла на острове миллионеров». Скопируем ее адрес и создадим в нашем файле новую переменную url = ‘адрес нужной страницы’. Обратите внимание, что адрес мы записываем обязательно в кавычках, чтобы он не переносился на новую строку.

Теперь, чтобы получить данные, нам нужна всего одна строчка кода. Создадим новую переменную data с использованием библиотеки Requests и метода get, который мы направляем на нашу статью, то есть url: data = requests.get(url).

Распечатаем полученные данные и посмотрим, что вышло: print(data).

Мы видим, что в терминале нам вернулся Response [200] — это значит, что наш запрос был успешно отправлен, и сервер нам ответил. Чтобы посмотреть, что именно ответил сервер, нужно добавить опцию text — тогда команда примет вид print(data.text). Посмотрим, что теперь отобразится в терминале.

Как видите, мы получили сырые данные — HTML-код всей страницы, доступной по заданному нами адресу. В этих данных есть множество ненужных нам элементов. Текст можно проанализировать даже в таком виде, но для этого нам бы пришлось установить еще несколько библиотек. В будущем мы расскажем о таких библиотеках. Но все-таки лучше получать данные в нормальном виде, и в этом нам помогут API. 

API — это аббревиатура от английского application programming interface, то есть, это интерфейс приложения со своим набором функций. API используются буквально везде: в платежных системах, в онлайн-бронировании, в социальных сетях. Давайте посмотрим, как это работает на примере.

Пробуем работать с госконтрактами вручную

Для работы с госконтрактами мы будем использовать сервис «ГосЗатраты». Под капотом у сервиса — данные с официального портала госконтрактов. Попробуем для начала поискать что-нибудь в «ГосЗатратах» с помощью поисковой строки на сайте — так, как это делают обычные пользователи. 

Сервис «ГосЗатраты»: clearspending.ru
Расширенный поиск

Выбираем раздел «Контракты», нажимаем на «Расширенный поиск». Теперь попробуем получить все госконтракты из Ярославской области — в списке «Регион госзаказчика» выбираем нужную область и нажимаем кнопку «Найти».

У нас появился список госконтрактов. Теперь отфильтруем контракты по дате заключения. Вернемся к параметрам расширенного поиска и в пункте «Дата заключения контракта» выберем, например, период с 1 по 7 апреля и снова нажмем «Найти».

Мы получили 57 контрактов из Ярославской области, заключенных с 1 по 7 апреля. Теперь их можно отсортировать от самых крупных к самым мелким, нажав на кнопку «по сумме контракта».

С одной стороны, мы уже получили очень интересные данные для анализа. С другой стороны, мы ограничены в дальнейшем анализе этих данных — например, мы не можем быстро посчитать сумму всех заключенных за неделю контрактов, для этого нам придется скачивать их, вручную открывать каждый в Excel и только затем считать. Для автоматизации таких задач и существует API.

Давайте внимательно посмотрим на адресную строку страницы с нашими госконтрактами.

В строке перечислены различные параметры: в productsearch пусто, в других тоже, а вот в datarange есть значения — они совпадают с теми датами, которые задавали при поиске. Если мы прямо в адресной строке изменим эти значения — соответственно изменится и поисковая выдача. Например, заменим 7 апреля на 1 апреля, чтобы отобразились госконтракты только за 1 апреля, и нажмем Enter, чтобы перезагрузить страницу с обновленным адресом.

Меняем дату на 1 апреля
Мы получили контракты только за 1 апреля — их 28

Попробуем сделать то же самое с регионом. У нас есть параметр customerregion и его значение 76, которое соответствует коду Ярославской области. Поменяем его на 77 (Москва) и еще раз нажмем Enter.

Меняем регион на 77
Мы получили контракты из Москвы за 1 апреля

Только что вы сделали первые запросы к API какого-то сервиса, в данном случае «ГосЗатрат». Но, конечно, API придумывалось не для того, чтобы вручную менять какие-то данные в адресной строке. 

Тестируем работу API в браузере

Чтобы разобраться, как работает API «ГосЗатрат», нужно почитать документацию и изучить, какие есть методы и как лучше с ними работать. В документации мы видим базовый URL, а ниже перечислены параметры поиска, которые можно использовать. Некоторые из них мы уже встречали — например, datarange и customerregion.

Попробуем воспользоваться знаниями из документации и настроить поиск в адресной строке браузера с нуля. Скопируем базовый URL и перейдем по нему. Мы увидим надпись «Invalid request», потому что не задали никаких параметров поиска. Добавим параметр, который покажет контракты только по Ярославской области. Добавляем к базовому URL вопросительный знак, название параметра (в нашем случае customerregion), знак равенства и номер региона (в нашем случае 76).

Нажмем Enter и увидим JSON-объект с контрактами. JSON это формат данных, который похож на словари в Python. У нас есть список data, и каждый элемент в этом списке это словарь, у которого есть ключи и их значения: номер контракта, дата подписания, цена заключения и так далее.

Работаем с госконтрактами через API и Python

Наконец, попробуем получить такие же данные с помощью программирования. В текстовой области нашего файла main.py апишем небольшую функцию: def get_contracts_by_region():. Пока она ничего не будет делать, поэтому внизу напишем pass — это ключевое слово будет временной «заглушкой». 

Теперь скопируем URL из браузера, который мы использовали для поиска госконтрактов по Ярославской области через API, создадим в проекте переменную url вместо pass и вставим туда наш адрес (не забывайте про кавычки).

Далее используем нашу библиотеку Requests: на следующей строке дописываем data = requests.get(url), как делали в начале урока, и добавляем формат получаемых данных json (а не text, как до этого). Эти данные нам нужно вернуть с помощью return data.

Теперь проверим результат: присвоим нашей функции get_contracts_by_region() значение result и с помощью print посмотрим, что у нас получилось.

Как видите, сейчас в терминале мы получили тот же список контрактов, который до этого видели в браузере, но подготовленный для анализа программными методами. 

Начинаем улучшать функцию

Теперь сделаем так, чтобы наша функция возвращала данные не только из Ярославской области, но и из любого другого региона. Для этого зададим функции get_contracts_by_region() параметр region_code — этот параметр должен встать в следующую строку на место кода Ярославской области. 

В одном из уроков по введению в Python мы проходили форматирование строк, где рассказывали, что можно поставить букву f перед открывающими строку кавычками и далее внутрь кавычек вводить любые параметры в фигурных скобках {}. Сейчас это нам пригодится — вместо 76 мы вставим {region_code}.

Попробуем снова вызвать нашу функцию, но уже с другим регионом 78 (Санкт-Петербург). Для этого в строку result get_contracts_by_region() добавим в скобки номер региона и запустим print еще раз.

В терминале мы получили все контракты из Санкт-Петербурга

В следующих уроках мы продолжим улучшать функцию, добавляя ей новые возможности — чтобы она возвращала данные не только по регионам, но и по дате подписания, цене и другим параметрам, которые мы видели в документации к API портала «ГосЗатраты». Если у вас возникли вопросы по уроку — не стесняйтесь задавать их в нашем чате в Telegram.