Bỏ để qua phần nội dung

Cách lấy dữ liệu từ Zillow: Hướng dẫn từng bước dành cho chuyên gia bất động sản

Là một trong những trang web bất động sản phổ biến nhất với hơn 200 triệu lượt truy cập hàng tháng, Zillow cung cấp một kho dữ liệu cho các chuyên gia trong ngành. Bằng cách thu thập và phân tích tất cả dữ liệu đó, bạn có thể khám phá những hiểu biết sâu sắc về thị trường để thúc đẩy hoạt động kinh doanh của mình.

Nhưng bạn bắt đầu ở đâu? Đừng lo lắng – trong hướng dẫn này, tôi sẽ chia sẻ các kỹ thuật chính xác mà tôi đã mài giũa hơn 10 năm trong việc trích xuất dữ liệu web để xây dựng một công cụ quét Zillow có thể mở rộng từ đầu.

Tại sao dữ liệu Zillow là mỏ vàng

Trước tiên hãy nói về tại sao các nhà đầu tư và đại lý hiểu biết đã thu hút Zillow ngay từ đầu:

  • Phát hiện cơ hội: Phân tích dữ liệu về giá cả và nhu cầu để xác định các khu vực sắp phát triển hoặc bị định giá thấp.
  • Làm phong phú cơ sở dữ liệu của bạn: Tăng cường hồ sơ khách hàng của bạn với các chi tiết tài sản như giường, phòng tắm, giá trị thuế.
  • Theo dõi cuộc thi: Theo dõi danh sách mới từ các đại lý khác tham gia thị trường.
  • Xác nhận tình trạng tài sản: Nghiên cứu gần đây đã bán nhà để xác minh yêu cầu của chủ sở hữu hiện tại.
  • Khám phá xu hướng thị trường: Nhu cầu về bất động sản gần các khu phát triển thương mại mới tăng vọt.

Với hơn 9 tỷ lượt truy cập và hơn 50 triệu người dùng hoạt động hàng tháng, Zillow cung cấp dữ liệu bất động sản có chiều sâu và chiều rộng vô song.

Những thách thức cần vượt qua

Tất nhiên, việc khai thác tất cả dữ liệu đó không phải lúc nào cũng đơn giản. Dưới đây là một số trở ngại phổ biến mà bạn có thể gặp phải:

  • Phát hiện bot: Zillow chặn các trình dọn dẹp bằng hình ảnh xác thực, bộ lọc IP và các biện pháp bảo vệ khác.
  • Kết xuất JavaScript: Các chi tiết chính được tải động thông qua JS.
  • Thay đổi bố cục thường xuyên: Cập nhật liên tục phá vỡ các mẩu tin lưu niệm.
  • Giới hạn tỷ lệ: Khối tích cực theo yêu cầu mỗi phút.

Nhưng đừng lo lắng – tôi sẽ chia sẻ các phương pháp đã được chứng minh để giải quyết từng vấn đề. Với cách tiếp cận phù hợp, bạn có thể trích xuất hàng nghìn bản ghi mỗi ngày từ Zillow một cách đáng tin cậy.

Bước 1: Thiết lập môi trường quét web Python

Đối với dự án này, chúng tôi sẽ sử dụng Python – ngôn ngữ lý tưởng để quét web và phân tích dữ liệu.

Đầu tiên, hãy cài đặt Python 3.6 trở lên nếu bạn chưa có. Tôi khuyên bạn nên tạo một môi trường ảo để tách biệt các phần phụ thuộc:

python3 -m venv zillowscraping

Kích hoạt môi trường, sau đó cài đặt các gói chúng ta cần:

pip install requests beautifulsoup4 pandas matplotlib selenium webdriver-manager

Điều này cung cấp cho chúng tôi các công cụ để gửi yêu cầu, phân tích cú pháp HTML, phân tích dữ liệu, tự động hóa trình duyệt, v.v.

Bây giờ niềm vui thực sự có thể bắt đầu!

Bước 2: Kiểm tra các trang mục tiêu

Tiếp theo, chúng tôi sẽ phân tích thủ công các trang mà chúng tôi muốn thu thập dữ liệu bằng các công cụ dành cho nhà phát triển trình duyệt:

Công cụ phát triển trình duyệt

Trên trang kết quả tìm kiếm, HTML trông giống như:

<div class="property-card">
  <div class="details">
    <div class="price">$299,000</div> 
    <div class="address">
      <a href="/vi/1234-maple-st">1234 Maple St</a>
    </div>
    <div class="specs">
      3 bd | 2 ba | 1,420 sqft
    </div>
  </div>
</div>

Chúng ta có thể thấy các yếu tố rõ ràng về giá cả, địa chỉ, giường, phòng tắm và diện tích. Đẹp!

Bây giờ hãy kiểm tra một trang danh sách riêng lẻ:

<script>window.dataLayer = [{"property":"1234 Maple St"}];</script>

<div id="price"></div>

<script src="getDetails.js"></script>

