August 7

Построение трекера рейсов с использованием данных Google Flights

Цены на авиабилеты могут колебаться на сотни долларов за считанные часы — реальность для тех, кто внимательно следит за рейсами. Google Flights содержит огромный объём ценных данных — расписания, тарифы, информацию об авиакомпаниях — но не предоставляет публичного API для доступа к ним. Для тех, кто хочет мониторить цены во времени, создавать инструменты сравнения или проводить глубокий анализ рынка, скрапинг — самый надёжный способ.
Этот гид расскажет о трёх эффективных способах получения данных с Google Flights: через Python и Playwright, с помощью сторонних API и через no-code инструменты для тех, кто не хочет программировать. Также обсудим анти-скрапинг защиту Google и сравним плюсы и минусы каждого метода.
Готовы? Поехали.

Использование Python и Playwright для скрапинга Google Flights

Google Flights — это тяжёлый JavaScript-зверь. Простые HTTP-запросы не вытянут нужные данные, так как контент загружается динамически. Чтобы скрапить, нужно имитировать действия реального пользователя — клики, вводы. Playwright отлично справляется с этим.

Шаг 1: Установка Playwright

pip install playwright
playwright install

Если нужно — добавьте BeautifulSoup для детального парсинга HTML, хотя встроенные селекторы Playwright часто достаточно мощные.

Шаг 2: Автоматизация браузера без интерфейса
Запускаем браузер, вводим детали поиска, ждём загрузки результатов, забираем данные со страницы:

import asyncio
from playwright.async_api import async_playwright

async def fetch_flights(departure, destination, date):
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.google.com/travel/flights")

        await page.fill("input[aria-label='Where from?']", departure)
        await page.fill("input[aria-label='Where to?']", destination)
        await page.fill("input[aria-label='Departure date']", date)
        await page.keyboard.press("Enter")

        await page.wait_for_selector("li.pIav2d")

        flights = []
        flight_items = await page.query_selector_all("li.pIav2d")
        for item in flight_items:
            airline = await item.query_selector("div.sSHqwe.tPgKwe.ogfYpf")
            price = await item.query_selector("div.FpEdX span")
            time = await item.query_selector("span[aria-label^='Departure time']")
            flights.append({
                "airline": await airline.inner_text() if airline else None,
                "price": await price.inner_text() if price else None,
                "departure_time": await time.inner_text() if time else None
            })

        await browser.close()
        return flights

results = asyncio.run(fetch_flights("LAX", "JFK", "2025-12-01"))
print(results)

Шаг 3: Загрузка всех рейсов
Google Flights ограничивает количество видимых результатов. Нужно кликать «Показать больше рейсов» до тех пор, пока кнопка не исчезнет:

while True:
    try:
        more_button = await page.wait_for_selector('button[aria-label*="more flights"]', timeout=5000)
        await more_button.click()
        await page.wait_for_timeout(2000)
    except TimeoutError:
        break

Шаг 4: Масштабирование с прокси
Частые запросы с одного IP приведут к блокировке. Используйте ротацию резидентских прокси, чтобы распределять запросы. Playwright позволяет настраивать прокси на уровне браузерного контекста.

Шаг 5: Сохраняйте, анализируйте, повторяйте
Экспортируйте данные в JSON или CSV. Отслеживайте падения цен, анализируйте тенденции бронирования, интегрируйте в свои приложения. Данные — ваши.

Сторонние API

Не хотите возиться с автоматизацией браузера? Сторонние API делают всю работу за вас: имитируют поиск, меняют IP, решают CAPTCHA, возвращают чистый JSON.

Пример с SerpApi на Python:

import requests

params = {
    "engine": "google_flights",
    "q": "Flights from NYC to LON, one-way, 2025-12-25",
    "api_key": "YOUR_SERPAPI_API_KEY"
}

response = requests.get("https://serpapi.com/search", params=params)
data = response.json()

for flight in data.get("best_flights", []):
    print(flight.get("airline"), flight.get("price"))

Почему API? Быстро. Нет головной боли с поддержкой. Надёжные данные и обновления без написания логики скрапинга. Минус — стоимость и лимиты запросов. Для многих это оправдано.

No-Code инструменты

Не программист? Не проблема. Инструменты типа Octoparse, ParseHub, Apify позволяют скрапить через удобный интерфейс.

Пример с Octoparse:

  • Вставьте URL Google Flights.
  • Octoparse автоматически распознаёт списки рейсов и ключевые поля (цена, авиакомпания, время).
  • Настройте, если хотите добавить данные (пересадки, продолжительность).
  • Запустите скрапер — он сам пройдёт по страницам и соберёт данные.
  • Экспортируйте в CSV, Excel, JSON или Google Sheets.

Инструменты сами справляются с ротацией IP и решением CAPTCHA. Быстро и доступно, но с меньшей гибкостью. Если Google изменит сайт — потребуется перенастройка.

Как обойти защиту Google от скрапинга

Google активно борется со скрапингом — блокировки IP, капчи. Вот как не попасться:

  • Ротация IP: Используйте качественные резидентские прокси — выглядите как реальные пользователи.
  • Замедляйте запросы: Рандомизируйте действия и паузы, имитируя поведение человека.
  • Автоматизация решения CAPTCHA: Подключайте сервисы типа 2Captcha или AntiCaptcha.
  • Будьте аутентичными: Используйте реальные User-Agent заголовки, иногда запускайте браузер в видимом режиме.
  • Начинайте с малого: Тестируйте, корректируйте, масштабируйте постепенно. Терпение и упорство — ключ к успеху.

Итог

Скрапинг Google Flights открывает доступ к мощному набору данных — тенденции цен, аналитика бронирований, конкурентные исследования и многое другое. Хотите ли вы кодить собственный скрейпер, использовать API или no-code решения — главное — умная стратегия и правильные инструменты.