Thu thập Dữ liệu Tài sản: Hướng dẫn về Thu thập Dữ liệu Tài sản Công cộng
TL;DR
Thu thập dữ liệu bất động sản thu thập thông tin tài sản đã được công bố, trong khi dữ liệu MLS, doanh số đã ghi và cổng thông tin niêm yết cung cấp các tập dữ liệu và quyền khác nhau.
Giữ danh tính niêm yết tách biệt khỏi danh tính tài sản và lưu trữ quan sát thay vì ghi đè lịch sử.
Chuẩn hóa tiền tệ, lượng bán so với thuê, thời gian thuê, đơn vị diện tích và dấu thời gian trước khi so sánh giá.
Hướng dẫn này bao gồm một trình phân tích có thể chạy cho hai trang HTML tổng hợp địa phương; nó không truy cập vào một cổng thông tin tài sản.
RESO định nghĩa các tiêu chuẩn, không phải một cơ sở dữ liệu MLS miễn phí. Quyền truy cập sản xuất đến từ nhà cung cấp và giấy phép liên quan.
Thực Thể Thu Thập Dữ Liệu Bất Động Sản Là Gì Và Nó Hoạt Động Như Thế Nào?
Thu thập dữ liệu bất động sản trích xuất các trường liên quan đến tài sản từ các nguồn được phép vào một tập dữ liệu có cấu trúc. Một quy trình điển hình phát hiện các trang niêm yết, thu thập nội dung được phê duyệt, phân tích các trường, xác thực và loại bỏ các bản ghi trùng lặp, và lưu trữ các quan sát để so sánh sau này.
Phân biệt giá hỏi đang hoạt động, giao dịch đã ghi, các đề nghị cho thuê, đánh giá và tổng hợp thị trường. Giá hỏi của một cổng thông tin không phải là giá bán đã ghi và một đánh giá có thể sử dụng một ngày và phương pháp định giá khác.
Dữ Liệu Bất Động Sản Nào Bạn Có Thể Trích Xuất?
Các trường có sẵn phụ thuộc vào nguồn, khu vực và thỏa thuận truy cập. Định nghĩa tập dữ liệu cần thiết trước khi chọn một trình thu thập dữ liệu.
Bảo toàn loại hình giá và đơn vị. Một khoản cho thuê hàng tháng không thể so sánh trực tiếp với giá hỏi bán hoặc cho thuê hàng tuần. Giữ thông tin “giá theo yêu cầu” là không xác định thay vì thay thế nó bằng không.
Lưu trữ văn bản hiển thị nguồn cùng với các giá trị đã chuẩn hóa khi khả thi. Một trình phân tích văn bản biến một phạm vi thành một số có thể tạo ra sự thay đổi giá giả. Thuế, phí, khuyến khích, và liệu có bao gồm chỗ đậu xe hay không cũng có thể ảnh hưởng đến khả năng so sánh.
Vị Trí, Tính Năng Tài Sản, Và Lịch Sử Niêm Yết
Một niêm yết không phải là một tài sản. Một tài sản có thể có nhiều niêm yết của đại lý, được niêm yết lại dưới một ID khác, hoặc chứa nhiều đơn vị.
Sử dụng các ID nguồn cho việc loại bỏ trùng lặp trong nội bộ nguồn. Đối với khớp thực thể giữa các nguồn, kết hợp các tính năng được phép thích hợp và giữ độ tin cậy; không bao giờ giả định một tiêu đề tương tự chứng minh danh tính. Tránh thu thập chi tiết liên lạc của người cư ngụ hoặc chủ sở hữu cho một dự án chỉ cần thống kê cấp thị trường.
Nguồn Dữ Liệu Bất Động Sản: Các Cổng Thông Tin, MLS, Và Hồ Sơ Công Cộng
Chọn một nguồn theo các định nghĩa trường của nó, chu kỳ cập nhật, phạm vi, và quyền.
Nguồn
Điểm mạnh điển hình
Hạn chế
Các trang cổng thông tin được phép
Các đề nghị hiện tại được hiển thị
Hạn chế truy cập, bản sao, thay đổi định giá
Dữ liệu cấp phép MLS/IDX
Dữ liệu niêm yết có cấu trúc
Khả năng đủ điều kiện, mục đích, và hạn chế phân phối
Hồ sơ chính phủ
Sự thật về tài sản hoặc giao dịch đã ghi
Quyền tài phán, độ trễ, sơ đồ, và chính sách truy cập
So Sánh Các Phương Pháp Thu Thập Dữ Liệu Bất Động Sản
Sử dụng phương pháp đã được phê duyệt đơn giản nhất mà trả về bằng chứng cần thiết.
Python Requests và Beautiful Soup
Đối với HTML tĩnh được ủy quyền, một khách hàng HTTP cộng với một trình phân tích HTML có thể là đủ. Ưu tiên các thuộc tính dữ liệu ổn định hoặc các bản ghi có cấu trúc hơn là các lớp trình bày được tạo ra.
Mẫu hoàn chỉnh dưới đây sử dụng HTMLParser tích hợp sẵn của Python nên nó chạy mà không cần gói bên ngoài. Beautiful Soup là một lựa chọn tiện lợi tùy chọn; nó không thay đổi quyền của nguồn hoặc làm cho các bộ chọn miễn nhiễm với thiết kế lại.
Playwright cho Các Niêm Yết Được Kết Xuất Bằng JavaScript
Đối với các trang động được phê duyệt, tự động hóa trình duyệt có thể chờ để lấy chứa niêm yết trước khi trích xuất. Tài liệu Playwright library documentation mô tả chu trình vòng đời của trình duyệt.
Đặt một điều kiện chờ có ý nghĩa, giới hạn số trang, và giải phóng các ngữ cảnh trình duyệt. Dừng lại ở đăng nhập, CAPTCHA, hoặc từ chối rõ ràng. Việc trình duyệt hiển thị có thể làm tăng chi phí runtime và bảo trì và không nên được sử dụng chỉ vì trang chứa JavaScript.
API Thu thập Dữ liệu Web Được Quản lý
Một dịch vụ được quản lý có thể vận hành việc thu thập trang trong khi ứng dụng của bạn xử lý việc phân tích và xác thực miền. Nstdata Crawl là một ứng viên cho lớp thu thập đó.
Không nên mô tả nó là có một sơ đồ cụ thể bảo đảm cho tài sản. Xác thực nội dung được trả về của nó trên các mục tiêu đã được phê duyệt trước khi xây dựng các trường như phòng ngủ, diện tích, hoặc trạng thái danh sách.
Bước từng bước: Xây dựng một Trình thu thập Dữ liệu Bất động sản với Python
Dự án xử lý hai trang địa phương tổng hợp, theo liên kết tiếp theo có ràng buộc, loại bỏ một danh sách trùng lặp giống hệt, chuẩn hóa diện tích, và xuất ra CSV/JSON cùng với các quan sát SQLite.
Không có cổng nào được truy cập. Các miền, vị trí, ID, và giá cả trong ví dụ là hư cấu.
Các trang thực tế có thể sử dụng JSON có cấu trúc, các đơn vị khác nhau, hoặc các giá trị có thể là null. Kiểm tra một mẫu nguồn được phép và giữ nguyên ý nghĩa ban đầu trước khi viết các bộ chọn.
"""Trích xuất các danh sách tổng hợp từ các trang HTML địa phương; không có truy cập cổng."""import argparse
import csv
import json
import sqlite3
from datetime import datetime, timezone
from decimal import Decimal
from html.parser import HTMLParser
from pathlib import Path
from urllib.parse import urljoin
classListings(HTMLParser):def__init__(self):super().__init__() self.rows, self.next_page =[],None self.row, self.title =None,Falsedefhandle_starttag(self, tag, attrs): a =dict(attrs)if tag =="article"and"listing"in a.get("class","").split(): self.row =dict(listing_id=a["data-id"], title="", amount=a["data-price"], currency=a["data-currency"], area=a["data-area"], area_unit=a["data-area-unit"], location=a["data-location"], offer_type=a["data-offer"])if tag =="h2"and self.row isnotNone: self.title =Trueif tag =="a"and self.row isnotNoneand a.get("class")=="details": self.row["url"]= urljoin("https://property-demo.example/", a["href"])if tag =="a"and"next"in a.get("rel","").split(): self.next_page = a["href"]defhandle_data(self, data):if self.title: self.row["title"]+= data
defhandle_endtag(self, tag):if tag =="h2": self.title =Falseif tag =="article"and self.row isnotNone: self.rows.append(self.row) self.row =Nonedefnormalize(row): price, area = Decimal(row.pop("amount")), Decimal(row.pop("area"))ifnot price.is_finite()ornot area.is_finite()or price <=0or area <=0:raise ValueError("Giá hoặc diện tích không hợp lệ") unit = row.pop("area_unit")if unit notin("sqft","sqm")or row["offer_type"]notin("sale","rent_monthly"):raise ValueError("Đơn vị hoặc loại đề nghị không rõ") area_sqm = area * Decimal("0.09290304")if unit =="sqft"else area
return{**row,"title": row["title"].strip(),"price":str(price),"area_sqm":str(area_sqm.quantize(Decimal("0.01")))}defcollect(root): root = root.resolve() current, seen_pages, rows = root /"page1.html",set(),{}for _ inrange(5): current = current.resolve()ifnot current.is_relative_to(root)or current in seen_pages:raise ValueError("Đường dẫn trang không an toàn hoặc bị lặp lại") seen_pages.add(current) parsed = Listings() parsed.feed(current.read_text())for raw in parsed.rows: row = normalize(raw) key = row["listing_id"]if key in rows and rows[key]!= row:raise ValueError("Danh sách trùng lặp xung đột") rows[key]= row
ifnot parsed.next_page:returnlist(rows.values()) current = current.parent / parsed.next_page
raise ValueError("Ngân sách phân trang đã vượt quá")if __name__ =="__main__": parser = argparse.ArgumentParser() parser.add_argument("--fixtures", default="property_fixture") parser.add_argument("--db", default="property.sqlite") args = parser.parse_args() rows = collect(Path(args.fixtures)) observed = datetime.now(timezone.utc).isoformat()ifnot rows:raise SystemExit("Không có danh sách được chấp nhận")with sqlite3.connect(args.db)as db: db.execute("""CREATE TABLE IF NOT EXISTS observations(
listing_id TEXT, observed_at TEXT, payload TEXT,
PRIMARY KEY(listing_id,observed_at))""") db.executemany("INSERT INTO observations VALUES(?,?,?)",[(row["listing_id"], observed, json.dumps(row))for row in rows]) Path("property.json").write_text(json.dumps(rows, indent=2))withopen("property.csv","w", newline="")as handle: writer = csv.DictWriter(handle, fieldnames=list(rows[0])) writer.writeheader() writer.writerows(rows)print(f"danh sách_được_chấp_nhận_unique={len(rows)}")Nhà phân tích dữ liệu chặt chẽ gặp lỗi khi các thuộc tính yêu cầu bị thiếu. Một nhà phân tích sản xuất nên ghi lại một danh sách bị từ chối và bằng chứng của nó thay vì im lặng viết một bản ghi đã chấp nhận không hoàn chỉnh.### Bước 3: Xử lý Phân trang và Danh sách bị Trùng lặpBộ giải quyết trang tiếp theo địa phương thực thi thư mục fixture, từ chối vòng lặp trang và có một ngân sách trang. Nó chấp nhận ID danh sách lặp lại bằng nhau nhưng từ chối các khối lượng nghi ngờ bị xung đột.Đối với một nguồn từ xa đã được phê duyệt, sử dụng [phát hiện URL hạn chế](https://www.nstdata.io/blog/website-url-discovery), hạn chế điều hướng đến các nguồn đã được xem xét, xác thực chuyển hướng, theo dõi các URL đã truy cập và tuân thủ các giới hạn yêu cầu theo nguồn. Đối chiếu một snapshot đầy đủ trước khi quyết định một danh sách bị thiếu là không hoạt động.Cùng một ID danh sách có thể thay đổi giá theo thời gian. Loại bỏ trùng lặp trong một lượt chạy; giữ các quan sát riêng biệt qua các lượt chạy.### Bước 4: Làm sạch và Chuẩn hóa Dữ liệu Tài sảnSử dụng Decimal cho giá và chuyển đổi diện tích từ feet vuông sang mét vuông một cách rõ ràng. Bảo tồn đơn vị diện tích ban đầu và cơ sở đo lường trong các bản ghi sản xuất.Đối với các kiểm tra dạng bảng, ví dụ Pandas sau đây đọc JSON đã được tạo:
```python
import pandas as pd
frame = pd.read_json("property.json", dtype=False)frame["price_numeric"]= pd.to_numeric(frame["price"], errors="raise")frame["area_sqm_numeric"]= pd.to_numeric(frame["area_sqm"], errors="raise")assert frame["listing_id"].is_unique
assert frame["price_numeric"].gt(0).all()assert frame["area_sqm_numeric"].gt(0).all()print(frame[["listing_id","offer_type","currency","price","area_sqm"]])
Pandas là lựa chọn cho trình thu thập dữ liệu hoàn chỉnh. Cài đặt riêng nếu đang sử dụng đoạn phân tích này. Kiểm tra fixture bao gồm một danh sách kích thước feet vuông và một thuê diện tích mét vuông; những loại này nên giữ các loại đề nghị riêng biệt.
Bước 5: Lưu trữ Danh sách trong CSV hoặc Cơ sở dữ liệu
Mẫu SQLite lưu trữ thời gian quan sát và khối JSON thay vì ghi đè từng giá trị trước đó. Mở rộng chìa khóa sản xuất với không gian tên nguồn và giữ ID nguồn ban đầu.
Các trường bổ sung được khuyến nghị bao gồm tình trạng danh sách, thời gian thu thập nguồn, lần đầu thấy, lần cuối thấy, phiên bản phân tích, và vị trí bằng chứng. Xuất CSV là các tác phẩm xem xét; kho lịch sử nên lưu giữ đủ ngữ cảnh để tái tạo các so sánh.
Thách thức và Giải pháp Thu thập Dữ liệu Bất động sản
Các trường bị thiếu có thể phản ánh dữ liệu không được công bố thay vì thất bại của trình phân tích. Phân biệt các giá trị không xác định, không áp dụng, và bị từ chối.
Nhiều loại tiền tệ, quy tắc thập phân, định nghĩa diện tích, quy tắc phòng ngủ khu vực và tình trạng danh sách đòi hỏi chuẩn hóa theo nguồn cụ thể. Thông báo khi độ hoàn chỉnh của trường trong mẫu thay đổi và cách ly lượt chạy trước khi nó tạo ra một báo cáo thị trường gây hiểu lầm.
Cách Xây dựng một Đường ống Giám sát Giá Bất động sản
Xây dựng một đường ống giám sát giá với quy trình thu mua đã được phê duyệt theo lịch trình → xác minh trường dữ liệu → khớp danh sách → lựa chọn quan sát so sánh → phát hiện thay đổi → xem xét → báo cáo.
Tính toán một sự thay đổi giá chỉ khi danh tính nguồn, loại đề nghị, tiền tệ, thời gian thuê, và cơ sở tài sản khớp nhau. Nếu một diện tích hoặc tiêu đề cũng thay đổi, điều tra xem một đơn vị mới hoặc một trình phân tích đã thay đổi có gây ra sự chuyển động rõ ràng hay không.
Giữ cả quan sát và lý do thay đổi. Không tạo cảnh báo từ các truy vấn chưa được xác minh.
Thu thập Dữ liệu Bất động sản cho Phân tích Thị trường
Các mẫu danh sách công khai có thể hỗ trợ nghiên cứu mô tả, nhưng chúng không tự động đại diện cho tất cả các giao dịch hoặc kho nhà ở.
Báo cáo địa lý, phạm vi nguồn, cửa sổ quan sát, số lượng mẫu, phương pháp trùng lặp, và các bản ghi bị loại trừ. Giá trung bình yêu cầu, giá trung bình giao dịch, và giá thuê mỗi khu vực mô tả các quần thể khác nhau.
“Ngày được quan sát trên trang web” không nhất thiết là tổng số ngày trên thị trường, đặc biệt với việc tái niêm yết và thiếu dữ liệu lịch sử. Các phép tính lợi suất cũng cần chi phí và giá thuê thực tế có thể đạt được, không chỉ là các giá trị được quảng cáo.
Mở rộng thu thập dữ liệu bất động sản
Tuân theo thực hành thu thập sản xuất và phân chia theo nguồn đã được phê duyệt và nhóm địa lý, với ngân sách yêu cầu rõ ràng và các nhiệm vụ có thể tiếp tục. Lưu trữ siêu dữ liệu ổn định, cập nhật các đề nghị thay đổi và theo dõi tỷ lệ hồ sơ được chấp nhận.
Các lần thu thập toàn bộ trình duyệt liên tiếp có thể tốn kém hơn so với các luồng cấp phép gia tăng. Đo lường lưu trữ, lưu lượng proxy nếu được sử dụng, các trường bị từ chối, công việc phù hợp thực thể và giờ làm việc của nhà điều hành trước khi mở rộng ra các thành phố.
Chi phí thu thập bất động sản: API vs Tự lưu trữ
So sánh tổng chi phí thu mua, cấp phép, trình bày, lưu trữ, đối chiếu, xem xét và bảo trì cho mỗi 1.000 danh sách khác biệt đã được chấp nhận.
Một bản ghi API không nhất thiết là một tài sản riêng biệt. Một ID cụ thể theo nguồn cũng không thể giải quyết tất cả các bản sao chéo giữa các nguồn. Bao gồm cả giai đoạn đối chiếu và xem xét trong ước tính thu mua.
Xem xét pháp lý, quyền riêng tư và các cân nhắc cấp phép dữ liệu
Xem lại các điều khoản cổng, thỏa thuận MLS/IDX, điều kiện dữ liệu của chính phủ, quyền sở hữu ảnh, thời gian lưu giữ và phân phối lại. Việc tuân thủ RESO mô tả một tiêu chuẩn, không phải quyền sử dụng mọi luồng.
Một địa chỉ liên quan đến một đề nghị công khai vẫn có thể tạo ra lo ngại về quyền riêng tư khi kết hợp với chi tiết của người cư trú hoặc chủ sở hữu. Chỉ thu thập độ chính xác của vị trí và các trường khác cần thiết cho nhiệm vụ đã được phê duyệt. Giấy phép truy cập của nhà cung cấp có thể cho phép phân tích nội bộ trong khi hạn chế việc xuất bản công khai.
Danh sách kiểm tra cuối cùng cho các đường ống dữ liệu bất động sản đáng tin cậy
Bắt đầu bằng thiết bị được cung cấp, sau đó xác thực một nguồn đã được ủy quyền với định nghĩa trường đã biết. Xác nhận danh tính danh sách, chuyển đổi đơn vị, lịch sử, xử lý vòng lặp trang, lý do bị từ chối và quyền trước khi lập lịch.
Mở rộng chỉ sau khi một chu kỳ cập nhật hoàn chỉnh có thể phân biệt sự thay đổi danh sách thực từ dữ liệu bị thiếu, phủ sóng một phần và độ trôi của trình phân tích.
Kiểm tra các trang tài sản đã được phê duyệt
Xác thực nội dung nguồn trước khi áp dụng các quy tắc trích xuất cụ thể cho tài sản.
Nó trích xuất dữ liệu liên quan đến tài sản từ các nguồn được phép vào các hồ sơ có cấu trúc với ngữ cảnh nguồn và dấu thời gian.
Q: Tôi có thể thu thập dữ liệu từ Zillow hoặc Realtor.com không?
Kiểm tra quyền truy cập và thỏa thuận cấp phép hiện tại của họ. Một danh sách công khai không thiết lập quyền truy cập tự động không hạn chế hoặc quyền phân phối lại.
Q: RESO có cung cấp khóa API MLS miễn phí không?
Không. RESO xác định các tiêu chuẩn; MLS hoặc nhà cung cấp dữ liệu khác kiểm soát quyền truy cập và thông tin xác thực.
Q: Ví dụ có liên kết với một trang web tài sản trực tiếp không?
Không. Nó chạy trên hai trang HTML tổng hợp được bao gồm và minh họa việc phân tích, phân trang, chuẩn hóa và lưu trữ.
Q: Tại sao cần phân biệt ID danh sách và ID tài sản?
Một tài sản có thể có nhiều danh sách hoặc được tái niêm yết. Giữ cho các danh tính riêng biệt ngăn ngừa việc trùng lặp sai và lịch sử.
Q: API dữ liệu tài sản tốt nhất là gì?
Chọn theo quy chế, các trường yêu cầu, độ tươi mới, quyền nguồn, hành vi cập nhật/xóa và chi phí hồ sơ đã được chấp nhận. Không có sự lựa chọn chung nào.
Lena Zhou
Oct. 19th 2026
Trải nghiệm Nstproxy Crawl - Bắt Đầu Dùng Thử Miễn Phí Hôm Nay
Thu thập toàn bộ trang web chỉ với một yêu cầu API
Chuyển mọi trang web thành Markdown, HTML, JSON, liên kết, PDF và hơn thế nữa mà không cần quản lý hạ tầng thu thập dữ liệu.
Tỷ lệ thành công 99,8% với kết xuất JavaScript
Nhận dữ liệu sạch, sẵn sàng cho LLM ở nhiều định dạng