Прогноз погоды — один из тех блоков, которые незаметно повышают ценность сайта: пользователь задерживается на странице, возвращается чаще, а контент выглядит «живым». Поэтому виджеты и блоки с погодой так часто встречаются на городских и туристических порталах, в сервисах бронирования и на сайтах о зарубежной недвижимости. В этой статье разберём, откуда брать погодные данные, какие API популярны в 2026 году, чем парсинг HTML отличается от работы через API, и покажем готовые реализации на Python, JavaScript, PHP и Go.
Что такое «парсинг погоды» и какие есть подходы
Под «парсингом погоды» обычно понимают две разные по сути задачи:
- Работа через официальный API. Сервис отдаёт структурированные данные (чаще всего JSON), вы делаете HTTP-запрос и получаете готовые поля: температуру, влажность, скорость ветра, код погодного явления. Это надёжный, легальный и предсказуемый путь.
- Парсинг 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)
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 с ключом и русской локализацией:
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 доступен из коробки — внешние зависимости не нужны.
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
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
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" +
"¤t=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-информер)
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 селекторы перестают работать, и его допустимо использовать только если это не противоречит условиям источника.
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, кэш. А правильно встроенный блок погоды заметно повышает вовлечённость на городских, туристических порталах и сайтах о недвижимости — там, где пользователю важен не только сам объект, но и контекст вокруг него.