Как получать актуальные данные о погоде в Python: web scraping и API

Python остаётся одним из самых простых и гибких инструментов для получения данных из интернета. Получив данные о погоде, вы можете использовать их для визуализаций, оповещений или небольшого веб-приложения. Ниже — пошаговые инструкции, примеры кода и практические рекомендации по безопасности, тестированию и развертыванию.
Ключевые варианты решения
- Web scraping (парсинг HTML-страниц): быстрый старт без регистрации, но хрупок и потенциально нарушает условия использования сайтов.
- Официальные API (например, OpenWeatherMap): стабильнее и чище по данным, требует ключа и ограничений по тарифу.
Получение текущей погоды через web scraping
Web scraping — автоматический сбор данных с веб-страниц. Большинство сайтов возвращают HTML, который необходимо парсить, чтобы извлечь нужные поля (город, время, температуру, описание погодных условий).
Библиотека BeautifulSoup — стандарт де-факто для парсинга HTML/XML в Python. Установите её вместе с requests:
pip install beautifulsoup4 requestsПример минимального скрипта для поиска погоды через результат Google-поиска (пояснения ниже):
from bs4 import BeautifulSoup
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
def find_weather(city_name):
# Заменяем пробелы для корректного запроса
city_name = city_name.replace(" ", "+")
try:
res = requests.get(
f'https://www.google.com/search?q={city_name}&oq={city_name}&aqs=chrome.0.35i39l2j0l4j46j69i60.6128j1j7&sourceid=chrome&ie=UTF-8',
headers=headers
)
print("Загрузка...")
soup = BeautifulSoup(res.text, 'html.parser')
location = soup.select('#wob_loc')[0].getText().strip()
time = soup.select('#wob_dts')[0].getText().strip()
info = soup.select('#wob_dc')[0].getText().strip()
temperature = soup.select('#wob_tm')[0].getText().strip()
print("Местоположение: " + location)
print("Температура: " + temperature + "°C")
print("Время: " + time)
print("Описание погоды: " + info)
except Exception:
print("Пожалуйста, введите корректное название города")
# Запуск
city_name = input("Введите название города: ")
city_name = city_name + " weather"
find_weather(city_name)Как это работает:
- Открываете результат поиска в браузере и используете инструменты разработчика (Inspect) для поиска идентификаторов элементов (например, #wob_loc, #wob_tm и т.д.).
- Метод select() принимает CSS-селектор и возвращает совпадающие элементы. getText() извлекает текст, strip() убирает лишние пробелы.
Важно:
- Web scraping ненадёжен к изменениям страницы. Структура HTML может поменяться в любой момент — ваш код сломается.
- Перед парсингом изучите robots.txt и условия использования сайта. В некоторых случаях автоматический сбор данных может быть запрещён.
Примеры проблем и когда scraping не подойдёт
- Страницы сильно зависят от JavaScript: простого requests + BeautifulSoup может быть недостаточно — потребуется headless-браузер (Selenium, Playwright).
- Ограничения по скорости запросов и блокировки по IP. Требуется ротация прокси или планирование.
- Юридические ограничения и правила сайта. В предприятиях чаще предпочитают официальные API.
Получение текущей погоды через OpenWeatherMap API
OpenWeatherMap предоставляет стабильный API с глобальными данными: текущее состояние, прогнозы, исторические данные. Бесплатный тариф обычно ограничивает частоту запросов (например, до 60 вызовов/минуту — уточняйте на сайте). Для работы нужен API-ключ (ключ храните в секрете).
Заведите аккаунт на OpenWeatherMap и получите ключ на странице “My API Keys”.
Пример запроса и обработки ответа:
# Импорт библиотек
import requests
# Вставьте сюда ваш OpenWeatherMap API-ключ
# НЕ публикуйте ключ в публичных репозиториях
API_Key = "Your_API_Key"
# Ввод города
city_name = input("Введите название города: ")
# Формирование URL запроса (текущая погода)
url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={API_Key}"
# Запрос к API
response = requests.get(url)
res = response.json()
# Если города найден — обрабатываем
if res.get("cod") != "404":
data = res.get("main", {})
# Температура в Кельвинах по умолчанию
live_temperature_k = data.get("temp")
live_pressure = data.get("pressure")
desc = res.get("weather", [])
weather_description = desc[0].get("description") if desc else None
# Переводим в градусы Цельсия (если есть температура)
if live_temperature_k is not None:
live_temperature_c = live_temperature_k - 273.15
print(f"Температура: {live_temperature_c:.1f} °C")
else:
print("Температура недоступна")
print("Давление: " + str(live_pressure))
print("Описание: " + str(weather_description))
else:
print("Пожалуйста, введите корректное название города")Советы по работе с API:
- Секреты и ключи храните в переменных окружения или в .env-файле, не коммитьте их.
- Добавьте обработку ошибок сети и ограничений по частоте (retry с экспоненциальной задержкой).
- Для пользовательских приложений кешируйте ответы на несколько минут, чтобы снизить число вызовов и улучшить UX.
Разработка простого погодного приложения
После получения данных вы можете сделать:
- Командное приложение, возвращающее краткую сводку.
- Веб-приложение (Flask/FastAPI/Django), где пользователь вводит город и получает карточку с погодой.
- Бота (Telegram/Slack), который по команде присылает текущую погоду.
Мини-методология для проекта (быстрая итерация):
- Прототип: реализуйте один источник данных (API) и CLI для локальной проверки.
- Тестирование: создайте тесты для обработки ошибок (неверный город, сеть, 5xx).
- Безопасность: вынесите ключи в конфиг/Secrets Manager, настройте лимиты и кеш.
- UI: сделайте простую веб-страницу с карточкой погоды и возможностью выбора города.
- Мониторинг: добавьте логирование ошибок и метрики запросов (SLA/SLI при необходимости).
Когда использовать scraping, а когда API — правило-памятка
flowchart TD
A[Нужны данные о погоде?] --> B{Есть официальный API с нужными данными?}
B -- Да --> C[Используйте API]
B -- Нет --> D{Можно ли законно парсить сайт?}
D -- Да --> E[Используйте scraping + осторожность]
D -- Нет --> F[Рассмотрите альтернативные источники или платные API]
C --> G[Обработка, кеш, мониторинг]
E --> G
F --> GМентальные модели и эвристики
- “Источник правды”: предпочитайте официальные API для критичных приложений.
- “Дубль-кеш”: кешируйте результаты на 1–10 минут в зависимости от требований точности.
- “Fail-fast”: при отсутствии данных покажите понятное сообщение пользователю и логируйте причину.
Чек-листы по ролям
Разработчик:
- Реализовать обработку ошибок сети (timeouts, 5xx).
- Валидировать ввод города на стороне сервера и клиента.
- Не сохранять API-ключи в репозитории.
QA:
- Тесты на отсутствие соединения.
- Тесты на неверный город и локализацию текста.
- Тесты на граничные значения (ноль, отрицательные температуры, большие названия городов).
DevOps:
- Настроить переменные окружения для ключей.
- Ограничить частоту запросов на уровне прокси/балансировщика.
- Настроить алерты по росту ошибки 5xx или превышению лимитов API.
Product/PM:
- Определить требования к точности и частоте обновления данных.
- Принять решение об использовании бесплатного/платного API.
Критерии приёмки
- CLI и/или веб-интерфейс возвращают корректную погоду по заданному городу.
- Вся чувствительная информация (API-ключи) хранится вне репозитория.
- Система корректно обрабатывает ошибки сети и неверные входные данные.
- Тесты покрывают основные сценарии отказа.
Безопасность и конфиденциальность
- Никогда не публикуйте API-ключи в публичных репозиториях.
- Для production используйте Secrets Manager или переменные окружения.
- Если вы храните логи с IP или пользовательскими данными, убедитесь, что они не нарушают правила конфиденциальности (GDPR/локальные законы).
- Для массовых запросов используйте авторизованные платные API-решения, чтобы избежать блокировок и юридических рисков.
Альтернативные источники данных
- Meteostat — метеорологические данные и исторические наблюдения.
- Weatherbit — альтернативный API с бесплатным тарифом.
- Национальные метеоагентства (иногда дают open data).
Отладка и тесты (кейсы)
- Ввод: “NonExistentCity” → ожидаемый вывод: дружелюбная ошибка.
- Сеть: симулировать тайм-аут → ожидание: повтор с backoff и лог.
- Пагинация/локали: запрос с разными локализациями language=ru → корректное описание погоды.
Подход к миграции от scraping к API
- Запустить параллельно вариант с API и scraping для сравнения данных в течение N дней.
- Сравнить разницу в показаниях и задержках.
- Перейти на API, если качество и SLA удовлетворяют требованиям.
Резюме
- Web scraping подходит для быстрого прототипа, но ненадёжен и потенциально рискован.
- API (OpenWeatherMap и аналоги) предпочтительнее для продакшна: стабильность, корректность данных и поддержка.
- Всегда защищайте API-ключи, кешируйте ответы и обрабатывайте ошибки сети.
Важно: Начинайте с небольшого прототипа, добавляйте мониторинг и тесты перед выпуском в продакшн.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента