Panduan untuk Scraping Data Google Flights dengan Python

Komentar: 0

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.

Menyiapkan lingkungan Anda

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

Proses pengikisan langkah demi langkah

Kita akan fokus pada mengekstrak data penerbangan dari halaman hasil pencarian Google Flights.

Langkah 1. Memahami struktur situs web

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:

  1. Buka Chrome DevTools dengan mengklik kanan pada halaman Google Flights dan pilih "Inspect", atau gunakan pintasan Ctrl+Shift+I (Windows/Linux) atau Cmd+Option+I (Mac).
  2. Memeriksa elemen dengan mengarahkan kursor ke berbagai bagian halaman. Ini akan menyorot struktur HTML di DevTools. Klik pada elemen tertentu untuk melihat atributnya, yang sangat penting untuk membuat ekspresi XPath yang akurat.
  3. Ambil ekspresi XPath dengan mengklik kanan pada elemen yang diinginkan pada panel Elemen, pilih "Salin", lalu pilih "Salin XPath". Ini akan menyalin ekspresi XPath langsung ke clipboard Anda, siap untuk digunakan dalam skrip scraping Anda.

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()

Langkah 2. Mengirim permintaan HTTP dan mengekstrak konten halaman dengan Playwright

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)

Langkah 3. Mengekstrak detail umum menggunakan XPath

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

Langkah 4. Mengekstrak data penerbangan tertentu menggunakan lxml

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
    })

Langkah 5. Menyimpan data ke CSV

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}")

Menyatukan semuanya

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 komentar