Python ile Airbnb listeleme verilerini kazıma

Yorumlar: 0

Web kazıma airbnb python ve Airbnb verilerini kazıma, emlak piyasasını analiz etmek, kira fiyat dinamiklerini araştırmak, rekabet analizi yapmak ve incelemeleri ve derecelendirmeleri değerlendirmek için çok önemlidir. Bu, kazıma teknikleri ile gerçekleştirilebilir. Ancak, kazıma işlemi sitenin kullanım koşullarını ihlal edebileceğinden bu bilgilere erişmek zor olabilir.

Daha sonra, airbnb listelerini kazımak için Python ve Selenium kullanarak bir web kazıyıcının nasıl geliştirileceğine dair adım adım bir kılavuz inceleyeceğiz. Bu kılavuz aynı zamanda platform tarafından uygulanan potansiyel engellerden ve kısıtlamalardan nasıl kaçınılacağını da kapsayacaktır.

Airbnb'nin web sitesinin mimarisini anlama

Bir web kazıyıcı oluşturmanın ilk adımı, web sitelerinin yapısı sıklıkla değişebildiğinden, ilgilendiğiniz web sayfalarına nasıl erişeceğinizi anlamaktır. Bir sitenin yapısına aşina olmak için, web sayfasının HTML'sini incelemek üzere tarayıcının geliştirici araçlarını kullanabilirsiniz.

Geliştirici Araçlarına erişmek için web sayfasına sağ tıklayın ve "İncele "yi seçin veya kısayolu kullanın:

  • Windows için CTRL+SHIFT+I;
  • Mac'te Option + ⌘ + I.

Her liste konteyneri, aşağıdaki niteliğe sahip bir div öğesine sarılır: class="g1qv1ctd".

1.png

"Konum "a tıklayıp "Londra, İngiltere" yazarak Londra'da sunulan konuma erişebiliriz. Web sitesi check-in ve check-out tarihlerini eklemeyi öneriyor. Bu da oda fiyatlarını hesaplamalarını sağlıyor.

2.png

Bu sayfanın URL'si aşağıdaki gibi görünecektir:

url = "https://www.airbnb.com/s/London--United-Kingdom/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_lengths%5B%5D=one_week&monthly_start_date=2024-01-01&monthly_length=3&price_filter_input_type=0&channel=EXPLORE&query=London%2C%20United%20Kingdom&place_id=ChIJdd4hrwug2EcRmSrV3Vo6llI&date_picker_type=calendar&source=structured_search_input_header&search_type=autocomplete_click"

Arama sayfasından, Airbnb'den ürün listeleme verilerinin aşağıdaki özelliklerini kazıyacağız:

  • URL;
  • Başlık;
  • Açıklama;
  • Değerlendirme;
  • Fiyat;
  • Ek Bilgiler (Yatak sayısı ve müsait tarihler).

3.png

Airbnb kazıma programı oluşturmaya yönelik adım adım kılavuz

Airbnb python verilerini web kazımaya başlamak için önce geliştirme ortamınızı kurmanız gerekir. İşte bunu yapmak için adımlar:

Adım 1: Sanal bir ortam oluşturma

Sanal ortamlar, Python paketlerini ve bağımlılıklarını farklı projeler için izole etmenizi sağlar. Projeler arası etkileşim olmadığında her projenin bağımlılıklarının doğru olması garanti edilir.

Windows üzerinde sanal bir ortam oluşturma

Windows kullanıcıları, yönetici ayrıcalıklarına sahip bir komut istemi açıp komutu çalıştırarak "venv" başlıklı bir sanal ortam oluşturabilirler:

python -m venv venv

Yeni oluşturulan sanal ortamı etkinleştirmek için komutu çalıştırın:

venv\Scripts\activate

macOS/Linux üzerinde sanal bir ortam oluşturma

Bir terminal açın ve "venv" olarak adlandırılan yeni bir sanal ortam kurmak için aşağıdaki komutu çalıştırın:

sudo python3 -m venv venv

Sanal ortamı etkinleştirin:

source venv/bin/activate

Sanal ortamı devre dışı bırakmak için aşağıdaki komutu çalıştırmanız yeterlidir:

deactivate

Adım 2: Gerekli kütüphanelerin yüklenmesi

Artık sanal bir ortamınız olduğuna göre, gerekli kütüphaneleri yükleyebilirsiniz.

Kütüphaneleri anlamak:

  • Selenium: Airbnb'yi Python ile kazımak için mükemmel bir araçtır ve bir web tarayıcısını programlı olarak kontrol etmenizi sağlar. Sayfalarla etkileşime girmenizi sağlar; düğmeleri tıklar, formları doldurur ve gerçek bir kullanıcı gibi gezinirsiniz.
  • Seleniumwire: Bu kütüphane, HTTP isteklerini yakalamanıza ve incelemenize ve proxy'leri kazıma işlemlerinizle entegre etmenize olanak tanıyarak Selenium'u genişletir.
  • BeautifulSoup4: Amacı HTML ve XML belgelerinin işlenmesine yardımcı olmaktır. Web sayfalarından belirli bilgileri yapılandırılmış ve verimli bir şekilde çıkarmanıza yardımcı olur. Bu, airbnb'den veri kazımaya yardımcı olacaktır.
  • lxml: BeautifulSoup'u tamamlayan hızlı ve sağlam bir HTML ve XML ayrıştırıcı.

Etkinleştirilmiş sanal ortamınızda, gerekli kütüphaneleri yüklemek için aşağıdaki komutu çalıştırın:

pip install selenium beautifulsoup4 lxml seleniumwire

Selenium sürücüleri

Selenium, seçilen tarayıcı ile arayüz oluşturmak için bir sürücü gerektirir. Bu kılavuz için Chrome kullanacağız. Ancak, lütfen seçtiğiniz tarayıcı için uygun WebDriver'ı yüklediğinizden emin olun.

İndirildikten sonra, sürücünün sisteminizin PATH ortam değişkeni tarafından erişilebilen bir dizine yerleştirildiğinden emin olun. Bu, Selenium'un sürücüyü bulmasını ve tarayıcıyı kontrol etmesini sağlayacaktır.

Adım 3: Kütüphaneleri içe aktarın

Yukarıda belirtildiği gibi, yapılması gereken ilk şey Seleniumwire ve BeautifulSoup kütüphanelerini Python dosyanıza aktarmaktır. Bu şekilde görünüyor:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import csv
import random

Ayrıca çeşitli yardımcı programlar için `random`, `time` ve `csv` kütüphanelerini de içe aktaracağız.

Adım 4: Proxy entegrasyonu

Ardından, Airbnb tarafından engellenmekten kaçınmak için bir proxy listesi tanımlıyoruz. Premium proxy olmadan bir istek göndermeye çalıştığınızda "Erişim Reddedildi" yanıtıyla karşılaşabilirsiniz.

4.png

Bir proxy'yi aşağıdaki şekilde ayarlayabilirsiniz:

# Vekillerin listesi
proxies = [
     "username:password@Your_proxy_IP_Address:Your_proxy_port1",
     "username:password@Your_proxy_IP_Address:Your_proxy_port2",
     "username:password@Your_proxy_IP_Address:Your_proxy_port3",
     "username:password@Your_proxy_IP_Address:Your_proxy_port4",
     "username:password@Your_proxy_IP_Address:Your_proxy_port5",

]

"YourproxyIPAddress" ve "Yourproxy_port" alanlarını Proxy-seller'daki proxy adresinize karşılık gelen bilgilerle özelleştirdiğinizden emin olun. Ayrıca "kullanıcı adı" ve "parola" yer tutucularını gerçek kimlik bilgilerinizle değiştirmeyi unutmayın.

Adım 5: Proxy'leri döndürme

Proxy'leri döndürmek web kazımada hayati bir adımdır. Web siteleri genellikle aynı IP adresinden birden fazla istek aldıklarında botların ve kazıyıcıların erişimini engeller veya kısıtlar. Farklı proxy IP adresleri arasında rotasyon yaparak, tespit edilmekten kaçınabilir, birden fazla organik kullanıcı olarak görünebilir ve web sitesinde uygulanan çoğu kazıma önleyici önlemi atlayabilirsiniz.

Rotasyonu ayarlamak için "random" Kütüphanesini içe aktarın. Ayrıca listemizden bir proxy seçmek için `get_proxy()` fonksiyonunu tanımlıyoruz. Bu fonksiyon random.choice() yöntemini kullanarak proxy listesinden rastgele bir öğe seçer.

