Скрапінг даних про рейси з Google Flights може виявитися вкрай корисним для планування подорожей, аналізу конкурентів або досліджень у сфері туризму. Далі представлено покрокове керівництво для вилучення інформації про рейси, використовуючи бібліотеки Python, Playwright і lxml.
Перед початком процесу скрапінгу переконайтеся, що встановлено необхідні бібліотеки Python:
pip install playwright
Pip install lxml
Для використання Playwright також необхідно встановити бінарні файли браузера. У цьому випадку ми встановимо тільки браузер Chromium:
playwright install chromium
Ми зосередимося на вилученні даних про рейси зі сторінки результатів пошуку Google Flights.
Для вилучення даних з Google Flights важливо розуміти HTML-структуру сайту. Використовуючи інструменти розробника Chrome (Chrome DevTools), можна перевіряти елементи та знаходити необхідні для скрапінгу вирази 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()
Для взаємодії зі сторінкою та вилучення її вмісту ми застосовуємо 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)
Далі ми аналізуємо 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] # Отримання дати повернення
Далі аналізуємо 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
})
Нарешті, ми використовуємо вбудований у 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 проксі, які забезпечать високу швидкість і стабільність з'єднання в процесі вилучення даних.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Коментарі: 0