Panduan untuk mengikis data Zillow Real Estate dengan Python

Komentar: 0

Mengekstrak informasi properti nyata dari Zillow dapat memberikan analisis yang sempurna untuk pasar dan investasi. Tulisan ini bertujuan untuk membahas penggalian daftar properti Zillow dengan Python yang akan berfokus pada langkah-langkah penting yang diambil dan panduannya. Panduan ini akan menunjukkan kepada Anda cara mengikis informasi dari situs web Zillow menggunakan pustaka seperti request, dan lxml.

Menginstal pustaka yang diperlukan dan mulai melakukan scraping

Sebelum memulai, pastikan Anda telah menginstal Python di sistem Anda. Anda juga perlu menginstal pustaka berikut ini:

pip install requests
pip install lxml

Langkah 1. Memahami struktur HTML Zillow

Untuk mengekstrak data dari Zillow, Anda perlu memahami struktur halaman web. Buka halaman daftar properti di Zillow dan periksa elemen yang ingin Anda kikis (misalnya, judul properti, harga perkiraan sewa, dan harga taksiran).

Judul:

1.png

Detail Harga:

2.png

Langkah 2. Membuat permintaan HTTP

Sekarang mari kita mengirim permintaan HTTP. Pertama, kita perlu mengambil konten HTML dari halaman Zillow. Kita akan menggunakan pustaka permintaan untuk mengirim permintaan HTTP GET ke URL target. Kita juga akan menyiapkan header permintaan untuk meniru permintaan browser yang sebenarnya dan menggunakan proksi untuk menghindari pemblokiran IP.

import requests

# Tentukan URL target untuk daftar properti Zillow
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"

# Mengatur tajuk permintaan untuk meniru permintaan browser
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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Secara opsional, siapkan proxy untuk menghindari pemblokiran IP
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https://username:password@your_proxy_address',
}


# Kirim permintaan HTTP GET dengan header dan proxy
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()  # Ensure we got a valid response

Langkah 3. Mengurai konten HTML

Selanjutnya, kita perlu mem-parsing konten HTML menggunakan lxml. Kita akan menggunakan fungsi fromstring dari modul lxml.html untuk mem-parsing konten HTML dari halaman web menjadi sebuah objek Element.

from lxml.html import fromstring

# Mengurai konten HTML menggunakan lxml
parser = fromstring(response.text)

Langkah 4. Ekstraksi data

Sekarang, kita akan mengekstrak titik data tertentu seperti judul properti, harga perkiraan sewa, dan harga taksiran menggunakan kueri XPath pada konten HTML yang diuraikan.

# Mengekstrak hak milik properti menggunakan XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))

# Mengekstrak harga estimasi sewa properti menggunakan XPath
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]

# Mengekstrak harga penilaian properti menggunakan XPath
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

# Menyimpan data yang diekstrak dalam kamus
property_data = {
    'title': title,
    'Rent estimate price': rent_estimate_price,
    'Assessment price': assessment_price
}

Langkah 5. Menyimpan data ke JSON

Terakhir, kita akan menyimpan data yang telah diekstrak ke file JSON untuk diproses lebih lanjut.

import json

# Tentukan nama file JSON keluaran
output_file = 'zillow_properties.json'

# Buka file dalam mode tulis dan buang datanya
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

print(f"Scraped data saved to {output_file}")

Menangani beberapa URL

Untuk mengikis beberapa daftar properti, kita akan mengulang daftar URL dan mengulangi proses ekstraksi data untuk setiap URL.

# Daftar URL yang akan dikikis
urls = [
    "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/",
    "https://www.zillow.com/homedetails/5678-Another-St-Some-City-CA-90210/87654321_zpid/"
]

# Daftar untuk menyimpan data untuk semua properti
all_properties = []

for url in urls:
    # Kirim permintaan HTTP GET dengan header dan proxy
    response = requests.get(url, headers=headers, proxies=proxies)
    response.raise_for_status()  # Ensure we got a valid response

    # Mengurai konten HTML menggunakan lxml
    parser = fromstring(response.text)

    # Mengekstrak data menggunakan XPath
    title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))
    rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]
    assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

    # Menyimpan data yang diekstrak dalam kamus
    property_data = {
        'title': title,
        'Rent estimate price': rent_estimate_price,
        'Assessment price': assessment_price
    }

    # Menambahkan data properti ke daftar
    all_properties.append(property_data)

Kode lengkap

Berikut ini adalah kode lengkap untuk mengikis data properti Zillow dan menyimpannya ke file JSON:

import requests
from lxml.html import fromstring
import json

# Tentukan URL target untuk daftar properti Zillow
urls = [
    "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/",
    "https://www.zillow.com/homedetails/5678-Another-St-Some-City-CA-90210/87654321_zpid/"
]

# Mengatur tajuk permintaan untuk meniru permintaan browser
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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Secara opsional, siapkan proxy untuk menghindari pemblokiran IP
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https': 'https://username:password@your_proxy_address',
}

# Daftar untuk menyimpan data untuk semua properti
all_properties = []

for url in urls:
    try:
        # Kirim permintaan HTTP GET dengan header dan proxy
        response = requests.get(url, headers=headers, proxies=proxies)
        response.raise_for_status()  # Ensure we got a valid response

        # Mengurai konten HTML menggunakan lxml
        parser = fromstring(response.text)

        # Mengekstrak data menggunakan XPath
        title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))
        rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]
        assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

        # Menyimpan data yang diekstrak dalam kamus
        property_data = {
            'title': title,
            'Rent estimate price': rent_estimate_price,
            'Assessment price': assessment_price
        }

        # Menambahkan data properti ke daftar
        all_properties.append(property_data)

    except requests.exceptions.HTTPError as e:
        print(f"HTTP error occurred: {e}")
    except requests.exceptions.RequestException as e:
        print(f"An error occurred: {e}")

# Tentukan nama file JSON keluaran
output_file = 'zillow_properties.json'

# Buka file dalam mode tulis dan buang datanya
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

print(f"Scraped data saved to {output_file}")

Dengan memahami struktur halaman HTML dan memanfaatkan pustaka yang kuat seperti request dan lxml, Anda dapat mengekstrak detail properti secara efisien. Menggunakan proxy dan User-Agents yang berotasi memungkinkan Anda untuk membuat permintaan dalam jumlah besar ke situs seperti Zillow tanpa risiko diblokir. Untuk aktivitas ini, proxy ISP statis atau proxy residensial bergilir merupakan pilihan yang optimal.

Komentar:

0 komentar