tr
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski 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.
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:
Her liste konteyneri, aşağıdaki niteliğe sahip bir div öğesine sarılır: class="g1qv1ctd".
"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.
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:
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:
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 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
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
Artık sanal bir ortamınız olduğuna göre, gerekli kütüphaneleri yükleyebilirsiniz.
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, 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.
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.
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.
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.
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)
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.
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.
İ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.
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.
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 ""
)
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.
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.
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.
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
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.
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.
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.
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