Cara mengikis data Booking.com menggunakan Python

Komentar: 0

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.

Menginstal pustaka yang diperlukan

Sebelum menjalankan kode untuk mengikis data dari Booking.com, Anda harus menginstal pustaka Python yang diperlukan. Berikut ini cara menginstal dependensi yang diperlukan:

  1. Requests Perpustakaan: Ini digunakan untuk mengirim permintaan HTTP ke situs web dan mengambil konten HTML dari halaman.
  2. LXML Perpustakaan: Ini digunakan untuk mengurai konten HTML dan mengekstrak data menggunakan XPath.
  3. JSON: Modul Python bawaan yang digunakan untuk menangani data JSON.
  4. CSV: Modul Python bawaan yang digunakan untuk menulis data yang dikikis ke dalam file CSV.

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.

Memahami URL dan struktur data

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.

Langkah demi Langkah Proses Scraping

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.

Mengirim Permintaan HTTP dengan Header

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)

Pentingnya proxy

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)

Mengurai HTML dan mengekstrak data JSON

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])

Mengekstrak informasi hotel

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
})

Menyimpan data ke CSV

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)

Kode lengkap

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 komentar