Посібник зі скрапінгу даних Google Flights за допомогою Python

Коментарі: 0

Скрапінг даних про рейси з Google Flights може виявитися вкрай корисним для планування подорожей, аналізу конкурентів або досліджень у сфері туризму. Далі представлено покрокове керівництво для вилучення інформації про рейси, використовуючи бібліотеки Python, Playwright і lxml.

Встановлення необхідних бібліотек

Перед початком процесу скрапінгу переконайтеся, що встановлено необхідні бібліотеки Python:

pip install playwright
Pip install lxml

Для використання Playwright також необхідно встановити бінарні файли браузера. У цьому випадку ми встановимо тільки браузер Chromium:

playwright install chromium

Покроковий процес скрапінгу

Ми зосередимося на вилученні даних про рейси зі сторінки результатів пошуку Google Flights.

Крок 1. Розуміння структури сайту

Для вилучення даних з Google Flights важливо розуміти HTML-структуру сайту. Використовуючи інструменти розробника Chrome (Chrome DevTools), можна перевіряти елементи та знаходити необхідні для скрапінгу вирази XPath.

  1. Відкриття Chrome DevTools: клацніть правою кнопкою миші на сторінці Google Flights і виберіть "Inspect" або натисніть Ctrl+Shift+I (Windows/Linux) чи Cmd+Option+I (Mac).
  2. Інспекція елементів: наведіть курсор на різні елементи на сторінці, щоб виділити та перевірити HTML-структуру. Далі клікніть на елементи, щоб побачити їхні атрибути, які можна використовувати для створення виразів XPath.
  3. Пошук виразів XPath: клікніть правою кнопкою миші на потрібному елементі на панелі Elements, виберіть "Copy", а потім "Copy XPath", щоб отримати вираз XPath для цього елемента.

Список використовуваних виразів XPath:

From Location: //input[@aria-label="Where from?"]/@value
To Location: //input[@aria-label="Where to?"]/@value
Departure Date: //input[@placeholder="Departure"]/@value
Return Date: //input[@placeholder="Return"]/@value

Примітка: Цей вираз XPath повертає кілька елементів, кожен з яких відповідає окремому рейсу.

Flight Elements: //li[@class="pIav2d"]
Airway: .//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()
Details: .//span[@class="mv1WYe"]/@aria-label
Departure Time: .//span[@aria-describedby="gEvJbfc1583"]/span/text()
Arrival Time: .//span[@aria-describedby="gEvJbfc1584"]/span/text()
Travel Time: .//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()
Price: .//div[@class="YMlIz FpEdX"]/span/text()

Крок 2. Використання Playwright для надсилання HTTP-запитів і вилучення вмісту сторінки

Для взаємодії зі сторінкою та вилучення її вмісту ми застосовуємо Playwright. Цей інструмент особливо ефективний для керування динамічним контентом, який завантажується через JavaScript.

Playwright дає змогу запустити браузер у режимі без використання графічного інтерфейсу, перейти за вказаним URL і витягти вміст сторінки. Це робить його ідеальним вибором для роботи з сайтами, де вміст динамічно змінюється або довантажується після виконання початкового запиту.

from playwright.sync_api import sync_playwright

# URL сторінки пошуку Google Flights
url = "ссылка HTTPS"

