Python ile Zillow Emlak verilerini kazıma rehberi

Yorumlar: 0

Zillow'dan gayrimenkul bilgilerini çıkarmak, piyasa ve yatırımlar için mükemmel analizler sunabilir. Bu yazı, Zillow emlak listelerini Python ile kazımayı tartışmayı amaçlamaktadır ve burada atılan temel adımlar ve yönergeler üzerinde durulacaktır. Bu kılavuz size requests ve lxml gibi kütüphaneleri kullanarak Zillow web sitesinden nasıl bilgi kazıyacağınızı gösterecektir.

Gerekli kütüphanelerin yüklenmesi ve kazıma işleminin başlatılması

Başlamadan önce, sisteminizde Python'un kurulu olduğundan emin olun. Ayrıca aşağıdaki kütüphaneleri de yüklemeniz gerekecektir:

pip install requests
pip install lxml

Adım 1. Zillow'un HTML yapısını anlama

Zillow'dan veri ayıklamak için web sayfasının yapısını anlamanız gerekir. Zillow'da bir mülk listeleme sayfası açın ve kazımak istediğiniz öğeleri inceleyin (örneğin, mülk başlığı, kira tahmini fiyatı ve değerlendirme fiyatı).

Başlık:

1.png

Fiyat Detayları:

2.png

Adım 2. HTTP istekleri yapma

Şimdi HTTP istekleri gönderelim. İlk olarak, Zillow sayfasının HTML içeriğini almamız gerekiyor. Hedef URL'ye bir HTTP GET isteği göndermek için requests kütüphanesini kullanacağız. Ayrıca istek başlıklarını gerçek bir tarayıcı isteğini taklit edecek şekilde ayarlayacağız ve IP engellemesini önlemek için proxy kullanacağız.

import requests

# Zillow mülk listesi için hedef URL'yi tanımlama
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"

# İstek başlıklarını bir tarayıcı isteğini taklit edecek şekilde ayarlayın
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',
}

# İsteğe bağlı olarak, IP engellemesini önlemek için proxy'ler kurun
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https://username:password@your_proxy_address',
}


# HTTP GET isteğini başlıklar ve proxy'lerle birlikte gönderin
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()  # Ensure we got a valid response

Adım 3. HTML içeriğini ayrıştırma

Daha sonra, lxml kullanarak HTML içeriğini ayrıştırmamız gerekir. Web sayfasının HTML içeriğini bir Element nesnesine ayrıştırmak için lxml.html modülündeki fromstring fonksiyonunu kullanacağız.

from lxml.html import fromstring

# HTML içeriğini lxml kullanarak ayrıştırma
parser = fromstring(response.text)

Adım 4. Veri çıkarma

Şimdi, ayrıştırılmış HTML içeriğinde XPath sorgularını kullanarak mülk başlığı, kira tahmini fiyatı ve değerlendirme fiyatı gibi belirli veri noktalarını çıkaracağız.

# XPath kullanarak özellik başlığını çıkarma
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))

# XPath kullanarak mülk kira tahmini fiyatını çıkarma
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]

# XPath kullanarak mülk değerlendirme fiyatını çıkarma
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

# Çıkarılan verileri bir sözlükte saklayın
property_data = {
    'title': title,
    'Rent estimate price': rent_estimate_price,
    'Assessment price': assessment_price
}

Adım 5. Verileri JSON'a kaydetme

Son olarak, çıkarılan verileri daha fazla işlem için bir JSON dosyasına kaydedeceğiz.

import json

# Çıktı JSON dosya adını tanımlayın
output_file = 'zillow_properties.json'

# Dosyayı yazma modunda açın ve verileri dökün
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Birden fazla URL'yi işleme

Birden fazla emlak listesini kazımak için, bir URL listesi üzerinde yineleyeceğiz ve her biri için veri çıkarma işlemini tekrarlayacağız.

# Kazınacak URL'lerin listesi
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/"
]

# Tüm mülkler için veri depolamak üzere liste
all_properties = []

for url in urls:
    # HTTP GET isteğini başlıklar ve proxy'lerle birlikte gönderin
    response = requests.get(url, headers=headers, proxies=proxies)
    response.raise_for_status()  # Ensure we got a valid response

    # HTML içeriğini lxml kullanarak ayrıştırma
    parser = fromstring(response.text)

    # XPath kullanarak veri ayıklama
    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]

    # Çıkarılan verileri bir sözlükte saklayın
    property_data = {
        'title': title,
        'Rent estimate price': rent_estimate_price,
        'Assessment price': assessment_price
    }

    # Özellik verilerini listeye ekleme
    all_properties.append(property_data)

Tam kod

İşte Zillow emlak verilerini kazımak ve bir JSON dosyasına kaydetmek için eksiksiz kod:

import requests
from lxml.html import fromstring
import json

# Zillow emlak listeleri için hedef URL'leri tanımlama
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/"
]

# İstek başlıklarını bir tarayıcı isteğini taklit edecek şekilde ayarlayın
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',
}

# İsteğe bağlı olarak, IP engellemesini önlemek için proxy'ler kurun
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https': 'https://username:password@your_proxy_address',
}

# Tüm mülkler için veri depolamak üzere liste
all_properties = []

for url in urls:
    try:
        # HTTP GET isteğini başlıklar ve proxy'lerle birlikte gönderin
        response = requests.get(url, headers=headers, proxies=proxies)
        response.raise_for_status()  # Ensure we got a valid response

        # HTML içeriğini lxml kullanarak ayrıştırma
        parser = fromstring(response.text)

        # XPath kullanarak veri ayıklama
        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]

        # Çıkarılan verileri bir sözlükte saklayın
        property_data = {
            'title': title,
            'Rent estimate price': rent_estimate_price,
            'Assessment price': assessment_price
        }

        # Özellik verilerini listeye ekleme
        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}")

# Çıktı JSON dosya adını tanımlayın
output_file = 'zillow_properties.json'

# Dosyayı yazma modunda açın ve verileri dökün
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

HTML sayfalarının yapısını anlayarak ve requests ve lxml gibi güçlü kütüphanelerden yararlanarak, mülk ayrıntılarını verimli bir şekilde çıkarabilirsiniz. Proxy'ler kullanmak ve Kullanıcı Temsilcilerini döndürmek, engellenme riski olmadan Zillow gibi sitelere büyük miktarda istekte bulunmanızı sağlar. Bu faaliyetler için, statik ISP vekilleri veya dönüşümlü konut vekilleri en uygun seçenekler olarak kabul edilir.

Yorumlar:

0 yorumlar