Гид по технологиям

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

5 min read Python Обновлено 16 Dec 2025
Погодные данные в Python — scraping и API
Погодные данные в Python — 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)

Скриншот Chrome: проверка HTML-элементов с погодой в New Delhi

Как это работает:

  • Открываете результат поиска в браузере и используете инструменты разработчика (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”.

Скриншот страницы OpenWeatherMap с API-ключами

Пример запроса и обработки ответа:

# Импорт библиотек
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.

Пример JSON-ответа с данными погоды в New Delhi от OpenWeatherMap

Разработка простого погодного приложения

После получения данных вы можете сделать:

  • Командное приложение, возвращающее краткую сводку.
  • Веб-приложение (Flask/FastAPI/Django), где пользователь вводит город и получает карточку с погодой.
  • Бота (Telegram/Slack), который по команде присылает текущую погоду.

Мини-методология для проекта (быстрая итерация):

  1. Прототип: реализуйте один источник данных (API) и CLI для локальной проверки.
  2. Тестирование: создайте тесты для обработки ошибок (неверный город, сеть, 5xx).
  3. Безопасность: вынесите ключи в конфиг/Secrets Manager, настройте лимиты и кеш.
  4. UI: сделайте простую веб-страницу с карточкой погоды и возможностью выбора города.
  5. Мониторинг: добавьте логирование ошибок и метрики запросов (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

  1. Запустить параллельно вариант с API и scraping для сравнения данных в течение N дней.
  2. Сравнить разницу в показаниях и задержках.
  3. Перейти на API, если качество и SLA удовлетворяют требованиям.

Резюме

  • Web scraping подходит для быстрого прототипа, но ненадёжен и потенциально рискован.
  • API (OpenWeatherMap и аналоги) предпочтительнее для продакшна: стабильность, корректность данных и поддержка.
  • Всегда защищайте API-ключи, кешируйте ответы и обрабатывайте ошибки сети.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро