Парсинг погоды: источники данных, API и реализации на разных языках

Где брать данные о погоде: открытые API, метеосервисы, парсинг сайтов-агрегаторов и реализация сборщика на разных языках.

КP
Команда Parsing.agency
Сбор данных под задачи бизнеса
Опубликовано: 3 апреля 2025

Прогноз погоды — один из тех блоков, которые незаметно повышают ценность сайта: пользователь задерживается на странице, возвращается чаще, а контент выглядит «живым». Поэтому виджеты и блоки с погодой так часто встречаются на городских и туристических порталах, в сервисах бронирования и на сайтах о зарубежной недвижимости. В этой статье разберём, откуда брать погодные данные, какие API популярны в 2026 году, чем парсинг HTML отличается от работы через API, и покажем готовые реализации на Python, JavaScript, PHP и Go.

Что такое «парсинг погоды» и какие есть подходы

Под «парсингом погоды» обычно понимают две разные по сути задачи:

  1. Работа через официальный API. Сервис отдаёт структурированные данные (чаще всего JSON), вы делаете HTTP-запрос и получаете готовые поля: температуру, влажность, скорость ветра, код погодного явления. Это надёжный, легальный и предсказуемый путь.
  2. Парсинг HTML-страниц (web scraping). Когда у источника нет API или он платный, разработчики вытаскивают данные прямо из вёрстки сайта. Это работает, но хрупко: при любом изменении HTML парсер ломается, а сам подход нередко нарушает пользовательское соглашение источника.

Практический вывод простой: всегда, когда есть API, используйте API. Парсинг оставляйте на случай, когда другого источника действительно нет, и обязательно проверяйте robots.txt и условия использования.

Популярные источники данных и API

Open-Meteo — бесплатно и без ключа

Open-Meteo — один из самых удобных вариантов для старта. API не требует ключа для некоммерческого использования, отдаёт данные в JSON и агрегирует прогнозы национальных метеослужб с разрешением от 1 до 11 км. Для коммерческих проектов есть отдельные платные тарифы с месячными лимитами запросов. Идеально подходит для прототипов, виджетов и open-source-проектов.

OpenWeatherMap — классика с большим бесплатным лимитом

OpenWeatherMap остаётся самым растиражированным в туториалах сервисом. В 2026 году у него по-прежнему есть рабочий бесплатный путь, но важно понимать, какой именно продукт вы вызываете. Классические эндпоинты (текущая погода, 3-часовой прогноз, загрязнение воздуха, погодные карты, геокодинг) доступны бесплатно с лимитом 60 запросов в минуту и до 1 000 000 запросов в месяц. Продукты семейства One Call (3.0 / 4.0) — отдельные подписки с тарификацией по вызовам, где бесплатно идёт первая 1000 запросов в день. Перед продакшеном стоит поставить ограничитель расходов, чтобы случайно не выйти за бесплатный порог.

WeatherAPI.com — щедрый бесплатный тариф

WeatherAPI.com отдаёт текущую погоду, почасовой и дневной прогноз, исторические данные, астрономию и геолокацию в JSON и XML. Удобный выбор, когда нужен один провайдер «на всё» с понятным бесплатным лимитом.

Visual Crossing — сильные исторические данные

Visual Crossing часто называют одним из лучших по соотношению цены и возможностей: единый API для текущей погоды, прогнозов, оповещений и особенно длинных исторических рядов. Есть бесплатный ключ и Query Builder для сборки запросов с экспортом в JSON или CSV. Хороший вариант для аналитики и дашбордов.

Платформы для бизнеса: Tomorrow.io, Weatherbit, Meteomatics, meteoblue

Если нужны узкоспециализированные параметры (около 500 у Tomorrow.io, более 1800 у Meteomatics, исторические ряды с 1940 года), смотрите в сторону корпоративных платформ. Они дают высокую точность и огромный набор параметров, но почти всегда требуют платной подписки для коммерческого использования.

Региональные источники: Яндекс.Погода и Gismeteo

  • Яндекс.Погода. Сейчас API ориентирован в первую очередь на бизнес и работает через GraphQL (v3) с доступом по тестовому ключу и 7-дневным пробным периодом. Есть также REST-тариф «Погода на вашем сайте» с эндпоинтом информеров https://api.weather.yandex.ru/v2/informers и авторизацией через заголовок X-Yandex-Weather-Key. Технология Meteum агрегирует данные метеорадаров, спутников, глобальных моделей и метеоплощадок.
  • Gismeteo. Предоставляет информеры и закрытый сервис данных; для интеграции обычно требуется согласование условий с сервисом.

Государственные и официальные службы

Для США есть бесплатный и без ключа API Национальной метеослужбы (NWS, weather.gov) — отличный выбор для гражданских и общественных проектов в пределах страны. Официальным источником выступают национальные метеослужбы. Государственные источники бесплатны и авторитетны, но обычно ограничены конкретной территорией.

Сравнение по ключевым критериям

Источник Ключ Бесплатный тариф Покрытие Хорош для
Open-Meteo Не нужен (некомм.) Да, щедрый Глобально Прототипы, виджеты, open-source
OpenWeatherMap Нужен Да (классические эндпоинты) Глобально Универсальные задачи
WeatherAPI.com Нужен Да Глобально «Всё в одном»
Visual Crossing Нужен Да Глобально История, аналитика
Tomorrow.io / Meteomatics Нужен Триал/лимит Глобально Бизнес, узкие параметры
Яндекс.Погода Нужен 7-дневный триал региональное покрытие Рунет, B2B
NWS (weather.gov) Не нужен Да Только США Гражданские проекты в США

Реализации на разных языках

Во всех примерах ниже используется Open-Meteo, потому что для него не нужен ключ — код можно запустить сразу. Координаты в примерах — Тбилиси (41.69, 44.80). Чтобы перейти на другой провайдер, обычно достаточно сменить URL, добавить ключ и поправить разбор JSON.

Python (requests)

python
import requests

def get_weather(lat: float, lon: float) -> dict:
    url = "https://api.open-meteo.com/v1/forecast"
    params = {
        "latitude": lat,
        "longitude": lon,
        "current": "temperature_2m,relative_humidity_2m,wind_speed_10m,weather_code",
        "timezone": "auto",
    }
    response = requests.get(url, params=params, timeout=10)
    response.raise_for_status()
    return response.json()

data = get_weather(41.69, 44.80)
current = data["current"]
print(f"Температура: {current['temperature_2m']}°C")
print(f"Влажность: {current['relative_humidity_2m']}%")
print(f"Ветер: {current['wind_speed_10m']} км/ч")

Версия для OpenWeatherMap с ключом и русской локализацией:

python
import requests

API_KEY = "ВАШ_КЛЮЧ"

def get_weather_owm(city: str) -> dict:
    url = "https://api.openweathermap.org/data/2.5/weather"
    params = {"q": city, "units": "metric", "lang": "ru", "appid": API_KEY}
    response = requests.get(url, params=params, timeout=10)
    response.raise_for_status()
    d = response.json()
    return {
        "город": d["name"],
        "температура": d["main"]["temp"],
        "ощущается": d["main"]["feels_like"],
        "описание": d["weather"][0]["description"],
    }

print(get_weather_owm("Тбилиси"))

JavaScript / Node.js (нативный fetch)

В Node.js 18+ fetch доступен из коробки — внешние зависимости не нужны.

javascript
async function getWeather(lat, lon) {
  const url = new URL("https://api.open-meteo.com/v1/forecast");
  url.searchParams.set("latitude", lat);
  url.searchParams.set("longitude", lon);
  url.searchParams.set("current", "temperature_2m,wind_speed_10m,weather_code");
  url.searchParams.set("timezone", "auto");

  const response = await fetch(url);
  if (!response.ok) {
    throw new Error(`HTTP ошибка: ${response.status}`);
  }
  return response.json();
}

getWeather(41.69, 44.80)
  .then((data) => {
    const c = data.current;
    console.log(`Температура: ${c.temperature_2m}°C, ветер: ${c.wind_speed_10m} км/ч`);
  })
  .catch((err) => console.error("Не удалось получить погоду:", err.message));

PHP (cURL)

php
<?php
function getWeather(float $lat, float $lon): ?array
{
    $query = http_build_query([
        'latitude'  => $lat,
        'longitude' => $lon,
        'current'   => 'temperature_2m,wind_speed_10m,weather_code',
        'timezone'  => 'auto',
    ]);
    $url = "https://api.open-meteo.com/v1/forecast?{$query}";

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_USERAGENT      => 'WeatherWidget/1.0',
    ]);
    $body = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($body === false || $code !== 200) {
        return null;
    }
    return json_decode($body, true);
}

$data = getWeather(41.69, 44.80);
if ($data !== null) {
    echo "Температура: " . $data['current']['temperature_2m'] . "°C\n";
}

Go

go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "time"
)

type WeatherResponse struct {
    Current struct {
        Temperature float64 `json:"temperature_2m"`
        WindSpeed   float64 `json:"wind_speed_10m"`
        WeatherCode int     `json:"weather_code"`
    } `json:"current"`
}

func main() {
    url := "https://api.open-meteo.com/v1/forecast" +
        "?latitude=41.69&longitude=44.80" +
        "&current=temperature_2m,wind_speed_10m,weather_code&timezone=auto"

    client := &http.Client{Timeout: 10 * time.Second}
    resp, err := client.Get(url)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    var data WeatherResponse
    if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
        panic(err)
    }
    fmt.Printf("Температура: %.1f°C, ветер: %.1f км/ч\n",
        data.Current.Temperature, data.Current.WindSpeed)
}

Запрос к API Яндекс.Погоды (REST-информер)

bash
curl -H "X-Yandex-Weather-Key: ВАШ_КЛЮЧ" \
  "https://api.weather.yandex.ru/v2/informers?lat=55.75&lon=37.62&lang=ru_RU"

Парсинг HTML как запасной вариант (Python + BeautifulSoup)

Когда API недоступен, данные можно вытащить из вёрстки. Подход рабочий, но хрупкий: при изменении HTML селекторы перестают работать, и его допустимо использовать только если это не противоречит условиям источника.

python
import requests
from bs4 import BeautifulSoup

def scrape_weather(url: str) -> str:
    headers = {"User-Agent": "Mozilla/5.0"}
    html = requests.get(url, headers=headers, timeout=10).text
    soup = BeautifulSoup(html, "html.parser")
    # Селектор подбирается под конкретную страницу-источник
    temp = soup.select_one(".temperature")
    return temp.get_text(strip=True) if temp else "не найдено"

Расшифровка weather_code в Open-Meteo идёт по стандарту WMO: например, 0 — ясно, 2 — переменная облачность, 61 — небольшой дождь, 71 — небольшой снег. Полную таблицу кодов держите в виде словаря-маппинга, чтобы выводить пользователю человекочитаемое описание.

Кэширование, лимиты и правовые нюансы

Несколько правил, которые экономят деньги и нервы в продакшене:

  • Кэшируйте ответы. Погода почти никогда не должна обновляться на каждый просмотр страницы. Кэшируйте по координатам, городу или почтовому индексу, а текущие условия обновляйте раз в 5–15 минут. Для мобильных приложений направляйте запросы через свой бэкенд, а не из каждого клиента напрямую.
  • Держите ключи на сервере. API-ключ нельзя зашивать в клиентский код — его легко украсть. Запросы должны идти через ваш backend-прокси.
  • Следите за лимитами. Настройте обработку ответов 401 (неверный ключ), 429 (превышен лимит) и алерты на резкий рост числа вызовов.
  • Проверяйте лицензию. Большинство бесплатных тарифов разрешают только некоммерческое использование. Некоторые сервисы (Visual Crossing, OpenWeatherMap) допускают ограниченное коммерческое использование с указанием источника. Для парсинга всегда проверяйте robots.txt и пользовательское соглашение.

Где это применяется: порталы, туризм и недвижимость

Блок с погодой — это типовая «фишка» проектов, завязанных на географию и образ жизни пользователя:

  • Городские порталы показывают текущую погоду и прогноз на главной — это удерживает аудиторию и делает сайт точкой ежедневного входа.
  • Туристические порталы и сервисы бронирования добавляют погоду к карточке направления: путешественнику важно понимать, что его ждёт в точке назначения.
  • Сайты о зарубежной недвижимости используют погоду как часть «продажи климата»: солнечные дни, мягкая зима и комфортная температура — весомый аргумент при выборе жилья у моря или в горах.

Любопытно, что технически парсинг погоды стоит в одном ряду с другой популярной задачей таких проектов — сбором и агрегацией объявлений. Если погода делает карточку направления «живой», то наполнение каталога объектами обеспечивает парсинг недвижимости: автоматический сбор предложений с площадок-источников, нормализация цен и характеристик, обновление базы. Часто эти два модуля работают бок о бок — один отвечает за контент об объекте, другой за контекст вокруг него.

Ссылку (/parsing-nedvizhimosti/) замените на актуальный URL вашей страницы о парсинге недвижимости.

Заключение

Для большинства задач начинать стоит с Open-Meteo (быстрый старт без ключа) или OpenWeatherMap (богатый бесплатный лимит и зрелая экосистема). Если важны исторические данные — смотрите на Visual Crossing, если нужен Рунет и B2B — на Яндекс.Погоду. Технически интеграция занимает считанные строки на любом языке: HTTP-запрос, разбор JSON, кэш. А правильно встроенный блок погоды заметно повышает вовлечённость на городских, туристических порталах и сайтах о недвижимости — там, где пользователю важен не только сам объект, но и контекст вокруг него.