Untuk perencanaan perjalanan, analisis persaingan, atau tujuan penelitian, penggalian informasi terkait penerbangan dari Google Flights dapat menghasilkan wawasan yang signifikan. Berikut adalah tutorial langkah demi langkah tentang cara mengikis informasi penerbangan menggunakan pustaka Python, Playwright, dan lxml.
Sebelum masuk ke dalam proses scraping, pastikan Anda telah menginstal pustaka Python yang diperlukan:
pip install playwright
Pip install lxml
Untuk menggunakan Playwright, Anda juga perlu menginstal binari peramban:
playwright install chromium
Kita akan fokus pada mengekstrak data penerbangan dari halaman hasil pencarian Google Flights.
Untuk mengikis data dari Google Flights secara efektif, Anda harus membiasakan diri dengan struktur HTML situs web. Berikut ini cara menggunakan Chrome DevTools untuk memeriksa elemen dan mengambil ekspresi XPath yang diperlukan untuk mengikis:
Daftar ekspresi XPath yang digunakan:
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
Catatan: XPath ini mengembalikan beberapa elemen, masing-masing sesuai dengan penerbangan individual.
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()
Kita menggunakan Playwright untuk berinteraksi dengan halaman web dan mengekstrak kontennya. Pendekatan ini membantu menangani konten dinamis yang mungkin dimuat oleh JavaScript.
Menggunakan Playwright membantu menangani konten dinamis yang dimuat oleh JavaScript. Ini meluncurkan peramban tanpa kepala, menavigasi ke URL, dan mengekstrak konten halaman.
from playwright.sync_api import sync_playwright
# URL untuk halaman pencarian Google Flights
url = "https link"
def get_page_content(url):
"""Mengambil konten HTML dari URL yang diberikan menggunakan Playwright."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # Meluncurkan browser dalam mode tanpa kepala
context = browser.new_context() # Membuat konteks browser baru
page = context.new_page() # Buka halaman baru
page.goto(url) # Arahkan ke URL yang ditentukan
content = page.content() # Dapatkan konten halaman
browser.close() # Menutup browser
return content
# Mengambil konten halaman
page_content = get_page_content(url)
Selanjutnya, kita mem-parsing konten HTML dari respons menggunakan lxml untuk mengekstrak detail penerbangan umum seperti tanggal keberangkatan dan kepulangan.
from lxml import html
# Membuat pengurai
tree = html.fromstring(page_content)
# Mengekstrak detail penerbangan umum menggunakan XPath
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0] # Dapatkan lokasi 'dari'
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0] # Dapatkan lokasi 'ke'
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0] # Dapatkan tanggal keberangkatan
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0] # Dapatkan tanggal pengembalian
Kita kemudian mem-parsing konten HTML untuk mengekstrak informasi penerbangan tertentu berdasarkan ekspresi XPath yang teridentifikasi.
# Inisialisasi daftar kosong untuk menyimpan detail penerbangan
flights = []
# Mengekstrak elemen penerbangan dari HTML yang diuraikan menggunakan XPath
flight_elements = tree.xpath('//li[@class="pIav2d"]')
# Ulangi setiap elemen penerbangan dan ekstrak detailnya
for flight in flight_elements:
# Ekstrak nama maskapai penerbangan
airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
# Mengekstrak detail penerbangan seperti singgah
details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
# Ekstrak waktu keberangkatan
departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
# Ekstrak waktu kedatangan
arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
# Mengekstrak total waktu perjalanan
travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
# Ekstrak harga penerbangan
price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()
# Menambahkan detail yang diekstrak ke daftar penerbangan sebagai kamus
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
})
Terakhir, kita menggunakan modul CSV bawaan Python untuk menyimpan data yang telah diekstrak ke dalam file CSV untuk analisis lebih lanjut.
import csv
# Tentukan jalur file CSV
csv_file = 'google_flights.csv'
# Tentukan nama bidang CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']
# Menulis data ke file 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 untuk halaman pencarian Google Flights
url = "https link"
def get_page_content(url):
"""Mengambil konten HTML dari URL yang diberikan menggunakan Playwright."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # Meluncurkan browser dalam mode headful
context = browser.new_context() # Membuat konteks browser baru
page = context.new_page() # Buka halaman baru
page.goto(url) # Arahkan ke URL yang ditentukan
page.wait_for_timeout(10000) # Tunggu selama 10 detik untuk memastikan halaman dimuat sepenuhnya
content = page.content() # Dapatkan konten halaman
browser.close() # Menutup browser
return content
# Mengambil konten halaman
page_content = get_page_content(url)
# Mengurai konten HTML menggunakan lxml
tree = html.fromstring(page_content)
# Mengekstrak detail pencarian penerbangan
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]
# Menginisialisasi daftar untuk menyimpan detail penerbangan
flights = []
# Mengekstrak elemen penerbangan dari HTML yang diuraikan
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()
# Menambahkan detail penerbangan ke daftar
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
})
# Menentukan jalur file CSV
csv_file = 'google_flights.csv'
# Tentukan nama bidang CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']
# Menulis rincian penerbangan yang diekstrak ke file CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # Tulis baris tajuk
for flight in flights:
writer.writerow(flight) # Tuliskan detail setiap penerbangan
print(f"Data saved to {csv_file}")
Untuk mengurangi risiko terdeteksi saat mengikis data, disarankan untuk menggabungkan penundaan di antara permintaan dan memanfaatkan proksi. Menerapkan penundaan membantu meniru interaksi manusia, sehingga lebih sulit bagi situs web untuk mendeteksi aktivitas scraping otomatis. Untuk pemilihan proksi, proksi dinamis residensial direkomendasikan karena menawarkan tingkat kepercayaan yang tinggi dan kecil kemungkinannya untuk diblokir karena sifatnya yang dinamis. Sebagai alternatif, Anda bisa menggunakan kumpulan proksi ISP statis, yang menyediakan koneksi yang stabil dan cepat, meningkatkan keandalan proses ekstraksi data Anda. Strategi ini membantu menghindari langkah-langkah perlindungan yang digunakan situs web untuk mengidentifikasi dan memblokir bot pengikis.
Komentar: 0