def get_page_content(url):
    """ Витягує HTML-вміст зазначеної URL-адреси за допомогою Playwright."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)  # Запуск браузера в режимі без графічного інтерфейсу
        context = browser.new_context()  # Створення нового контексту браузера
        page = context.new_page()  # Відкриття нової сторінки
        page.goto(url)  # Перехід за вказаним URL
        content = page.content()  # Отримання вмісту сторінки
        browser.close()  # Закриття браузера
    return content

# Отримання вмісту сторінки
page_content = get_page_content(url)

Крок 3. Витяг загальних даних рейсу за допомогою XPath

Далі ми аналізуємо HTML-вміст відповіді з використанням lxml, щоб витягти загальні деталі рейсу, такі як дати відправлення та повернення.

from lxml import html

# Створення парсера
tree = html.fromstring(page_content)

# Витяг загальних даних рейсу з використанням XPath
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]  # Отримання місця відправлення
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]  # Отримання місця призначення
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]  # Отримання дати відправлення
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]  # Отримання дати повернення

Крок 4. Витяг конкретних даних про рейси з використанням lxml

Далі аналізуємо HTML-вміст для вилучення конкретної інформації про рейси на основі певних виразів XPath.

# Ініціалізація списку для зберігання деталей рейсів
flights = []

# Витяг даних про рейс із проаналізованого HTML з використанням XPath
flight_elements = tree.xpath('//li[@class="pIav2d"]')

# Цикл по кожному елементу рейсу та витяг даних
for flight in flight_elements:
    # Витяг назви авіакомпанії
    airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
    
    # Витяг даних рейсу, таких як пересадки
    details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
    
    # Витяг часу відправлення
    departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
    
    # Витяг часу прибуття
    arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
    
    # Витяг загального часу в дорозі
    travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
    
    # Витяг ціни рейсу
    price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()

    # Додавання витягнутих даних до списку рейсів у вигляді словника
    flights.append({
        'Airway': airway,
        'Details': details,
        'Departure': departure,
        'Arrival': arrival,
        'Travel Time': travel_time,
        'Price': price,
        'From': from_location,
        'To': to_location,
        'Departure Date': departure_date,
        'Return Date': return_date
    })

Крок 5. Збереження даних у файл CSV

Нарешті, ми використовуємо вбудований у Python модуль CSV для збереження витягнутих даних у файл CSV для подальшого аналізу.

import csv

# Визначення шляху до файлу CSV
csv_file = 'google_flights.csv'

# Визначення назв полів для CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# Запис даних у файл CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    for flight in flights:
        writer.writerow(flight)

print(f"Data saved to {csv_file}")

Фінальний код

from playwright.sync_api import sync_playwright
from lxml import html
import csv

# URL сторінки пошуку рейсів Google Flights
url = "link with https"

def get_page_content(url):
    """ Витягує HTML-вміст зазначеної URL-адреси за допомогою Playwright."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # Запуск браузера у звичайному режимі
        context = browser.new_context()  # Створення нового контексту браузера
        page = context.new_page()  # Відкриття нової сторінки
        page.goto(url)  # Перехід на вказаний URL
        page.wait_for_timeout(10000)  # Очікування 10 секунд для повного завантаження сторінки
        content = page.content()  # Отримання вмісту сторінки
        browser.close()  # Закриття браузера
    return content

# Отримання вмісту сторінки
page_content = get_page_content(url)

# Розбір HTML-вмісту з використанням lxml
tree = html.fromstring(page_content)

# Витяг інформації про пошук рейсів
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]

# Ініціалізація списку для зберігання даних про рейси
flights = []

# Витяг даних про рейси з проаналізованого HTML
flight_elements = tree.xpath('//li[@class="pIav2d"]')
for flight in flight_elements:
    airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
    details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
    departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
    arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
    travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
    price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()

    # Додавання даних до списку
    flights.append({
        'Airway': airway,
        'Details': details,
        'Departure': departure,
        'Arrival': arrival,
        'Travel Time': travel_time,
        'Price': price,
        'From': from_location,
        'To': to_location,
        'Departure Date': departure_date,
        'Return Date': return_date
    })

# Визначення шляху до файлу CSV
csv_file = 'google_flights.csv'

# Визначення назв полів для CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# Запис витягнутих даних у файл CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()  # Запис заголовного рядка
    for flight in flights:
        writer.writerow(flight)  # Запис даних кожного рейсу

print(f"Data saved to {csv_file}")

Щоб мінімізувати ризик виявлення в процесі скрапінгу, рекомендується використовувати затримки між запитами і застосовувати проксі. Ці заходи допомагають обходити системи захисту, призначені для блокування автоматизованих скриптів скрапінгу. Як проксі краще вибирати резидентські динамічні проксі-сервери, оскільки вони мають високий рівень довіри і не схильні до блокувань. Також можна використовувати пул статичних ISP проксі, які забезпечать високу швидкість і стабільність з'єднання в процесі вилучення даних.

Коментарії:

0 Коментаріїв