Как собирать данные с Google Flights с помощью Python: пошаговое руководство
Здесь я покажу, как создать Google Flights скрапер на Python с использованием библиотеки Playwright. Мы пройдем все шаги по порядку: от настройки окружения до извлечения и сохранения данных. Также я поделюсь советами по решению типичных проблем при веб-скрапинге, таких как Блокировки по IP и CAPTCHA, поскольку такие проверки часто появляются на сайтах с высокой посещаемостью, например на Google Flights. Давайте начнем!
Зачем собирать данные с Google Flights?
Скрейпинг Google Flights открывает доступ к обширному массиву данных о перелетах, которые можно использовать несколькими способами:
- Tracking Price Changes: Отслеживайте, как со временем меняются цены на авиабилеты, чтобы определить лучшее время для бронирования.
- Comparing Flight Options: Найдите рейсы, которые соответствуют конкретным требованиям, например беспосадочные рейсы, более короткие пересадки или более доступные варианты.
- Market Analysis: Для бизнеса отслеживание данных по авиакомпаниям и маршрутам может дать представление о ценовых стратегиях и рыночных тенденциях.
- Environmental Impact: Извлеките данные о выбросах CO2, чтобы оценить экологическое воздействие различных вариантов перелёта.
Лучшие инструменты для автоматизированного сбора данных Google Flights
Вот список различных инструментов, которые помогут автоматизировать процесс сбора данных и сэкономить много времени, а возможно, и ресурсов:
Let’s start by setting up the environment to build our custom Google Flights scraper.
Шаг 1: Настройка среды Python
Прежде чем переходить к написанию кода, убедитесь, что у вас чистое окружение Python. Лучше использовать виртуальное окружение, чтобы изолировать зависимости.
Создайте и активируйте виртуальное окружение
Откройте терминал и выполните следующие команды:
# Create a virtual environment
python -m venv flights-scraper-env
# Activate the virtual environment
# On Windows:
.\flights-scraper-env\Scripts\activate
# On macOS/Linux:
источник flights-scraper-env/bin/activate
Install Necessary Packages
Мы будем использовать Playwright для взаимодействия с сайтом Google Flights, поскольку он эффективно автоматизирует действия на динамических веб-страницах. Tenacity поможет с механизмами повторных попыток и повысит надежность.
# Install required packages
pip install playwright tenacity asyncio
# Install Playwright's browser dependencies
playwright install chromium
Шаг 2: Определите структуры данных
Чтобы код был лучше организован, мы определим классы данных для хранения параметров поиска и извлекаемых данных о рейсах.
с сайта dataclasses импорт dataclass
с сайта typing импорт Optional
@dataclass
класс SearchParameters: departure: str
destination: str
departure_date: str
return_date: Optional[str] = Нет
ticket_type: str = "В одну сторону"
@dataclass
класс FlightData: airline: str
departure_time: str
arrival_time: str
duration: str
stops: str
price: str
co2_emissions: str
emissions_variation: str
- SearchParameters хранит сведения, необходимые для поиска рейса.
- FlightData хранит информацию о каждом рейсе, включая авиакомпанию, время, длительность, количество пересадок, цену и выбросы CO2.
Шаг 3: Создание класса для скрейпера рейсов
Ядро нашего скрапера будет находиться в классе FlightScraper, который мы будем собирать поэтапно.
Define CSS Selectors
Использование CSS-селекторов позволяет нам нацеливаться на конкретные элементы страницы, чтобы извлекать такие данные, как название авиакомпании, время вылета, цена и т. д.
класс FlightScraper:
SELECTORS = {
"airline": "div.sSHqwe.tPgKwe.ogfYpf",
"departure_time": 'span[aria-label^="Departure time"]',
"arrival_time": 'span[aria-label^="Arrival time"]',
"duration": 'div[aria-label^="Total duration"]',
"stops": "div.hF6lYb span.rGRiKd",
"цена": "div.FpEdX span",
"co2_emissions": "div.O7CXue",
"emissions_variation": "div.N6PNV",
}
Эмулируем заполнение формы поиска
Мы будем использовать асинхронные функции Playwright, чтобы имитировать ввод пользователем параметров поиска в Google Flights.
async def _fill_search_form(self, page, params: SearchParameters) -> Нет:
ticket_type_div = page.locator("div.VfPpkd-TkwUic[jsname='oYxtQd']").first
ожидайте ticket_type_div.click()
ожидайте page.locator("li").filter(has_text=params.ticket_type).nth(0).click()
from_input = page.locator("input[aria-label='Where from?']")
ожидайте from_input.fill(params.departure)
to_input = page.locator("input[aria-label='Where to?']")
ожидайте to_input.fill(params.destination)
date_input = page.locator("input[aria-label='Departure date']")
ожидайте date_input.fill(params.departure_date)
Загрузить все доступные рейсы
Google Flights часто требует, чтобы пользователи нажимали «Показать больше рейсов», чтобы увидеть все варианты. Автоматизируйте это с помощью цикла, который нажимает эту кнопку, пока больше рейсов не будет отображаться.
async def _load_all_flights(self, page) -> Нет:
в то время как Правда:
попробуйте:
more_button = ожидайте page.wait_for_selector(
'button[aria-label*="more flights"]', timeout=5000
)
если more_button:
ожидайте more_button.click()
ожидайте page.wait_for_timeout(2000)
else:
перерыв
кроме:
перерыв
Extract Flight Data
Когда все рейсы станут видимыми, пройдите по элементам каждого рейса и извлеките сведения с помощью CSS-селекторов.
async def _extract_flight_data(self, page) -> list[FlightData]:
ожидайте page.wait_for_selector("li.pIav2d", timeout=30000)
flights = ожидайте page.query_selector_all("li.pIav2d")
flights_data = []
для flight в flights:
flight_info = {}
для key, selector в self.SELECTORS.items():
element = ожидайте flight.query_selector(selector)
flight_info[key] = ожидайте self._extract_text(element)
flights_data.append(FlightData(**flight_info))
возврат flights_data
Шаг 4: Реализация логики повторных попыток для повышения надёжности
Чтобы сделать наш скрапер более устойчивым, мы реализуем механизм повторных попыток с помощью библиотеки tenacity, которая повторно вызывает функцию при возникновении определённых ошибок.
с сайта tenacity импорт retry, stop_after_attempt, wait_fixed
@retry(stop=stop_after_attempt(3), wait=wait_fixed(5))
async def search_flights(self, params: SearchParameters) -> list[FlightData]:
async с async_playwright() в роли p:
браузер = ожидайте p.chromium.launch(headless=Правда)
context = ожидайте browser.new_context()
page = ожидайте context.new_page()
ожидайте page.goto("https://www.google.com/flights")
ожидайте self._fill_search_form(page, params)
flights = ожидайте self._extract_flight_data(page)
ожидайте browser.close()
возврат flights
Шаг 5: Сохраните результаты в JSON-файл
После того как вы соберете данные, сохраните их в JSON-файл для удобного доступа и анализа.
import json
с сайта datetime import datetime def save_results(self, flights: list[FlightData], params: SearchParameters) -> str:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"flight_results_{params.departure}_{params.destination}_{timestamp}.json"
output_data = {
"search_parameters": vars(params),
"flights": [vars(flight) для flight в flights],
}
с открыть(filename, "w", кодировка="utf-8") в роли f:
json.dump(output_data, f, indent=2, ensure_ascii=False)
возврат filename
Шаг 6: Запуск скрапера
Вот как запустить парсер с примерами параметров поиска.
импорт asyncio
async def главная():
scraper = FlightScraper()
params = SearchParameters(
departure="LAX",
destination="JFK",
departure_date="2024–12–01",
ticket_type="В одну сторону"
)
попробуйте:
flights = ожидайте scraper.search_flights(params)
scraper.save_results(flights, params)
печать("Flights scraped successfully.")
кроме Исключение в роли e:
печать(f"Ошибка во время поиска рейса: {str(e)}")
если __name__ == "__main__":
asyncio.run(main())
Преодоление распространенных проблем при парсинге: блокировка IP и CAPTCHA
Сбор данных из Google Flights сопряжён с уникальными сложностями. Вот как с ними справиться:
- IP Blocking: Используйте ротацию прокси, чтобы избежать обнаружения со стороны антискрапинговых механизмов Google.
- CAPTCHAs: Реализуйте решения для обхода CAPTCHA, такие как Bright Data’s Web Unlocker, который может автоматически обходить проверки CAPTCHA.
Заключение
Сбор данных из Google Flights даёт глубокое понимание маршрутов поездок, цен и вариантов авиакомпаний. Настроив скрейпер на Python с Playwright и соблюдая лучшие практики надёжности, вы сможете извлекать ценные данные о рейсах для личного или бизнес-использования. Чтобы повысить эффективность при масштабировании, существенно поможет использование proxy и инструментов для обработки CAPTCHA. Это руководство дало вам базовые шаги, а с Python ваши возможности по сбору данных из Google Flights практически безграничны!

