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.
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
Google Flights arama sonuçları sayfasından uçuş verilerini çıkarmaya odaklanacağız.
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:
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()
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)
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
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
})
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}")
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