Баннер мобильный (3) Пройти тест

Python Requests: что это за библиотека и как ее использовать

Учимся получать данные с сайтов

Разбор

23 сентября 2024

Поделиться

Скопировано
Python Requests: что это за библиотека и как ее использовать

Содержание

    Расскажем о популярной библиотеке Requests и о том, как с ее помощью создавать запросы. На простом примере покажем, как получить данные о погоде для какого-либо города при помощи Requests.

    Как установить Python Requests

    В Python много разных библиотек. Они есть буквально на все случаи жизни. Библиотеки в «Питоне» есть для математических вычислений, для построения разных графиков и диаграмм и даже для составления гороскопов. Все эти библиотеки можно найти на этом сайте.

    Python Requests — это библиотека, позволяющая отправлять HTTP-запросы разного уровня сложности веб-сервисам и получать от них соответствующие ответы. Иными словами, при помощи этой библиотеки можно, например, получить прогноз погоды на завтрашний день для своего родного города. В этом нам и поможет Python Requests. 

    Установим эту библиотеку перед началом использования. Для этого в терминале вводим команду:

    pip install requests

    После выполнения команды можно смело пользоваться библиотекой. Далее рассмотрим, как именно ее можно использовать.

    Как писать запросы с помощью Python Requests

    Прежде чем создавать запрос, сначала нужно импортировать библиотеку. В самом начале файла нужно написать:

    import requests

    Теперь можно двигаться дальше. Создадим запрос для адреса https://api.github.com/events. Вообще, существует несколько видов запросов. Самый распространенный — это GET-запрос. Он нужен для получения данных с сервера. Кроме него, есть еще POST. Он применяется для отправки данных на сервер. Имеется также DELETE, и, как видно из названия, этот метод HTTP-запроса нужен для удаления данных. Имеются и другие методы. В этой статье мы разберем самый популярный метод — GET. Итак, для создания этого запроса нам понадобится объект response:

    response = requests.get('https://api.github.com/events')

    Как видно, объект response создается при помощи метода get, вызванного для requests. Далее мы можем получить содержимое ответа в текстовом виде при помощи свойства text, примененного к response:

    print(response.text)

    В результате ответ на запрос будет примерно таким:

    [{"id":"41737092768","type":"CreateEvent","actor":{"id":12455471,"login":"osushizm","display_login":"osushizm","gravatar_id":"","url":"https://api.github.com/users/osushizm","avatar_url":"https://avatars.githubusercontent.com/u/12455471?"},"repo":{"id":854399860,"name":"osushizm/Movie-Record","url":"https://api.github.com/repos/osushizm/Movie-Record"},"payload":{"ref":null,"ref_type":"repository","master_branch":"main","description":null,"pusher_type":"user"},"public":true,"created_at":"2024-09-09T05:23:34Z"},{"id":"41737092764","type":"IssueCommentEvent","actor":{"id":112790289,"login":"bearlion1996","display_login":"bearlion1996","gravatar_id":"","url":"https://api.github.com/users/bearlion1996","avatar_url":"https://avatars.githubusercontent.com/u/112790289?"}
    
    

    Выше показана только небольшая часть ответа. При помощи метода json, который, так же как и свойство text, следует вызывать для response, можно получить ответ в виде json-файла. Но этот метод доступен не для каждого ресурса, а только для тех, которые могут отправлять данные в этом формате. Вообще, ответ в формате json — это словарь, а значит, доступ к каждому из значений, существующих в этом словаре, можно получить через ключ. Вот так можно получить содержимое ответа при помощи json:

    print(response.json())

    А вот небольшой фрагмент ответа с сервера:

    [{'id': '41737046069', 'type': 'PushEvent', 'actor': {'id': 12962539, 'login': 'gentoo-repo-qa-bot', 'display_login': 'gentoo-repo-qa-bot', 'gravatar_id': '', 'url': 'https://api.github.com/users/gentoo-repo-qa-bot', 'avatar_url': 'https://avatars.githubusercontent.com/u/12962539?'}, 'repo': {'id': 37827379, 'name': 'gentoo-mirror/R_Overlay', 'url': 'https://api.github.com/repos/gentoo-mirror/R_Overlay'}, 'payload': {'repository_id': 37827379, 'push_id': 20140837987, 'size': 1, 'distinct_size': 1, 'ref': 'refs/heads/master', 'head': 'a13bfd16fb8e9f553d74d2954f09a369ab9e1611', 'before': '64ed5a19702ef9538516d3bfea73de5845fc5493', 'commits': [{'sha': 'a13bfd16fb8e9f553d74d2954f09a369ab9e1611', 'author': {'email': 'repomirrorci@gentoo.org', 'name': 'Repository mirror & CI'}

    Если известны ключи (некоторые выражения в одинарных кавычках из json-файла), то можно вытянуть с сервера любую доступную информацию. Для этого потребуется создать объект data:

    data = response.json()

    В data будет храниться весь массив данных ресурса. Остается только извлечь нужные нам данные из этого массива. Далее посмотрим, как это можно сделать, на примере приложения, которое показывает погоду на следующий день для какого-либо города.

    Прогноз погоды: применяем Python Requests на практике

    Рассмотрим, как можно получить прогноз погоды для города Иркутск при помощи библиотеки Requests. Для примера возьмем такой исходник:

    import requests
    
    BASE_URL = "https://api.open-meteo.com/v1/forecast"
    
    params = {
        "latitude": 52.2978,       # широта Иркутска
        "longitude": 104.296,      # долгота Иркутска
        "daily": "temperature_2m_min,temperature_2m_max,precipitation_sum", # минимальная и максимальная температура, сумма осадков
        "timezone": "Asia/Irkutsk"  # временная зона для Иркутска 
    }
    
    response = requests.get(BASE_URL, params=params)
    
    if response.status_code == 200:
        data = response.json()
        # Поскольку индекс 0 представляет собой данные на текущий день, индекс 1 будет представлять данные на завтра
        tomorrow_temp_min = data['daily']['temperature_2m_min'][1]
        tomorrow_temp_max = data['daily']['temperature_2m_max'][1]
        tomorrow_precipitation = data['daily']['precipitation_sum'][1]
        
        print(f"Прогноз погоды в Иркутске на завтра:")
        print(f"Минимальная температура: {tomorrow_temp_min}°C")
        print(f"Максимальная температура: {tomorrow_temp_max}°C")
        print(f"Ожидаемое количество осадков: {tomorrow_precipitation} мм")
    else:
        print(f"Ошибка {response.status_code}: {response.text}")
    
    

    Сначала в переменной BASE_URL прописываем адрес ресурса, с которого будем получать данные. Далее определяем параметры params. В них прописываем широту и долготу города, для которого будем определять погоду. Также в параметрах прописываем, какие именно данные о погоде нам нужно получить. В нашем случае это минимальная и максимальная температура, а также ожидаемое количество осадков. Еще нужно указать временную зону города (timezone).

    Теперь переменную BASE_URL и список параметров params подаем на вход метода get и таким образом создаем response. Дальше при помощи условного оператора if узнаем, есть ли ответ от сервера, и если есть, то создаем объект data. И теперь с помощью data можно получить с сервера все интересующие нас данные и записать их в соответствующие переменные. Остается только вывести их в консоль с помощью функции print.

    Сохраним вышеприведенный исходник в файле с именем weather.py и запустим программу с помощью команды:

    python3 weather.py

    Получим приблизительно такой ответ:

    alex@alex-pc:~$ python3 weather.py
    Прогноз погоды в Иркутске на завтра:
    Минимальная температура: 6.7°C
    Максимальная температура: 17.3°C
    Ожидаемое количество осадков: 0.0 мм
    alex@alex-pc:~$ 

    Данные с ресурса получены. Программа отработала на отлично! Как видим, в использовании библиотеки Requests нет ничего особо сложного. Код получается достаточно легко читаемым и лаконичным.

    Задание для самостоятельного выполнения

    Напишите программу для определения завтрашней погоды в Москве. Добавьте в программу определение времени восхода и захода солнца. Для выполнения задания воспользуйтесь документацией Open-Meteo.

    Решение

    Используем тот же исходник, только заменим некоторые значения параметров и добавим новые. Изменяем долготу и широту города, а также его временную зону (timezone). Исходя из документации (раздел Daily Parameter Definition), нам понадобится пара новых параметров. Это параметры sunrise (время восхода солнца) и sunset (время захода солнца). Вносим их в params в раздел daily. Создаем две новые переменные по образцу уже существующих и дополняем команды для вывода результатов в консоль. В общем, исходный текст программы будет примерно таким:

    import requests
    
    BASE_URL = "https://api.open-meteo.com/v1/forecast"
    
    # Параметры запроса для Москвы
    params = {
        "latitude": 55.7522,       # широта Москвы
        "longitude": 37.6156,      # долгота Москвы
        "daily": "temperature_2m_min,temperature_2m_max,precipitation_sum,sunrise,sunset", # минимальная и максимальная температура, сумма осадков, время восхода и захода солнца
        "timezone": "Europe/Moscow"  # временная зона Москвы 
    }
    
    response = requests.get(BASE_URL, params=params)
    
    if response.status_code == 200:
        data = response.json()
        # Поскольку индекс 0 представляет собой данные на текущий день, индекс 1 будет представлять данные на завтра
        tomorrow_temp_min = data['daily']['temperature_2m_min'][1]
        tomorrow_temp_max = data['daily']['temperature_2m_max'][1]
        tomorrow_precipitation = data['daily']['precipitation_sum'][1]
        tomorrow_sunrise = data['daily']['sunrise'][1]
        tomorrow_sunset = data['daily']['sunset'][1]
        
        print(f"Прогноз погоды в Москве на завтра:")
        print(f"Минимальная температура: {tomorrow_temp_min}°C")
        print(f"Максимальная температура: {tomorrow_temp_max}°C")
        print(f"Ожидаемое количество осадков: {tomorrow_precipitation} мм")
        print(f"Время восхода солнца: {tomorrow_sunrise}")
        print(f"Время захода солнца: {tomorrow_sunset}")
    else:
        print(f"Ошибка {response.status_code}: {response.text}")

    Результат выполнения программы:

    alex@alex-pc:~$ python3 weather-msk.py
    Прогноз погоды в Москве на завтра:
    Минимальная температура: 13.5°C
    Максимальная температура: 25.0°C
    Ожидаемое количество осадков: 0.0 мм
    Время восхода солнца: 2024-09-11T05:54
    Время захода солнца: 2024-09-11T18:57
    alex@alex-pc:~$ 
    
    

    Разбор

    Поделиться

    Скопировано
    0 комментариев
    Комментарии