
Anh Tuan
Data Science Expert

AntiCloudflareTask với proxy tĩnh hoặc dính và trình duyệt Chrome có cùng user agent.cf_clearance, thông tin xác thực proxy và nội dung trang thô trong bộ nhớ thời gian ngắn, không phải trong phân tích hoặc ngữ cảnh mô hình.Theo dõi giá bất động sản đáng tin cậy chỉ khi mỗi quan sát có ý nghĩa rõ ràng và nguồn gốc rõ ràng. Giá chào bán của một danh sách không phải là giao dịch được ghi nhận, ước tính tự động không phải là giao dịch, và chỉ số thị trường không thể được coi là giá theo từng bất động sản. Đường dẫn mạnh nhất bắt đầu từ các tập dữ liệu chính thức và nguồn cấp dữ liệu được cấp phép, chuẩn hóa danh tính bất động sản và loại giá, và chỉ sử dụng trang công khai được ủy quyền cho các khoảng trống được xác định. Nếu một cuộc thử thách Cloudflare được hỗ trợ thay thế trang danh sách mong đợi, CapSolver có thể cung cấp bước phục hồi được kiểm soát, nhưng quy trình phải bảo tồn proxy, user agent Chrome, phạm vi cookie và chính sách nguồn. Hướng dẫn này bao gồm phân cấp nguồn dữ liệu, lược đồ quan sát, quy tắc tương đương, phát hiện thử thách, AntiCloudflareTask, phục hồi phiên bản ngắn hạn, xác nhận thay đổi giá, kiểm soát chất lượng và sử dụng có trách nhiệm.
Một công việc theo dõi bất động sản nên xác định chính xác tín hiệu cần thiết. Các ví dụ bao gồm:
Không nên kết hợp các câu hỏi này thành một trường "giá" chung.
monitoring_job = {
"canonical_property_id": "prop_83f12",
"market": "US-CA-San-Francisco",
"source_priority": [
"official_transaction_dataset",
"licensed_listing_feed",
"partner_api",
"authorized_public_page",
],
"price_types": ["ASKING_SALE", "RECORDED_SALE"],
"alert_rules": {
"asking_change_percent": 3.0,
"status_changes": ["ACTIVE_TO_PENDING", "PENDING_TO_SOLD"],
},
}
Bài viết blog thu thập dữ liệu web của CapSolver đề cập đến các mô hình chuỗi dữ liệu liên quan, và FAQ thu thập dữ liệu web của CapSolver cung cấp hướng dẫn vận hành cho việc thu thập dữ liệu công khai được ủy quyền.
Dữ liệu chính thức và được cấp phép nên là lớp đầu tiên. Chỉ số Giá Nhà của Cơ quan Quản lý Nhà ở Liên bang Hoa Kỳ House Price Index là một bộ sưu tập công khai các chỉ số bán lại lặp lại bao phủ nhiều cấp độ địa lý. Nó hữu ích cho các chuẩn mực thị trường, nhưng không phải là nguồn cấp dữ liệu danh sách theo từng bất động sản.
Đối với dữ liệu giao dịch được ghi nhận, hãy sử dụng hồ sơ đất, hồ sơ ghi lại, hoặc nhà cung cấp được cấp phép liên quan. Dữ liệu Price Paid Data của chính phủ Anh là một ví dụ về tập dữ liệu giao dịch chính thức. Các API danh sách hoặc cổng được cấp phép có thể cung cấp quan sát giá chào bán và trạng thái hiện tại theo hợp đồng của riêng họ.
| Nguồn | Ý nghĩa giá | Vai trò được khuyến nghị | Hạn chế chính |
|---|---|---|---|
| Chỉ số giá chính thức | Xu hướng thị trường | Bối cảnh chuẩn mực và bất thường | Không theo từng bất động sản |
| Ghi chép giao dịch công khai | Giao dịch được ghi nhận | Xác minh và lịch sử | Thời gian công bố thay đổi |
| Nguồn cấp dữ liệu danh sách được cấp phép | Giá chào bán và trạng thái hiện tại | Nguồn chính cho danh sách hoạt động | Hạn chế hợp đồng và phạm vi |
| API đối tác | Các trường thương mại được xác định | Nguồn vận hành có cấu trúc | Ngữ nghĩa cụ thể nhà cung cấp |
| Trang công khai được ủy quyền | Xác minh cho người mua | Bù đắp và kiểm tra chất lượng | Xác minh giao diện và lưu lượng truy cập |
Thu thập trình duyệt nên là phương án dự phòng cho khoảng trống dữ liệu được ghi chép, không phải thay thế cho nguồn cấp dữ liệu được cấp phép.
Danh tính bất động sản khó vì địa chỉ thay đổi định dạng, đơn vị có thể bị bỏ qua, và một tòa nhà có thể chứa nhiều lô.
from dataclasses import dataclass
@dataclass(frozen=True)
class PropertyIdentity:
canonical_property_id: str
country: str
administrative_area: str
locality: str
postal_code: str
street_number: str
street_name: str
unit: str | None
parcel_id: str | None
latitude: float | None
longitude: float | None
Phân loại hồ sơ một cách thận trọng. Mã lô hoặc mã tài sản mạnh hơn địa chỉ được chuẩn hóa; mã đơn vị chính xác mạnh hơn tọa độ cấp tòa nhà. Gửi các khớp không rõ ràng đến xem xét.
Bài viết hướng dẫn thu thập dữ liệu web bằng Python của CapSolver cung cấp bối cảnh triển khai cho các chuỗi xử lý trích xuất có cấu trúc.
from dataclasses import dataclass, field
from datetime import datetime, timezone
@dataclass
class PriceObservation:
canonical_property_id: str
source: str
source_record_id: str | None
source_url: str | None
price_type: str
amount: float
currency: str
area_value: float | None
area_unit: str | None
status: str | None
market: str
evidence_hash: str
parser_version: str
observed_at: str = field(
default_factory=lambda: datetime.now(timezone.utc).isoformat()
)
Sử dụng từ vựng giá loại được kiểm soát:
PRICE_TYPES = {
"ASKING_SALE",
"RECORDED_SALE",
"ASKING_RENT_MONTHLY",
"VALUATION_ESTIMATE",
"PRICE_PER_AREA",
"MARKET_INDEX",
}
Không bao giờ so sánh trực tiếp ASKING_SALE với RECORDED_SALE hoặc VALUATION_ESTIMATE. Lưu trữ đơn vị tiền tệ và diện tích.
Một cuộc thử thách có thể trả về trang trung gian thay vì trang bất động sản mong đợi. Không nên hiểu các lựa chọn giá bị thiếu là đã hủy đăng ký hoặc giá bằng không.
async def classify_property_page(page, expected_selector: str) -> str:
if await page.locator(expected_selector).count():
return "PROPERTY_PAGE"
title = (await page.title()).strip().lower()
html = (await page.content()).lower()
if "just a moment" in title:
return "CLOUDFLARE_CHALLENGE"
if "challenge-platform" in html or "cf-chl-" in html:
return "CLOUDFLARE_CHALLENGE"
if "listing no longer available" in html:
return "LISTING_UNAVAILABLE"
return "UNKNOWN_PAGE"
Duy trì các bộ thử nghiệm cụ thể cho từng nguồn. Một ký hiệu chung là hướng dẫn định tuyến, không phải bằng chứng rằng mọi mục tiêu đều có thể hoặc nên được phục hồi.
Trang sản phẩm Cloudflare của CapSolver mô tả dịch vụ được hỗ trợ, và bài viết blog Cloudflare của CapSolver chứa hướng dẫn triển khai bổ sung.
Tài liệu Cloudflare Challenge của CapSolver định nghĩa AntiCloudflareTask.
| Trường | Bắt buộc | Sử dụng theo dõi bất động sản |
|---|---|---|
type |
Có | AntiCloudflareTask |
websiteURL |
Có | Trang danh sách hoặc ghi chép công khai được phê duyệt |
proxy |
Có | Proxy tĩnh hoặc dính được sử dụng cho phiên yêu cầu |
userAgent |
Tùy chọn | Cùng trình duyệt Chrome được hỗ trợ |
html |
Tùy chọn | HTML thử thách mới từ phiên dính |
Giải pháp có thể chứa cf_clearance, token và user agent. Những giá trị này là thời gian ngắn, không phải dữ liệu bất động sản.
Tài liệu challenges của Cloudflare giải thích vai trò của cơ chế thử thách. Khả năng phục hồi không thay đổi quyền truy cập nguồn hoặc giới hạn hợp đồng.
import os
from urllib.parse import urlparse
SOURCE_POLICY = {
"approved-listings.example": {
"purpose": "asking-price-validation",
"proxy_profile": "property_us_west",
"max_checks_per_hour": 2,
},
}
PROXY_VAULT = {
"property_us_west": os.environ["PROPERTY_PROXY_US_WEST"],
}
def approved_source(url: str) -> dict:
host = urlparse(url).hostname
policy = SOURCE_POLICY.get(host)
if not policy:
raise PermissionError("Property source is not approved")
return policy
URL đích nên đến từ một bản ghi nguồn được đăng ký, không phải văn bản tự do do mô hình hoặc người dùng cung cấp trong bộ lập lịch sản xuất.
AntiCloudflareTaskimport capsolver
capsolver.api_key = os.environ["CAPSOLVER_API_KEY"]
def solve_property_page_challenge(
url: str,
chrome_user_agent: str,
fresh_html: str = "",
) -> dict:
policy = approved_source(url)
proxy = PROXY_VAULT[policy["proxy_profile"]]
task = {
"type": "AntiCloudflareTask",
"websiteURL": url,
"proxy": proxy,
"userAgent": chrome_user_agent,
}
if fresh_html:
task["html"] = fresh_html
solution = capsolver.solve(task)
cookies = solution.get("cookies") or {}
clearance = cookies.get("cf_clearance") or solution.get("token")
if not clearance:
raise RuntimeError("Cloudflare Challenge solution is incomplete")
return {
"cookies": cookies,
"user_agent": solution.get("userAgent") or chrome_user_agent,
"proxy_profile": policy["proxy_profile"],
}
Sử dụng proxy tĩnh hoặc dính và duy trì nó cho yêu cầu ban đầu, tạo nhiệm vụ và phục hồi trang. Không đặt thông tin xác thực proxy trong nhật ký.
Tài liệu CapSolver chính thức yêu cầu trình khách hàng có khả năng TLS và chi tiết phiên bản nhất quán. Giữ triển khai này bên trong bộ thích ứng nguồn được kiểm tra.
async def recover_property_document(
source_adapter,
url: str,
challenge_html: str,
user_agent: str,
) -> str:
solution = solve_property_page_challenge(
url=url,
chrome_user_agent=user_agent,
fresh_html=challenge_html,
)
response = await source_adapter.fetch_with_session(
url=url,
proxy_profile=solution["proxy_profile"],
user_agent=solution["user_agent"],
cookies=solution["cookies"],
)
if response.status_code != 200:
raise RuntimeError("Recovered request did not return HTTP 200")
if "challenge-platform" in response.text.lower():
raise RuntimeError("Challenge remained after one recovery attempt")
return response.text
fetch_with_session là bộ thích ứng do ứng dụng sở hữu, sử dụng hồ sơ TLS được phê duyệt. Nó không nên tiết lộ cookie, giá trị proxy hoặc tiêu đề đến phân tích.
Trang công khai thay đổi. Sử dụng một bộ thích ứng cho mỗi nguồn được phê duyệt với các lựa chọn rõ ràng và kiểm tra ngữ nghĩa.
from decimal import Decimal, InvalidOperation
class SourceAdapter:
source_name = "approved-listings"
parser_version = "2026-08-28.1"
def parse_asking_price(self, document) -> dict:
raw = document.select_one('[data-testid="asking-price"]')
if raw is None:
raise ValueError("Asking-price field not found")
currency = raw.get("data-currency")
amount_text = raw.get("data-amount")
try:
amount = Decimal(amount_text)
except (InvalidOperation, TypeError):
raise ValueError("Invalid asking-price amount")
if amount <= 0 or not currency:
raise ValueError("Incomplete asking-price observation")
return {
"price_type": "ASKING_SALE",
"amount": float(amount),
"currency": currency,
}
Không nên coi ước tính tiếp thị, minh họa lãi suất hàng tháng hoặc "từ" giá là giá chào bán.
from decimal import Decimal
def comparable(left: PriceObservation, right: PriceObservation) -> bool:
return all([
left.canonical_property_id == right.canonical_property_id,
left.price_type == right.price_type,
left.currency == right.currency,
left.market == right.market,
])
def percentage_change(previous: float, current: float) -> float:
if previous <= 0:
raise ValueError("Previous price must be positive")
return float(
(Decimal(str(current)) - Decimal(str(previous)))
/ Decimal(str(previous))
* 100
)
Nếu diện tích thay đổi, một đơn vị được thêm vào, hoặc danh sách được đăng lại dưới danh tính bất động sản khác, yêu cầu xem xét thay vì báo cáo sự di chuyển giá sai.
Một quan sát đơn lẻ có thể bị nhiễu. Sử dụng xác nhận lặp lại hoặc xác minh nguồn.
def confirmed_price_change(
observations: list[PriceObservation],
threshold_percent: float,
) -> dict | None:
if len(observations) < 3:
return None
baseline, first_new, second_new = observations[-3:]
if not comparable(baseline, first_new):
return None
if not comparable(first_new, second_new):
return None
if first_new.amount != second_new.amount:
return None
change = percentage_change(baseline.amount, second_new.amount)
if abs(change) < threshold_percent:
return None
return {
"event": "CONFIRMED_PRICE_CHANGE",
"previous": baseline.amount,
"current": second_new.amount,
"currency": second_new.currency,
"change_percent": round(change, 2),
}
Đối với dữ liệu giao dịch, sử dụng thời gian công bố và chính sách sửa đổi của nguồn thay vì xác minh lặp lại trình duyệt.
| Sự kiện | Ý nghĩa | Địa điểm |
|---|---|---|
PRICE_CHANGE_CONFIRMED |
Quan sát giá có thể so sánh thay đổi | Cảnh báo cho chuyên gia hoặc khách hàng |
STATUS_CHANGED |
Trạng thái hoạt động, chờ, đã bán hoặc bị xóa thay đổi | Quy trình danh sách |
CHALLENGE_ENCOUNTERED |
Nguồn trình bày thử thách được hỗ trợ | Bảng điều khiển tự động hóa |
RECOVERY_FAILED |
Phục hồi không trả về trang mong đợi | Xem xét bởi người vận hành |
PARSER_UNKNOWN |
Trang được trả về nhưng ngữ nghĩa giá không rõ | Hàng đợi chất lượng dữ liệu |
SOURCE_STALE |
Nguồn chính thức hoặc trang chưa được cập nhật | Bộ giám sát sức khỏe nguồn |
Không bao giờ chuyển thử thách, thời gian chờ hoặc lỗi phân tích thành giá bằng không hoặc trạng thái bị xóa.
The FAQ lỗi của CapSolver cung cấp các danh mục chẩn đoán, và blog tự động hóa của CapSolver đề cập đến các mẫu khôi phục liên quan.
Mã thưởng: Sử dụng mã WEBS tại Bảng điều khiển CapSolver để nhận thêm 5% thưởng cho mỗi lần nạp tiền.
| Kiểm soát | Triển khai được khuyến nghị |
|---|---|
| Quyền truy cập nguồn | Hợp đồng hoặc phê duyệt bằng văn bản liên quan đến mục đích |
| Ưu tiên nguồn | Dữ liệu chính thức/đối tác trước khi chuyển sang trang dự phòng |
| Phạm vi mục tiêu | Danh sách cho phép host và đường dẫn |
| Proxy | Hồ sơ máy chủ tĩnh hoặc dính |
| Người dùng trình duyệt | Cùng một danh tính Chrome được hỗ trợ qua quá trình khôi phục |
| Thử lại câu hỏi | Một lần thử, sau đó kiểm tra lại |
| Ngữ nghĩa giá cả | Loại giá cả, tiền tệ, đơn vị và trạng thái rõ ràng |
| Bằng chứng | ID nguồn, thời gian, phiên bản phân tích và băm |
| Cảnh báo | Chỉ thay đổi so sánh đã xác nhận |
| Lưu trữ | Cookie có thời hạn ngắn; quan sát các tài sản được quản lý |
Sử dụng trang sản phẩm của CapSolver để xem danh mục được hỗ trợ và FAQ giải mã CAPTCHA của CapSolver để hướng dẫn luồng công việc.
Chỉ theo dõi dữ liệu bạn được phép truy cập. Tuân thủ hợp đồng danh sách, giấy phép đăng ký, điều khoản nguồn, giới hạn tốc độ, luật bảo mật và yêu cầu nhà ở công bằng. Không thu thập dữ liệu tài khoản riêng tư, thông tin liên hệ chủ, thông tin người thuê, hồ sơ ứng tuyển hoặc báo cáo định giá bị hạn chế mà không có cơ sở pháp lý hợp lệ. Giữ phạm vi khôi phục câu hỏi trong quy trình công khai hoặc đối tác được phê duyệt. Khả năng kỹ thuật không đồng nghĩa với việc được phép.
Việc theo dõi giá bất động sản đáng tin cậy phụ thuộc vào các quan sát so sánh và nguồn gốc rõ ràng. Các chỉ số chính thức và dữ liệu giao dịch cung cấp cơ sở; các nguồn cấp dữ liệu được cấp phép cung cấp chi tiết danh sách hiện tại; các trang được ủy quyền lấp đầy các khoảng trống được xác định. Khi một câu hỏi Cloudflare được hỗ trợ làm gián đoạn quy trình dự phòng, hãy sử dụng CapSolver với proxy tĩnh hoặc dính, danh tính Chrome được hỗ trợ nhất quán, cookie có thời hạn ngắn, một lần khôi phục và xác minh trang rõ ràng.
Bắt đầu quy trình dữ liệu bất động sản được phê duyệt với CapSolver, xác minh nó với nguồn kiểm soát và thêm quy tắc loại giá, bằng chứng và xác nhận trước khi mở rộng cảnh báo.
Không. Đó là một chỉ số thị trường được xây dựng từ các giao dịch lặp lại và được công bố ở nhiều cấp độ địa lý. Sử dụng nó như một tiêu chuẩn tham chiếu, không phải là giá của từng tài sản.
Sử dụng nhiệm vụ được tài liệu hóa AntiCloudflareTask với URL đích chính xác và proxy tĩnh hoặc dính. Một danh tính Chrome được hỗ trợ nhất quán và HTML câu hỏi mới có thể cũng cần thiết.
Chúng nên được lưu trữ dưới dạng loại giá khác nhau. Mọi so sánh phải giải thích rằng một cái là đề xuất của người bán và cái còn lại là giao dịch đã hoàn tất.
Không. Ghi nhận lỗi cơ sở hạ tầng hoặc lỗi phân tích và xác minh trạng thái trang. Việc thiếu lựa chọn không phải là bằng chứng cho thấy tài sản đã bị xóa.
cf_clearance nên được giữ lại bao lâu?Giữ nó chỉ cho phiên yêu cầu được phê duyệt có thời hạn ngắn. Không lưu trữ nó trong phân tích bất động sản, ngữ cảnh mô hình, nhật ký dài hạn hoặc cảnh báo khách hàng.
Phân tích luồng thử thách Cloudflare với AntiCloudflareTask, proxy ổn định và định danh người dùng, HTML mới, xử lý xin phép, xác thực, và lỗi an toàn.

Xây dựng hệ thống giám sát tồn kho thương mại điện tử đáng tin cậy với nguồn cung lấy API làm trọng tâm, khôi phục thách thức Cloudflare, tính nhất quán phiên, bằng chứng tồn kho và cảnh báo an toàn.