def get_proxy():
    return random.choice(proxies)

Adım 6: WebDriver'ı kurun

Ardından, `listings()` adlı ana fonksiyonu tanımlıyoruz. Burası "ChromeDriver "ımızı kuracağımız yerdir. Bu fonksiyon, emlak listeleri sayfasında gezinmek için Selenium'u kullanır, sayfanın yüklenmesini bekler ve Beautiful Soup kullanarak HTML'yi ayrıştırır.

def listings(url):

    proxy = get_proxy()
    proxy_options = {
        "proxy": {
            "http": f"http://{proxy}",
            "https": f"http://{proxy}",
            "no_proxy": "localhost,127.0.0.1",
        }
    }

    chrome_options = Options()
    chrome_options.add_argument("--headless")
  

    s = Service(
        "C:/Path_To_Your_WebDriver"
    )  # ChromeDriver'a giden yolunuzla değiştirin
    driver = webdriver.Chrome(
        service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
    )

    driver.get(url)

    time.sleep(8)  # Web sitesinin yükleme süresine göre ayarlayın

    soup = BeautifulSoup(driver.page_source, "lxml")

    driver.quit()

Python kullanarak Airbnb'yi kazımak için, rastgele bir proxy seçerek ve seçenekleri ayarlayarak başlıyoruz. Bu seçenekler webdriver'ı yapılandırmak için kullanılacak. Ardından, Chrome seçeneklerini ayarlıyoruz. Tarayıcıyı headless modunda çalıştırmak için --headless argümanını ekleyin; bu, tarayıcının grafik kullanıcı arayüzü olmadan arka planda çalışacağı anlamına gelir.

Ardından webdriver'ı servis, seleniumwire seçenekleri ve Chrome seçenekleriyle başlatın. Webdriver daha sonra verilen URL'ye gitmek için kullanılır. Sayfanın tamamen yüklenmesine izin vermek için 8 saniyelik bir uyku süresi ekliyoruz ve ardından Beautiful Soup kullanarak döndürülen HTML'yi ayrıştırıyoruz. Ayrıştırma işlemi tamamlandıktan sonra webdriver kapatılır.

Adım 7: Listeleme verilerinin bulunması ve çıkarılması

HTML içeriğini başarıyla elde ettikten sonra, bir sonraki adım her bir mülk için ilgili verileri çıkarmaktır. BeautifulSoup'u kullanarak yapıda kolayca gezinebilir ve gerekli bilgileri içeren bölümleri bulabiliriz.

Listeleme öğelerini ayıklama

İlk olarak, sayfadaki mülk ayrıntılarını içeren tüm blokları tanımlarız. Bu bölümler URL, başlık, açıklama, derecelendirme, fiyat ve ek bilgileri içerir.

listing_elements = soup.find_all("div", class_="g1qv1ctd")
for listing_element in listing_elements:

Bu kod, "g1qv1ctd" sınıfına sahip tüm div etiketlerini bulmak için BeautifulSoup'un find_all() yöntemini kullanır. Bunların her biri Airbnb sayfasındaki tek bir mülkü temsil eder. Daha sonra ilgili verileri toplamak için bunlar arasında döngü yapar.

Listeleme URL'sini çıkarma

Bulunan her blok için URL'yi çıkarıyoruz.

URL_element = soup.find("a", class_="rfexzly")
listing_data["Listing URL"] = (
    "https://www.airbnb.com" + URL_element["href"] if URL_element else ""
)

