Python ile Google Flights Veri Kazıma Rehberi

Yorumlar: 0

Seyahat planlaması, rekabet analizi veya araştırma amaçları söz konusu olduğunda, Google Flights'tan uçuşla ilgili bilgileri kazımak önemli bilgiler sağlayabilir. İşte Python, Playwright ve lxml kütüphanelerini kullanarak uçuş bilgilerinin nasıl kazınacağına dair adım adım bir eğitim.

Ortamınızı ayarlama

Kazıma işlemine başlamadan önce, gerekli Python kütüphanelerinin kurulu olduğundan emin olun:

pip install playwright
Pip install lxml

Playwright'ı kullanmak için tarayıcı ikili dosyalarını da yüklemeniz gerekir:

playwright install chromium

Adım adım kazıma işlemi

Google Flights arama sonuçları sayfasından uçuş verilerini çıkarmaya odaklanacağız.

Adım 1. Web sitesinin yapısını anlama

Google Flights'tan etkili bir şekilde veri kazımak için web sitesinin HTML yapısına aşina olmanız gerekir. Öğeleri incelemek ve kazıma için gerekli XPath ifadelerini almak için Chrome DevTools'u nasıl kullanabileceğiniz aşağıda açıklanmıştır:

  1. Google Flights sayfasına sağ tıklayıp "İncele "yi seçerek Chrome DevTools'u açın veya Ctrl+Shift+I (Windows/Linux) ya da Cmd+Option+I (Mac) kısayolunu kullanın.
  2. Sayfanın farklı bölümlerinin üzerine gelerek öğeleri inceleyin. Bu, DevTools'ta HTML yapısını vurgulayacaktır. Doğru XPath ifadeleri oluşturmak için çok önemli olan özniteliklerini görüntülemek için belirli öğelere tıklayın.
  3. Elemanlar panelinde istediğiniz öğeye sağ tıklayıp "Kopyala "yı ve ardından "XPath Kopyala "yı seçerek XPath ifadelerini alın. Bu, XPath ifadesini doğrudan panonuza kopyalar ve kazıma komut dosyanızda kullanıma hazır hale getirir.

Kullanılan XPath ifadelerinin listesi:

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

Not: Bu XPath, her biri ayrı bir uçuşa karşılık gelen birden fazla öğe döndürür.

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

Adım 2. Playwright ile HTTP istekleri gönderme ve sayfa içeriğini çıkarma

Web sayfasıyla etkileşime geçmek ve içeriğini çıkarmak için Playwright kullanıyoruz. Bu yaklaşım, JavaScript'in yükleyebileceği dinamik içeriğin işlenmesine yardımcı olur.

Playwright'ı kullanmak, JavaScript tarafından yüklenen dinamik içeriğin işlenmesine yardımcı olur. Başlıksız bir tarayıcı başlatır, URL'ye gider ve sayfa içeriğini çıkarır.

from playwright.sync_api import sync_playwright

# Google Flights arama sayfasının URL'si
url = "https link"

