Пишем свой прогноз погоды на Python
easy

Пишем свой прогноз погоды на Python

С настоящими данными из сервиса погоды

У Практикума появился новый бесплатный мини-курс — «Прогноз погоды на Python за час». Мы посмотрели, как он работает, и решили повторить это у себя в статье — как обычно, с комментариями и разбором. При этом на курсе всё удобнее — там в тренажёре можно сразу увидеть результат и получить совет, как исправить ошибки, если они появятся. 

Можете сейчас пролистать статью, а потом пойти потренироваться в Практикуме. У них написано, что это приключение на час, но описанная в этой статье часть займёт минут пятнадцать. Вводить данные карты не нужно. Выглядит так:

Пишем свой прогноз погоды на Python

Что делаем

Пишем скрипт, который покажет погоду в выбранном городе. Для этого мы:

  1. Подключаемся к службе погоды OpenWeather.
  2. Выбираем город.
  3. Получаем текущую температуру воздуха в этом городе и то, как она ощущается.
  4. Выводим результаты на экран.

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

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

Если будете делать в тренажёре Практикума, там среда уже настроена, можно просто делать без установки.

Подключаемся к службе погоды

Чтобы скрипт мог отправлять запросы к другим серверам, нам понадобится библиотека requests. Если вы делаете всё в тренажёре Практикума, эта библиотека уже установлена. А для установки её на свой компьютер нужно открыть терминал и выполнить такую команду:

pip install requests

После установки мы сразу можем подключить библиотеку к своему скрипту. Это уже пишем в коде, а не в терминале:

import requests

С этого момента наша программа будет знать, как отправлять запросы на сервер и получать в ответ новые данные. Теперь сделаем переменную с городом, погоду в котором нам интересно узнать:

city = 'Сочи'

Город в переменной может стоять любой — Москва, Брянск, Тула, Воронеж или что угодно ещё. Главное, чтобы о нём знала служба погоды OpenWeather.

Перед тем как отправить запрос, нам нужно его сформировать: подготовить специальную строку, которую сервер сможет обработать, чтобы вернуть нам данные о погоде. Она будет состоять из трёх частей:

  1. Адреса сервера, к которому мы отправляем запрос → https://api.openweathermap.org/data/2.5/weather
  2. Города, температуру в котором нам интересно узнать → он лежит в переменной city
  3. Служебных параметров: единиц измерения и ключа приложения → &units=metric&lang=ru&appid=79d1ca96933b0328e1c7e3e7a26cb347

Собираем всё вместе и кладём результат в переменную url:

url = 'https://api.openweathermap.org/data/2.5/weather?q='+city+'&units=metric&lang=ru&appid=79d1ca96933b0328e1c7e3e7a26cb347'

Теперь подробнее про службу погоды.

Служба погоды OpenWeather

OpenWeather — это погодный сервис, который собирает данные о погоде в городах со всего мира. У него есть сайт, на который можно зайти, вбить свой город и узнать погоду на сегодня (на английском):

Пишем свой прогноз погоды на Python

Но особенность этого сервиса в том, что он ещё умеет отвечать на внешние запросы — такие же, как мы сформировали в скрипте.

Если мы заменим переменную в адресе на конкретный город, а затем вставим эту строку в браузер и перейдём по этому адресу, то получим полную информацию о погоде и расположении этого города:

https://api.openweathermap.org/data/2.5/weather q=Сочи&units=metric&lang=ru&appid=79d1ca96933b0328e1c7e3e7a26cb347

Пишем свой прогноз погоды на Python
Если прокрутить страницу вправо, можно увидеть много разных данных о городе

А вот что нам вернул сервер:

{"coord":{"lon":39.7303,"lat":43.6},"weather":[{"id":804,"main":"Clouds","description":"пасмурно","icon":"04d"}],"base":"stations","main":{"temp":21.72,"feels_like":21.57,"temp_min":20.05,"temp_max":21.72,"pressure":1013,"humidity":62,"sea_level":1013,"grnd_level":1012},"visibility":10000,"wind":{"speed":1.19,"deg":104,"gust":1.54},"clouds":{"all":94},"dt":1685769007,"sys":{"type":2,"id":48811,"country":"RU","sunrise":1685756528,"sunset":1685811390},"timezone":10800,"id":491422,"name":"Сочи","cod":200}

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

Это JSON. Обратите внимание на строку выше. Это называется JSON — JavaScript Object Notation. Это способ передать структурированные данные от одной программы к другой, используя при этом строку текста. В этой строке зашифрованы объекты, их свойства и значения.

Например, видно, что сначала мы задаём нечто под названием coord (координаты), внутри него лежат две сущности lon и lat — широта и долгота. В каждой из этих сущностей лежат числа. Получается, что мы зашифровали в строке какие-то координаты. Благодаря этой разметке можно вкладывать много сущностей друг в друга и передавать так данные между программами. Читайте подробнее об этом в нашей статье про JSON.

Отправляем запрос и выводим результат

Для отправки запроса в службу погоды используем команду requests.get().json()

Команда Get() отвечает за сам запрос, а json() разбирает ответ в json-формате на составляющие, с которыми потом будет удобно работать:

weather_data = requests.get(url).json()

После этой команды в переменной weather_data появятся все данные с сервера. Чтобы посмотреть их в удобном виде, используем такие команды:

weather_data_structure = json.dumps(weather_data, indent=2)
print(weather_data_structure)

Пишем свой прогноз погоды на Python

Видно, что данные остались теми же, но стали выглядеть структурированно и понятно. Например, можно заметить, что данные о погоде лежат в разделе main в блоке temp. Используем это, чтобы вывести значение температуры в выбранном городе и то, как она ощущается. Сразу округлим значения функцией round(), чтобы воспринимать градусы было удобнее:

# получаем данные о температуре и о том, как она ощущается
temperature = round(weather_data['main']['temp'])
temperature_feels = round(weather_data['main']['feels_like'])
# выводим значения на экран
print('Сейчас в городе', city, str(temperature), '°C')
print('Ощущается как', str(temperature_feels), '°C')

Пишем свой прогноз погоды на Python

# подключаем библиотеку для работы с запросами
import requests
# указываем город
city = 'Сочи'
# формируем запрос
url = 'https://api.openweathermap.org/data/2.5/weather?q='+city+'&units=metric&lang=ru&appid=79d1ca96933b0328e1c7e3e7a26cb347'
# отправляем запрос на сервер и сразу получаем результат
weather_data = requests.get(url).json()
# получаем данные о температуре и о том, как она ощущается
temperature = round(weather_data['main']['temp'])
temperature_feels = round(weather_data['main']['feels_like'])
# выводим значения на экран
print('Сейчас в городе', city, str(temperature), '°C')
print('Ощущается как', str(temperature_feels), '°C')

Что дальше

Теперь, когда вы знаете, как выглядит структура данных с ответом от сервера и как получить к ним доступ, вы сможете вывести:

  • скорость ветра;
  • время рассвета и заката;
  • облачность;
  • координаты города;
  • и много других параметров.

Если хотите разобраться с тем, как работать с такими данными и что ещё можно с ними сделать, — пройдите бесплатный тренажёр «Прогноз погоды на Python за час». Там есть моменты, которые мы не разбирали в статье, — про работу функций и json-форматирование.

Попробуйте бесплатное в «Яндекс Практикуме»
В «Яндекс Практикуме» есть бесплатные курсы, на которых можно получить полезные навыки для работы в ИТ: от Git и Excel до основ Python и облачных технологий.
Учиться бесплатно
Попробуйте бесплатное в «Яндекс Практикуме» Попробуйте бесплатное в «Яндекс Практикуме» Попробуйте бесплатное в «Яндекс Практикуме» Попробуйте бесплатное в «Яндекс Практикуме»
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy