Mendapatkan akses ke data Airbnb sangat penting untuk menganalisis pasar real estat, meneliti dinamika harga sewa, melakukan analisis kompetitif, dan menilai ulasan dan peringkat. Hal ini bisa dilakukan dengan mengikis data web. Namun, mengakses data ini bisa menjadi tantangan karena scraping dapat melanggar ketentuan penggunaan situs.
Selanjutnya, kita akan menjelajahi panduan langkah demi langkah tentang cara mengembangkan scraper web untuk mengekstrak data dari daftar Airbnb menggunakan Python dan Selenium. Panduan ini juga akan membahas cara menghindari potensi pemblokiran dan pembatasan yang diberlakukan oleh platform.
Langkah pertama dalam membuat scraper web adalah memahami cara mengakses halaman web yang Anda minati, karena struktur situs web sering kali dapat berubah. Untuk membiasakan diri Anda dengan struktur situs, Anda dapat menggunakan alat pengembang peramban untuk memeriksa HTML halaman web.
Untuk mengakses Developer Tools, klik kanan pada halaman web dan pilih "Inspect" atau gunakan pintasan:
Setiap wadah daftar dibungkus dengan elemen div dengan atribut berikut: class="g1qv1ctd".
Dengan mengklik "lokasi" dan mengetik "London, UK" kita dapat mengakses lokasi yang ditawarkan di London. Situs web ini menyarankan untuk menambahkan tanggal check-in dan check-out. Hal ini memungkinkan mereka untuk menghitung harga kamar.
URL untuk halaman ini akan terlihat seperti ini:
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"
Dari halaman pencarian, kami akan mengikis atribut berikut dari data daftar produk:
Untuk memulai scraping web untuk data Airbnb, Anda perlu menyiapkan lingkungan pengembangan Anda terlebih dahulu. Berikut adalah langkah-langkah untuk melakukannya:
Lingkungan virtual memungkinkan Anda untuk mengisolasi paket Python dan ketergantungannya untuk proyek yang berbeda. Hal ini membantu mencegah konflik dan memastikan bahwa setiap proyek memiliki ketergantungan yang benar.
Buka prompt perintah dengan hak administrator dan jalankan perintah berikut untuk membuat lingkungan virtual baru bernama "venv":
python -m venv venv
Mengaktifkan lingkungan virtual:
venv\Scripts\activate
Buka terminal dan jalankan perintah berikut untuk membuat lingkungan virtual baru bernama "venv":
sudo python3 -m venv venv
Mengaktifkan lingkungan virtual:
source venv/bin/activate
Untuk menonaktifkan lingkungan virtual, cukup jalankan perintah berikut ini:
deactivate
Setelah lingkungan virtual disiapkan, Anda dapat menginstal pustaka yang diperlukan.
Di dalam lingkungan virtual yang telah diaktifkan, jalankan perintah berikut ini untuk menginstal pustaka yang diperlukan:
pip install selenium beautifulsoup4 lxml seleniumwire
Selenium membutuhkan driver untuk berinteraksi dengan browser yang dipilih. Kami akan menggunakan Chrome untuk panduan ini. Namun, pastikan Anda telah menginstal WebDriver yang sesuai untuk browser pilihan Anda.
Setelah diunduh, pastikan driver ditempatkan pada direktori yang dapat diakses oleh variabel lingkungan PATH sistem Anda. Hal ini akan memungkinkan Selenium untuk menemukan driver dan mengontrol browser.
Di awal berkas Python Anda, impor pustaka Seleniumwire dan BeautifulSoup. Ini adalah cara Anda melakukannya:
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
Kita juga akan mengimpor pustaka `random`, `time`, dan `csv` untuk berbagai utilitas.
Selanjutnya, kita tentukan daftar proksi agar tidak diblokir oleh Airbnb. Saat mencoba mengirim permintaan tanpa proxy premium, Anda mungkin akan mendapatkan respons "Akses Ditolak".
Anda dapat mengatur proxy sebagai berikut:
# Daftar proksi
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",
]
Pastikan untuk mengganti "Your_proxy_IP_Address" dan "Your_proxy_port" dengan alamat proxy yang sebenarnya yang Anda peroleh dari Proxy-seller dan juga mengganti nilai "username" dan "password" dengan kredensial Anda yang sebenarnya.
Rotasi proxy adalah aspek penting dari web scraping. Situs web sering kali memblokir atau membatasi akses ke bot dan scraper ketika mereka menerima banyak permintaan dari alamat IP yang sama. Dengan merotasi alamat IP proxy yang berbeda, Anda bisa menghindari deteksi, muncul sebagai beberapa pengguna organik, dan melewati sebagian besar tindakan anti-scraping yang diterapkan pada situs web.
Untuk mengatur rotasi proxy, impor Library "acak". Kita juga mendefinisikan fungsi `get_proxy()` untuk memilih proxy dari daftar kita. Fungsi ini secara acak memilih proxy dari daftar proxy menggunakan metode random.choice() dan mengembalikan proxy yang dipilih.
def get_proxy():
return random.choice(proxies)
Selanjutnya, kita mendefinisikan fungsi utama yang disebut `listings()`. Di sinilah kita akan menyiapkan "ChromeDriver" kita. Fungsi ini menggunakan Selenium untuk menavigasi halaman daftar properti, menunggu halaman dimuat, dan mem-parsing HTML menggunakan Beautiful Soup.
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"
) # Ganti dengan jalur Anda ke ChromeDriver
driver = webdriver.Chrome(
service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
)
driver.get(url)
time.sleep(8) # Adjust based on website's load time
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit()
Di sini, kita mulai dengan memilih proxy acak dan mengatur opsi proxy. Opsi-opsi ini akan digunakan untuk mengonfigurasi webdriver untuk menggunakan server proxy. Selanjutnya, kita menyiapkan opsi Chrome. Tambahkan argumen --headless untuk menjalankan peramban dalam mode tanpa kepala, yang berarti peramban akan berjalan di latar belakang tanpa antarmuka pengguna grafis.
Kemudian inisialisasi webdriver dengan layanan, opsi seleniumwire, dan opsi Chrome. Webdriver kemudian digunakan untuk menavigasi ke URL yang diberikan. Kami menambahkan waktu tidur selama 8 detik untuk memungkinkan halaman dimuat sepenuhnya, dan kemudian mem-parsing HTML yang dikembalikan menggunakan Beautiful Soup. Setelah penguraian selesai, webdriver ditutup.
Setelah Anda berhasil mendapatkan konten HTML, langkah selanjutnya adalah mengekstrak data yang relevan untuk setiap daftar. Dengan menggunakan BeautifulSoup, kita dapat dengan mudah menavigasi struktur HTML dan menemukan elemen yang berisi informasi daftar.
Pertama, kita mengidentifikasi semua elemen daftar pada halaman. Elemen-elemen ini berisi data yang kami minati, seperti URL listing, judul, deskripsi, peringkat, harga, dan informasi tambahan.
listing_elements = soup.find_all("div", class_="g1qv1ctd")
for listing_element in listing_elements:
Kode ini menggunakan metode find_all () dari BeautifulSoup untuk menemukan semua elemen div dengan kelas "g1qv1ctd". Elemen-elemen ini mewakili masing-masing daftar di halaman Airbnb. Kode ini kemudian mengulang setiap elemen daftar ini untuk mengekstrak data yang relevan.
Untuk setiap elemen daftar yang ditemukan, kami mengekstrak URL daftar tersebut.
URL_element = soup.find("a", class_="rfexzly")
listing_data["Listing URL"] = (
"https://www.airbnb.com" + URL_element["href"] if URL_element else ""
)
Di sini, kita mencari di dalam objek "sup" untuk tag jangkar dengan kelas "rfexzly". Jika menemukan elemen ini, ia mengekstrak atribut 'href' (yang berisi URL relatif) dan menambahkannya ke URL dasar untuk membuat URL daftar lengkap. Jika elemen tidak ditemukan, ia akan memberikan string kosong untuk menghindari kesalahan.
Pertama, kita akan mengekstrak URL untuk setiap listing. Ini akan memungkinkan kita untuk mengunjungi masing-masing halaman daftar nanti jika diperlukan.
title_element = listing_element.find("div", class_="t1jojoys")
listing_data["Title"] = (
title_element.get_text(strip=True) if title_element else ""
)
Judul terkandung di dalam elemen "div" dengan kelas "t1jojoys". Kami mengambil konten teks dari elemen ini, menghilangkan spasi di depan atau di belakangnya. String kosong akan disimpan jika elemen tidak ditemukan.
Description_element = listing_element.find("span", class_="t6mzqp7")
listing_data["Description"] = (
Description_element.get_text(strip=True) if Description_element else ""
)
Mirip dengan ekstraksi judul, kode ini menemukan elemen rentang dengan kelas "t6mzqp7". Kami kemudian mengekstrak dan membersihkan konten teks dari elemen ini, yang berisi deskripsi singkat tentang cantuman.
rating_element = listing_element.find("span", class_="ru0q88m")
listing_data["Rating"] = (
rating_element.get_text(strip=True) if rating_element else ""
)
Seperti yang terlihat pada kode di atas, elemen bentang dengan kelas "ru0q88m" menyimpan nilai rating. Kami mengekstrak nilai ini, memastikan untuk menghilangkan spasi yang tidak perlu.
Terakhir, kami mengekstrak harga listing.
price_element = listing_element.select_one("._1y74zjx")
listing_data["Price"] = (
f"{price_element.get_text(strip=True)} per night" if price_element else ""
)
Kode ini mencari elemen dengan kelas "_1y74zjx" di dalam listing_element saat ini. Jika elemen ini, yang biasanya berisi informasi harga, ditemukan, konten teksnya akan diekstrak, dibersihkan, dan ditambahkan dengan "per malam" untuk membentuk string harga yang lebih informatif.
Beberapa daftar mungkin memiliki informasi tambahan yang dapat kami ekstrak.
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 ""
)
Kami mencari elemen rentang dengan atribut aria-hidden = "true" untuk menemukan informasi tambahan tentang cantuman. Setelah mengekstrak semua data yang relevan dari setiap elemen cantuman, kami menambahkan data yang terkumpul ke daftar cantuman.
listings.append(listing_data)
Setelah semua daftar telah diproses, kami mengembalikan daftar daftar, masing-masing direpresentasikan sebagai kamus yang berisi data yang diekstrak.
return listings
Setelah berhasil mengambil data dari halaman Daftar Airbnb, langkah penting berikutnya adalah menyimpan informasi berharga ini untuk analisis dan referensi di masa mendatang. Kami menggunakan pustaka csv untuk tugas ini. Kami membuka file CSV dalam mode tulis dan membuat objek csv.DictWriter. Kami kemudian menulis header dan data ke file tersebut.
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}")
Berikut ini adalah kode lengkap yang kami gunakan untuk tutorial ini:
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
# Daftar proksi
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"
) # Ganti dengan jalur Anda ke ChromeDriver
driver = webdriver.Chrome(
service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
)
driver.get(url)
time.sleep(8) # Sesuaikan berdasarkan waktu muat situs web
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit()
listings = []
# Temukan semua elemen daftar pada halaman
listing_elements = soup.find_all("div", class_="g1qv1ctd")
for listing_element in listing_elements:
# Ekstrak data dari setiap elemen daftar
listing_data = {}
# URL Daftar
URL_element = soup.find("a", class_="rfexzly")
listing_data["Listing URL"] = (
"https://www.airbnb.com" + URL_element["href"] if URL_element else ""
)
# Judul
title_element = listing_element.find("div", class_="t1jojoys")
listing_data["Title"] = (
title_element.get_text(strip=True) if title_element else ""
)
# Deskripsi
Description_element = listing_element.find("span", class_="t6mzqp7")
listing_data["Description"] = (
Description_element.get_text(strip=True) if Description_element else ""
)
# Peringkat
rating_element = listing_element.find("span", class_="ru0q88m")
listing_data["Rating"] = (
rating_element.get_text(strip=True) if rating_element else ""
)
# Harga
price_element = listing_element.select_one("._1y74zjx")
listing_data["Price"] = (
f"{price_element.get_text(strip=True)} per night" if price_element else ""
)
# Info daftar tambahan
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 ""
)
# Menambahkan data daftar ke daftar
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}")
Bagian kode ini memastikan bahwa data yang dikikis disimpan dalam file CSV bernama "proxy_web_listings_output.csv".
Hasil scraper kami disimpan ke file CSV bernama "proxy_web_listings_output.csv" seperti yang terlihat di bawah ini.
Panduan ini secara efektif menjelaskan cara mengikis data dari daftar Airbnb menggunakan Python, memungkinkan ekstraksi detail utama seperti harga, ketersediaan, dan ulasan. Panduan ini menekankan pentingnya menggunakan proxy dan memutarnya agar tidak diblokir oleh tindakan anti-bot Airbnb.
Komentar: 0