def get_page_content(url):
    """Playwright kullanarak verilen URL'nin HTML içeriğini getirir."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)  # Tarayıcıyı başsız modda başlatma
        context = browser.new_context()  # Yeni bir tarayıcı bağlamı oluşturma
        page = context.new_page()  # Yeni bir sayfa açın
        page.goto(url)  # Belirtilen URL'ye gitme
        content = page.content()  # Sayfa içeriğini alın
        browser.close()  # Tarayıcıyı kapatın
    return content

# Sayfa içeriğini getir
page_content = get_page_content(url)

Adım 3. XPath kullanarak ortak ayrıntıları çıkarma

Ardından, kalkış ve dönüş tarihleri gibi yaygın uçuş ayrıntılarını çıkarmak için lxml kullanarak yanıtın HTML içeriğini ayrıştırıyoruz.

from lxml import html

# Ayrıştırıcı oluşturma
tree = html.fromstring(page_content)

# XPath kullanarak ortak uçuş ayrıntılarını çıkarma
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]  # 'Kimden' konumunu alın
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]  # 'Kime' konumunu alın
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]  # Kalkış tarihini alın
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]  # Dönüş tarihini alın

Adım 4. lxml kullanarak belirli uçuş verilerini çıkarma

Ardından, tanımlanan XPath ifadelerine dayalı olarak belirli uçuş bilgilerini çıkarmak için HTML içeriğini ayrıştırıyoruz.

# Uçuş ayrıntılarını saklamak için boş bir liste başlatın
flights = []

# XPath kullanarak ayrıştırılmış HTML'den uçuş öğelerini ayıklama
flight_elements = tree.xpath('//li[@class="pIav2d"]')

# Her uçuş öğesi boyunca döngü ve ayrıntıları çıkarma
for flight in flight_elements:
    # Havayolu adını çıkarın
    airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
    
    # Aktarmalar gibi uçuş ayrıntılarını çıkarın
    details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
    
    # Kalkış saatini çıkarın
    departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
    
    # Varış zamanını çıkarın
    arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
    
    # Toplam seyahat süresini çıkarın
    travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
    
    # Uçuş fiyatını çıkarın
    price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()

    # Çıkarılan ayrıntıları bir sözlük olarak uçuş listesine ekleyin
    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
    })

Adım 5. Verileri CSV'ye kaydetme

Son olarak, çıkarılan verileri daha fazla analiz için bir CSV dosyasına kaydetmek için Python'un yerleşik CSV modülünü kullanıyoruz.

import csv

# CSV dosya yolunu tanımlama
csv_file = 'google_flights.csv'

# CSV alan adlarını tanımlama
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# CSV dosyasına veri yazma
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}")

Her şeyi bir araya getirme

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

# Google Flights arama sayfasının URL'si
url = "https link"

def get_page_content(url):
    """Playwright kullanarak verilen URL'nin HTML içeriğini getirir."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # Tarayıcıyı headful modunda başlatın
        context = browser.new_context()  # Yeni bir tarayıcı bağlamı oluşturma
        page = context.new_page()  # Yeni bir sayfa açın
        page.goto(url)  # Belirtilen URL'ye gitme
        page.wait_for_timeout(10000)  # Sayfanın tamamen yüklendiğinden emin olmak için 10 saniye bekleyin
        content = page.content()  # Sayfa içeriğini alın
        browser.close()  # Tarayıcıyı kapatın
    return content

# Sayfa içeriğini getir
page_content = get_page_content(url)

# HTML içeriğini lxml kullanarak ayrıştırma
tree = html.fromstring(page_content)

# Uçuş arama ayrıntılarını çıkarma
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]

# Uçuş ayrıntılarını saklamak için bir liste başlatın
flights = []

# Ayrıştırılan HTML'den uçuş öğelerini ayıklayın
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()

    # Uçuş ayrıntılarını listeye ekleyin
    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 dosya yolunu tanımlayın
csv_file = 'google_flights.csv'

# CSV alan adlarını tanımlama
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# Çıkarılan uçuş ayrıntılarını bir CSV dosyasına yazma
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()  # Başlık satırını yazın
    for flight in flights:
        writer.writerow(flight)  # Her uçuşun ayrıntılarını yazın

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

Veri kazıma sırasında tespit edilme riskini azaltmak için, istekler arasında gecikmeler eklemek ve proxy kullanmak tavsiye edilir. Gecikmeler uygulamak insan etkileşimini taklit etmeye yardımcı olarak web sitelerinin otomatik kazıma faaliyetlerini tespit etmesini zorlaştırır. Proxy seçimi için, yüksek bir güven seviyesi sundukları ve dinamik yapıları nedeniyle engellenme olasılıkları daha düşük olduğu için yerleşik dinamik proxy'ler önerilir. Alternatif olarak, istikrarlı ve hızlı bir bağlantı sağlayarak veri çıkarma işleminizin güvenilirliğini artıran statik ISP proxy'lerinden oluşan bir havuz kullanabilirsiniz. Bu stratejiler, web sitelerinin kazıma botlarını tespit etmek ve engellemek için kullandığı koruyucu önlemlerden kaçınmaya yardımcı olur.

Yorumlar:

0 yorumlar