Çorba nesnemiz içinde "rfexzly" sınıfına sahip bir bağlantı etiketi ararız. Bulunursa, 'href' niteliğini (göreli URL'yi içeren) çıkarır ve tam adresi oluşturmak için temel URL ile birleştirir. Bulunamazsa, hataları önlemek için boş bir dize kullanılır.

Liste başlığını çıkarma

Ardından, "t1jojoys" sınıfına sahip bir div etiketinin içinde bulunan başlığı alıyoruz. Metni alır ve temizleriz. Etiket mevcut değilse, sadece boş bir dize saklarız.

title_element = listing_element.find("div", class_="t1jojoys")
listing_data["Title"] = (
    title_element.get_text(strip=True) if title_element else ""
)

Liste açıklamasını çıkarma

Description_element = listing_element.find("span", class_="t6mzqp7")
listing_data["Description"] = (
    Description_element.get_text(strip=True) if Description_element else ""
)

Başlığı nasıl elde ettiğimize benzer şekilde, bu bölüm "t6mzqp7" sınıfına sahip bir span etiketi bulur. Özelliğin kısa bir açıklamasını içeren metin içeriğini çıkarır ve temizleriz.

Listeleme derecelendirmesini çıkarma

rating_element = listing_element.find("span", class_="ru0q88m")
listing_data["Rating"] = (
    rating_element.get_text(strip=True) if rating_element else ""
)

Yukarıdaki kodda gösterildiği gibi, "ru0q88m" sınıfına sahip bir span etiketi derecelendirme değerini tutar. Fazladan boşlukları kaldırmak için ayıklıyor ve temizliyoruz.

Listeleme fiyatının çıkarılması

Son olarak, fiyatı çıkarıyoruz.

price_element = listing_element.select_one("._1y74zjx")
listing_data["Price"] = (
    f"{price_element.get_text(strip=True)} per night" if price_element else ""
)

Bu kod, geçerli listing_element içinde "_1y74zjx" sınıfına sahip öğeyi bulur. Tipik olarak fiyat bilgisini içeren bu öğe bulunursa, metin içeriği çıkarılır, temizlenir ve daha bilgilendirici bir fiyat dizesi oluşturmak için "gecelik" ile eklenir.

Ek listeleme bilgilerini çıkarma

Bazı özellikler ekstra ayrıntılar içerebilir.

listing_info_element = listing_element.find("span", {"aria-hidden": "true"})
listing_data["Additional Listing information"] = (
    listing_info_element.get_text(strip=True) if listing_info_element else ""
)

Bu ekstra bilgiyi bulmak için aria-hidden="true" niteliğine sahip bir span etiketi arıyoruz. Tek bir özellikten ilgili tüm verileri topladıktan sonra, onu listemize ekliyoruz:

listings.append(listing_data)

Tüm listeler işlendikten sonra, her biri çıkarılan verileri içeren bir sözlük olarak temsil edilen listelerin listesini döndürüyoruz.

return listings

Adım 8: Verileri bir CSV dosyasına yazma

Airbnb'nin sayfalarından başarılı bir şekilde veri topladıktan sonra, bir sonraki önemli adım bu değerli bilgileri gelecekteki analiz ve referans için saklamaktır. Bu görev için csv kütüphanesini kullanıyoruz. Bir CSV dosyasını yazma modunda açıyoruz ve bir csv.DictWriter nesnesi oluşturuyoruz. Daha sonra başlığı ve verileri dosyaya yazıyoruz.

airbnb_listings = listings(url)

csv_file_path = "proxy_web_listings_output.csv"

with open(csv_file_path, "w", encoding="utf-8", newline="") as csv_file:
    fieldnames = [
        "Listing URL",
        "Title",
        "Description",
        "Rating",
        "Price",
        "Additional Listing information",
    ]
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()
    for listing in airbnb_listings:
        writer.writerow(listing)

print(f"Data has been exported to {csv_file_path}")

İşte bu eğitim için kullandığımız airbnb'yi kazımak için eksiksiz bir python kodu:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import csv
import random

# Vekillerin listesi
proxies = [ 
 "username:password@Your_proxy_IP_Address:Your_proxy_port1",
 "username:password@Your_proxy_IP_Address:Your_proxy_port2",
 "username:password@Your_proxy_IP_Address:Your_proxy_port3",
 "username:password@Your_proxy_IP_Address:Your_proxy_port4",
 "username:password@Your_proxy_IP_Address:Your_proxy_port5",
]

def get_proxy():
    return random.choice(proxies)


def listings(url):

    proxy = get_proxy()
    proxy_options = {
        "proxy": {
            "http": f"http://{proxy}",
            "https": f"http://{proxy}",
            "no_proxy": "localhost,127.0.0.1",
        }
    }

    chrome_options = Options()
    chrome_options.add_argument("--headless")
  

    s = Service(
        "C:/Path_To_Your_WebDriver"
    )  # ChromeDriver'a giden yolunuzla değiştirin
    driver = webdriver.Chrome(
        service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
    )

    driver.get(url)

    time.sleep(8)  # Web sitesinin yükleme süresine göre ayarlayın

    soup = BeautifulSoup(driver.page_source, "lxml")

    driver.quit()

    listings = []

    # Sayfadaki tüm listeleme öğelerini bulun
    listing_elements = soup.find_all("div", class_="g1qv1ctd")

    for listing_element in listing_elements:
        # Her listeleme öğesinden veri ayıklayın
        listing_data = {}

        # Listeleme URL'si
        URL_element = soup.find("a", class_="rfexzly")
        listing_data["Listing URL"] = (
            "https://www.airbnb.com" + URL_element["href"] if URL_element else ""
        )

        # Başlık
        title_element = listing_element.find("div", class_="t1jojoys")
        listing_data["Title"] = (
            title_element.get_text(strip=True) if title_element else ""
        )

        # Açıklama
        Description_element = listing_element.find("span", class_="t6mzqp7")
        listing_data["Description"] = (
            Description_element.get_text(strip=True) if Description_element else ""
        )

        # Değerlendirme
        rating_element = listing_element.find("span", class_="ru0q88m")
        listing_data["Rating"] = (
            rating_element.get_text(strip=True) if rating_element else ""
        )

        # Fiyat
        price_element = listing_element.select_one("._1y74zjx")
        listing_data["Price"] = (
            f"{price_element.get_text(strip=True)} per night" if price_element else ""
        )

        # Ek liste bilgileri
        listing_info_element = listing_element.find("span", {"aria-hidden": "true"})
        listing_data["Additional Listing information"] = (
            listing_info_element.get_text(strip=True) if listing_info_element else ""
        )

        # Listeleme verilerini listeye ekleme
        listings.append(listing_data)

    return listings


url = "https://www.airbnb.com/s/London--United-Kingdom/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_lengths%5B%5D=one_week&monthly_start_date=2024-01-01&monthly_length=3&price_filter_input_type=0&channel=EXPLORE&query=London%2C%20United%20Kingdom&place_id=ChIJdd4hrwug2EcRmSrV3Vo6llI&date_picker_type=calendar&source=structured_search_input_header&search_type=autocomplete_click"


airbnb_listings = listings(url)

csv_file_path = "proxy_web_listings_output.csv"

with open(csv_file_path, "w", encoding="utf-8", newline="") as csv_file:
    fieldnames = [
        "Listing URL",
        "Title",
        "Description",
        "Rating",
        "Price",
        "Additional Listing information",
    ]
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()
    for listing in airbnb_listings:
        writer.writerow(listing)

print(f"Data has been exported to {csv_file_path}")

Kod segmenti, kazıyıcı tarafından toplanan tüm verilerin CSV formatında "proxyweblistings_output.csv" adlı bir dosyada tutulmasını garanti eder.

Sonuçlar

Kazıyıcımızın sonuçları aşağıda görüldüğü gibi "proxy_web_listings_output.csv" adlı bir CSV dosyasına kaydedilir.

5.jpg

Bu kılavuz, Python kullanarak airbnb veri listelerinin nasıl kazınacağını etkili bir şekilde açıklayarak fiyatlar, müsaitlik durumu ve yorumlar gibi önemli ayrıntıların çıkarılmasını sağlar. Airbnb'nin anti-bot önlemleri tarafından engellenmeyi önlemek için proxy kullanmanın ve bunları döndürmenin önemini vurgulamaktadır.

Sonuç

Airbnb verilerini kazıyın Python ve Selenium size fiyatlandırma, müsaitlik gibi değerli bilgilere doğrudan erişim sağlar - pazar araştırması, yatırım analizi ve hatta kendi emlak araçlarınızı oluşturmak için önemli bilgiler. Süreç teknik zorluklarla (ve bazı yasal gri alanlarla) birlikte gelse de, doğru ortamı kurmak, web sitesinin nasıl çalıştığını anlamak ve proxy'ler ve başsız tarayıcılar gibi araçlar kullanmak çoğu engeli aşmanıza yardımcı olabilir. Sadece platformun kullanım koşullarına saygı duyduğunuzdan ve verileri her zaman sorumlu bir şekilde ele aldığınızdan emin olun.

Yorumlar:

0 yorumlar