Pada artikel ini, kami akan mendemonstrasikan cara mengumpulkan data dari situs web Booking.com dengan Python. Kita akan mendapatkan informasi termasuk, namun tidak terbatas pada, nama hotel, peringkat, harga, alamat lokasi dan deskripsinya. Kode yang disediakan memungkinkan Anda untuk mengambil data dari halaman hotel dengan mem-parsing konten HTML dan mengekstrak data JSON yang disematkan.
Sebelum menjalankan kode untuk mengikis data dari Booking.com, Anda harus menginstal pustaka Python yang diperlukan. Berikut ini cara menginstal dependensi yang diperlukan:
Untuk menginstal pustaka yang diperlukan, Anda dapat menggunakan pip:
pip install requests lxml
Ini adalah satu-satunya pustaka eksternal yang Anda perlukan, dan sisanya (json, csv) sudah terinstal dengan Python.
Ketika mengambil data dari Booking.com, penting untuk memahami struktur halaman web dan jenis data yang ingin Anda ekstrak. Setiap halaman hotel di Booking.com berisi data terstruktur yang disematkan dalam bentuk JSON-LD, sebuah format yang memungkinkan ekstraksi detail yang mudah seperti nama, lokasi, dan harga. Kami akan mengikis data ini.
Karena Booking.com adalah situs yang dinamis dan menerapkan langkah-langkah untuk memerangi tindakan otomatis, kami akan menggunakan header dan proxy HTTP yang sesuai untuk memastikan pengikisan yang mulus tanpa risiko pemblokiran.
Header meniru sesi pengguna di browser dan mencegah deteksi oleh sistem anti-scraping Booking.com. Tanpa header yang dikonfigurasi dengan benar, server dapat dengan mudah mengidentifikasi skrip otomatis, yang dapat menyebabkan pemblokiran IP atau tantangan captcha.
Untuk menghindari pemblokiran oleh mekanisme anti-scraping Booking.com, kami akan menggunakan header khusus untuk mensimulasikan pengguna yang sah menjelajahi situs web. Berikut adalah cara untuk mengirim permintaan HTTP dengan header yang tepat:
import requests
from lxml.html import fromstring
urls_list = ["https links"]
for url in urls_list:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
Menggunakan proxy diperlukan saat mengikis situs seperti Booking.com, yang menerapkan batas tingkat permintaan yang ketat atau melacak alamat IP. Proksi membantu mendistribusikan beban permintaan di berbagai alamat IP, sehingga mencegah pemblokiran. Untuk tujuan ini, baik proksi gratis maupun layanan proksi berbayar dengan otentikasi dengan nama pengguna dan kata sandi atau alamat IP dapat digunakan. Dalam contoh kami, kami menggunakan opsi yang terakhir.
proxies = {
'http': '',
'https': ''
}
response = requests.get(url, headers=headers, proxies=proxies)
Setelah mengirimkan permintaan, kami mem-parsing konten HTML menggunakan lxml untuk menemukan data JSON-LD yang disematkan yang berisi detail hotel. Langkah ini mengekstrak data terstruktur dari halaman web yang mencakup nama hotel, harga, lokasi, dan lainnya.
parser = fromstring(response.text)
# Ekstrak data JSON yang disematkan
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
Setelah kita memiliki data JSON yang telah diuraikan, kita dapat mengekstrak bidang yang relevan seperti nama hotel, alamat, peringkat, dan harga. Di bawah ini adalah kode untuk mengekstrak informasi hotel dari JSON:
name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
# Menambahkan data ke daftar all_data
all_data.append({
"Name": name,
"Location": location,
"Price Range": priceRange,
"Rating": ratingValue,
"Review Count": reviewCount,
"Type": type_,
"Postal Code": postalCode,
"Address Locality": addressLocality,
"Country": addressCountry,
"Region": addressRegion,
"Street Address": streetAddress,
"URL": url,
"Image URL": image_url,
"Room Types": room_types
})
Setelah data diekstrak, kita dapat menyimpannya ke dalam file CSV untuk analisis lebih lanjut:
# Setelah semua URL diproses, tulis data ke dalam file CSV
with open('booking_data.csv', 'w', newline='') as csvfile:
fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code",
"Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# Tulis tajuk
writer.writeheader()
# Menulis baris data
writer.writerows(all_data)
Berikut adalah kode lengkap yang menggabungkan semua bagian:
import requests
from lxml.html import fromstring
import json
import csv
# Daftar URL hotel yang akan dikikis
urls_list = [
"Https link",
"Https link"
]
# Inisialisasi daftar kosong untuk menampung semua data yang dikikis
all_data = []
proxies = {
'http': ''
}
# Ulangi setiap URL untuk mengikis data
for url in urls_list:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}
# Mengirim permintaan ke situs web
response = requests.get(url, headers=headers, proxies=proxies)
# Mengurai konten HTML
parser = fromstring(response.text)
# Ekstrak data JSON yang disematkan
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
# Ekstrak semua detail hotel dari JSON
name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
# Menambahkan data ke daftar all_data
all_data.append({
"Name": name,
"Location": location,
"Price Range": priceRange,
"Rating": ratingValue,
"Review Count": reviewCount,
"Type": type_,
"Postal Code": postalCode,
"Address Locality": addressLocality,
"Country": addressCountry,
"Region": addressRegion,
"Street Address": streetAddress,
"URL": url,
"Image URL": image_url,
"Room Types": room_types
})
# Setelah semua URL diproses, tulis data ke dalam file CSV
with open('booking_data.csv', 'w', newline='') as csvfile:
fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code",
"Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# Tulis tajuk
writer.writeheader()
# Menulis baris data
writer.writerows(all_data)
print("Data successfully saved to booking_data.csv")
Artikel ini menunjukkan cara mengikis data hotel dari Booking.com menggunakan Python. Kami menekankan pentingnya menggunakan header dan proxy HTTP yang sesuai untuk melewati langkah-langkah anti-scraping. Data yang diekstrak dapat disimpan dalam file CSV untuk analisis lebih lanjut. Saat melakukan scraping situs web, selalu periksa persyaratan layanan untuk menghindari pelanggaran.
Komentar: 0