Hmm…chi tiết được tải động thông qua JavaScript. Không vấn đề gì – chúng ta có thể sử dụng Selenium để hiển thị các trang và trích xuất dữ liệu mà chúng ta muốn.

Bước 3: Quét trang kết quả tìm kiếm

Được trang bị khả năng khám phá của chúng tôi, hãy loại bỏ các kết quả tìm kiếm đó.

Đầu tiên chúng ta sẽ yêu cầu trang HTML:

import requests

url = "https://zillow.com/my-search-results/"
headers = {"User-Agent": "Mozilla..."} 

response = requests.get(url, headers=headers)
html = response.text

Sau đó chúng ta có thể phân tích bằng Beautiful Soup:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

Bây giờ trích xuất dữ liệu:

cards = soup.find_all("div", class_="property-card")

for card in cards:
  price = card.find("div", class_="price").text
  address = card.find("a").text
  beds, baths, sqft = card.find("div", class_="specs").text.split("|")

  print({
    "price": price, 
    "address": address,
    ...
  })

Để xử lý việc phân trang, chúng ta có thể kiểm tra liên kết "Tiếp theo" và lặp lại quy trình cho đến khi không còn trang nào nữa.

Bước 4: Scraping trang chi tiết với Selenium

Đối với các trang danh sách riêng lẻ, chúng tôi sẽ sử dụng Selenium để tự động hóa trình duyệt và hiển thị JavaScript.

Cài đặt ChromeDriver:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install()) 

Bây giờ chúng ta có thể trích xuất chi tiết:

def get_listing_data(url):

  driver.get(url)

  price = driver.find_element_by_id("price").text
  address = driver.find_element_by_id("address").text
  ...

  return {
    "price": price,
    "address": address,
    ...
  }

Gọi hàm này để loại bỏ từng trang khi chúng tôi lặp qua các URL kết quả tìm kiếm.

Bước 5: Tránh chặn bằng proxy và tác nhân người dùng

Để tránh sự phòng thủ của Zillow, điều cần thiết là định tuyến các yêu cầu thông qua người ủy nhiệm và thường xuyên xoay tác nhân người dùng:

from random import choice 

proxies = ["192.168.1.1:8080", "192.168.1.2:8080"...]
user_agents = ["UA1", "UA2"...]

proxy = choice(proxies)
headers = {"User-Agent": choice(user_agents)}

response = requests.get(url, proxies={"http": proxy, "https": proxy}, headers=headers)

Điều này giúp phân phối yêu cầu trên nhiều IP khác nhau và bắt chước người dùng thực.

Tôi khuyên bạn nên hợp tác với các dịch vụ proxy như BrightData, SmartProxy hoặc Microleaves để có quyền truy cập vào hàng triệu IP dân cư hoàn hảo để tránh bị chặn.

Bước 6: Thực hiện điều chỉnh và thử lại

Để tránh đạt đến giới hạn tốc độ, chúng tôi cần điều chỉnh các yêu cầu bằng cách thêm độ trễ ngẫu nhiên:

from time import sleep
from random import randint

# Make request
sleep(randint(1, 5)) # Random delay

Và sử dụng các khối thử/ngoại trừ để thử lại các lỗi:

from requests.exceptions import RequestException

try:
  response = requests.get(url)
except RequestException as e:
  # Retry with exponential backoff
  sleep(2**num_retries)  
  response = requests.get(url) 

Điều này tạo ra một máy cạo đàn hồi có thể cung cấp năng lượng cho các vấn đề không liên tục.

Bước 7: Lưu trữ dữ liệu cóp nhặt

Sau khi cạo, chúng ta cần lưu trữ dữ liệu. Đối với các dự án nhỏ hơn, tệp CSV có thể đủ:

import csv

with open("zillow.csv", "w") as f:
  writer = csv.writer(f)
  writer.writerow(["Address", "Price", "Beds", "Baths" ...])
  for listing in listings:
    writer.writerow(listing)  

Đối với các tập dữ liệu lớn hơn, hãy tải vào cơ sở dữ liệu SQL hoặc kho lưu trữ NoSQL như MongoDB. Điều này cho phép xây dựng bảng điều khiển và bản đồ tương tác để khám phá thông tin chi tiết!

Hãy bắt đầu cạo!

Bạn đã có nó rồi – một quy trình đã được thử nghiệm trong thực tế để thu thập dữ liệu bất động sản từ Zillow. Giờ đây, bạn có thể khai thác danh sách phong phú của nó để đưa doanh nghiệp của mình lên một tầm cao mới.

Khi bạn bắt đầu thu thập dữ liệu, vui lòng liên hệ nếu bạn có bất kỳ câu hỏi nào khác! Tôi luôn sẵn lòng giúp đỡ các chuyên gia bất động sản đồng nghiệp sử dụng dữ liệu hiệu quả hơn.

Hãy cho tôi biết khi bạn bắt đầu trích xuất hàng nghìn danh sách Zillow mới mỗi ngày!

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *