
Anh Tuan
Data Science Expert

Dữ liệu giám sát giá khách sạn chỉ có giá trị đối với đại lý du lịch AI khi mỗi mức giá có thể so sánh, cập nhật và truy xuất nguồn gốc. Một mức giá hàng đêm được hiển thị có thể bỏ qua thuế, phụ thuộc vào số lượng khách, yêu cầu thành viên, hoặc sử dụng chính sách hủy bỏ khác so với ưu đãi bên cạnh nó. Do đó, kiến trúc đúng đắn bắt đầu từ API khách sạn và du lịch chính thức, chuyển đổi mọi ưu đãi thành một lược đồ chung, tính toán tổng chi phí rõ ràng và ghi lại thời điểm thu thập và điều kiện. Thu thập trình duyệt được ủy quyền có thể lấp đầy các khoảng trống được tài liệu hóa, nhưng khả năng khôi phục CAPTCHA nên là ngoại lệ có kiểm soát thay vì phương pháp chính. Hướng dẫn này xây dựng quy trình giám sát thực tế cho thông báo giá, khuyến nghị ngày linh hoạt, phân tích đồng giá và lập kế hoạch hành trình trong khi duy trì sự đồng thuận, điều khoản nguồn và sự phê duyệt của con người cho các đặt phòng.
Một mức giá không được coi là tương đương cho đến khi đại lý biết khách nhận được gì và các ràng buộc áp dụng. Tối thiểu, hãy thu thập:
from dataclasses import dataclass, field
from datetime import datetime, timezone
@dataclass
class HotelOffer:
property_id: str
property_name: str
source: str
check_in: str
check_out: str
adults: int
children: int
room_type: str
meal_plan: str | None
refundable: bool | None
cancellation_deadline: str | None
currency: str
nightly_base: float
taxes: float
fees: float
total_price: float
rate_key: str | None
collected_at: str = field(
default_factory=lambda: datetime.now(timezone.utc).isoformat()
)
Tổng giá phải đại diện cho thời gian lưu trú và số lượng khách được yêu cầu. Nếu thuế hoặc phí bắt buộc chưa biết, hãy đánh dấu ưu đãi là không hoàn chỉnh thay vì xếp nó là lựa chọn rẻ nhất.
Bài viết web-scraping trên trang CapSolver chứa các mô hình thu thập chung, và FAQ web-scraping của CapSolver đề cập các câu hỏi vận hành phổ biến.
API chính thức cung cấp lược đồ rõ ràng, xác thực và điều khoản thương mại. Sabre Get Hotel Rate Info API mô tả việc truy xuất thông tin giá khách sạn từ nhiều nguồn cung cấp. Trả về có thể bao gồm mức giá trung bình hàng đêm, tiền tệ, số tiền trước và sau thuế, phí, chi tiết phòng, kế hoạch bữa ăn, yêu cầu đảm bảo, điều khoản hủy bỏ và khóa giá.
Google's Tài liệu Hotel Prices định nghĩa các nguồn đối tác cho danh sách khách sạn, khả dụng, giá và tồn kho, giao dịch, quy tắc giá, truy vấn và định dạng ngày/giờ. Portal API Amadeus Enterprise hiện tại cung cấp truy cập đến các API liên quan đến khách sạn cho các khách hàng doanh nghiệp được phê duyệt.
| Nguồn dữ liệu | Công dụng tốt nhất | Điểm mạnh | Hạn chế |
|---|---|---|---|
| API khách sạn hoặc chuỗi | Khả dụng và giá trực tiếp từ nhà cung cấp | Quyền sở hữu rõ ràng và tồn kho hiện tại | Giới hạn chỉ một nhà cung cấp |
| GDS hoặc API du lịch | Tìm kiếm giá từ nhiều nhà cung cấp | Ưu đãi có cấu trúc và khóa đặt phòng | Hợp đồng và xác thực cần thiết |
| Feed đối tác | Kho hàng lớn và cập nhật giá | Xử lý hàng loạt hiệu quả | Phê duyệt đối tác và quy tắc feed |
| Trang công khai được ủy quyền | Xác minh hoặc lấp đầy khoảng trống | Phản ánh giao diện người dùng | Thay đổi giao diện và xác minh lưu lượng |
Không coi feed đối tác là điểm cuối công khai tổng quát. Tuân theo thỏa thuận nhà cung cấp, chính sách lưu trữ, quy tắc hiển thị và yêu cầu đặt phòng.
Các nguồn khác nhau trả về các cấu trúc khác nhau. Đặt mọi nguồn phía sau một bộ chuyển đổi nhỏ trả về mô hình HotelOffer giống nhau.
import requests
from decimal import Decimal
class HotelRateAdapter:
def __init__(self, base_url: str, token: str):
self.base_url = base_url.rstrip("/")
self.token = token
def search(
self,
property_id: str,
check_in: str,
check_out: str,
adults: int = 2,
currency: str = "USD",
) -> list[HotelOffer]:
response = requests.post(
f"{self.base_url}/hotel-rates/search",
headers={
"Authorization": f"Bearer {self.token}",
"Accept": "application/json",
},
json={
"propertyId": property_id,
"checkIn": check_in,
"checkOut": check_out,
"adults": adults,
"currency": currency,
},
timeout=30,
)
response.raise_for_status()
return [self._normalize(item) for item in response.json()["offers"]]
def _normalize(self, raw: dict) -> HotelOffer:
base = Decimal(str(raw["price"]["base"]))
taxes = Decimal(str(raw["price"].get("taxes", 0)))
fees = Decimal(str(raw["price"].get("fees", 0)))
return HotelOffer(
property_id=raw["propertyId"],
property_name=raw["propertyName"],
source=raw["source"],
check_in=raw["checkIn"],
check_out=raw["checkOut"],
adults=raw["occupancy"]["adults"],
children=raw["occupancy"].get("children", 0),
room_type=raw["room"]["name"],
meal_plan=raw.get("mealPlan"),
refundable=raw.get("refundable"),
cancellation_deadline=raw.get("cancellationDeadline"),
currency=raw["price"]["currency"],
nightly_base=float(base),
taxes=float(taxes),
fees=float(fees),
total_price=float(base + taxes + fees),
rate_key=raw.get("rateKey"),
)
Điểm cuối và bản đồ trường trên đây đại diện cho ranh giới bộ chuyển đổi; thay thế chúng bằng hợp đồng chính xác của nhà cung cấp được phê duyệt của bạn. Không bao giờ tạo trường nhà cung cấp trong mã sản xuất.
Lỗi so sánh giá thường đến từ điều kiện không khớp thay vì tính toán số học. Nhóm các ưu đãi chỉ khi chúng chia sẻ cùng một thuộc tính, ngày lưu trú, số lượng khách, danh mục phòng và giới hạn giá.
from dataclasses import asdict
def comparison_key(offer: HotelOffer) -> tuple:
return (
offer.property_id,
offer.check_in,
offer.check_out,
offer.adults,
offer.children,
offer.room_type.strip().lower(),
(offer.meal_plan or "unknown").strip().lower(),
offer.refundable,
)
def comparable_snapshot(offers: list[HotelOffer]) -> list[dict]:
return sorted(
[asdict(o) for o in offers],
key=lambda item: (
item["total_price"],
item["source"],
),
)
Chuyển đổi tiền tệ với nguồn có thời gian và giữ nguyên số tiền ban đầu. Không so sánh mức giá bữa sáng hoàn tiền với mức giá phòng không hoàn tiền mà không có điều chỉnh rõ ràng hoặc sở thích người dùng.
Bài viết web-scraping bằng Python của CapSolver hữu ích khi xây dựng bộ chuyển đổi, trong khi từ điển thuật ngữ của CapSolver có thể giúp tiêu chuẩn hóa thuật ngữ giữa các nhóm.
Giá khách sạn thay đổi theo thuộc tính, ngày, áp lực tồn kho và cửa sổ đặt phòng. Sử dụng lịch dựa trên chính sách thay vì quét mỗi thuộc tính với tần suất giống nhau.
from datetime import date
def monitoring_interval_days(check_in: date, today: date) -> int:
days_out = (check_in - today).days
if days_out <= 3:
return 1
if days_out <= 14:
return 2
if days_out <= 60:
return 4
return 7
Một bộ lập lịch sản xuất cũng nên xem xét giới hạn nhà cung cấp, ưu tiên thuộc tính, biến động giá gần đây và cài đặt thông báo người dùng. Làm lệch thời gian bắt đầu công việc để tránh các đợt yêu cầu lớn.
Tránh thông báo về sự khác biệt nhỏ về tiền tệ hoặc làm tròn. So sánh tổng giá toàn bộ và thay đổi chính sách quan trọng.
from decimal import Decimal
def detect_offer_change(previous: HotelOffer, current: HotelOffer) -> dict:
old_total = Decimal(str(previous.total_price))
new_total = Decimal(str(current.total_price))
amount_change = new_total - old_total
pct_change = (
(amount_change / old_total * 100) if old_total else Decimal("0")
)
policy_changed = any([
previous.refundable != current.refundable,
previous.cancellation_deadline != current.cancellation_deadline,
previous.meal_plan != current.meal_plan,
])
return {
"amount_change": float(amount_change),
"percent_change": round(float(pct_change), 2),
"policy_changed": policy_changed,
"alert": abs(pct_change) >= Decimal("5") or policy_changed,
}
Ngưỡng nên phản ánh ứng dụng. Một chương trình du lịch doanh nghiệp có thể quan tâm đến sự thay đổi chính sách nhỏ, trong khi thông báo người tiêu dùng có thể nhấn mạnh giảm giá tổng lớn hơn.
Một số quy trình được phê duyệt cần xác minh mức giá hiển thị công khai hoặc thu thập trường không có sẵn qua API đã ký kết. Chỉ sử dụng trình duyệt dự phòng khi điều khoản trang và thỏa thuận của bạn cho phép.
Tài liệu Agent CapSolver do người dùng cung cấp ám chỉ khôi phục trình duyệt đến detect() và solve_on_page() trong capsolver-core:
import os
from capsolver_core import Capsolver
cap = Capsolver(
api_key=os.environ["CAPSOLVER_API_KEY"],
default_timeout=180,
)
async def recover_rate_check(page) -> dict:
challenge = await cap.detect(page)
if not challenge:
return {"handled": False, "reason": "No supported challenge detected"}
result = await cap.solve_on_page(page)
return {"handled": True, "result": result}
Giữ cùng ngữ cảnh trình duyệt được ủy quyền, duy trì tốc độ yêu cầu hợp lý và dừng sau một lần khôi phục có giới hạn. FAQ giải mã CAPTCHA của CapSolver giải thích chu kỳ công việc chung, và FAQ khắc phục sự cố của CapSolver đề cập các điều kiện lỗi phổ biến.
Mã bổ sung: Sử dụng mã WEBS tại Bảng điều khiển CapSolver để nhận thêm 5% tiền thưởng cho mỗi lần nạp tiền.
Đại lý du lịch AI nên nhận được bản ghi ngắn gọn, có bằng chứng thay vì dữ liệu thô từ nhà cung cấp.
def build_agent_snapshot(offers: list[HotelOffer]) -> dict:
complete = [
offer for offer in offers
if offer.total_price > 0 and offer.currency and offer.room_type
]
complete.sort(key=lambda offer: offer.total_price)
return {
"query": {
"property_id": complete[0].property_id if complete else None,
"check_in": complete[0].check_in if complete else None,
"check_out": complete[0].check_out if complete else None,
},
"best_flexible_offer": asdict(complete[0]) if complete else None,
"alternatives": [asdict(o) for o in complete[1:6]],
"warnings": [
"Giá có thể thay đổi trước khi đặt phòng.",
"Xác minh tổng giá, khả dụng và điều khoản hủy bỏ tại thanh toán.",
],
}
Khuyến khích đại lý giải thích sự đánh đổi giữa giá và tính linh hoạt. Nó không nên tuyên bố rằng một phòng đã được đặt hoặc mức giá được đảm bảo trừ khi endpoint đặt phòng hoặc kiểm tra giá của nhà cung cấp đã xác nhận.
Giám sát là chỉ đọc. Đặt phòng thay đổi tồn kho, tạo nghĩa vụ tài chính và thường yêu cầu dữ liệu cá nhân. Giữ các khả năng này trong các dịch vụ riêng biệt và yêu cầu xác nhận rõ ràng trước khi gọi bất kỳ endpoint đặt phòng nào.
| Giai đoạn | Mức độ tự động hóa | Kiểm soát cần thiết |
|---|---|---|
| Thu thập mức giá | Tự động | Nguồn được phê duyệt và giới hạn tốc độ |
| Chuẩn hóa | Tự động | Xác minh lược đồ và nguồn gốc |
| Tạo thông báo | Tự động | Ngưỡng do người dùng định nghĩa |
| Khuyến nghị | Hỗ trợ | Tiêu chí so sánh minh bạch |
| Kiểm tra lại giá | Tự động trước khi mua | Xác nhận từ nhà cung cấp mới |
| Đặt phòng và thanh toán | Xác nhận bởi con người | Xác thực và sự đồng ý rõ ràng |
Biên giới này ngăn đại lý AI biến quan sát giám sát lỗi thời thành mua hàng không mong muốn.
Theo dõi mức độ tin cậy khớp thuộc tính, độ trễ nguồn, thuế thiếu, thời gian chuyển đổi tiền tệ, khóa giá trùng lặp, phiên bản bộ phân tích và lỗi thu thập. Giữ lại phản hồi nhà cung cấp gốc hoặc băm toàn vẹn khi cho phép cấp phép. Khi một thuộc tính không thể khớp chắc chắn giữa các nguồn, định tuyến đến xem xét thay vì gộp các bản ghi chỉ bằng tên.
Các chỉ số hữu ích bao gồm quan sát thành công trên mỗi nguồn, tỷ lệ mức giá không hoàn chỉnh, độ trễ thu thập trung vị, tỷ lệ thay đổi giá quan trọng, tỷ lệ phát hiện thử thách và khối lượng xem xét của con người. Những chỉ số này phát hiện vấn đề chất lượng dữ liệu trước khi ảnh hưởng đến khuyến nghị.
Sử dụng giám sát giá khách sạn chỉ với API, feed, trang web và tài khoản được ủy quyền. Tuân theo hợp đồng đối tác, điều khoản trang web, giới hạn bộ nhớ, quy định giá tiêu dùng khu vực và yêu cầu bảo mật. Không thu thập dữ liệu đặt phòng riêng tư hoặc thông tin tài khoản thành viên mà không có sự đồng ý rõ ràng. Giảm lưu lượng trình duyệt và ưu tiên giao diện cấu trúc chính thức khi có sẵn.
Dữ liệu giám sát giá khách sạn đáng tin cậy yêu cầu hơn việc thu thập một con số từ trang. Đại lý du lịch AI cần điều kiện lưu trú được chuẩn hóa, tổng giá toàn bộ, chi tiết chính sách, thời gian thu thập và nguồn gốc. API khách sạn và GDS chính thức nên là nền tảng; kiểm tra trình duyệt được ủy quyền có thể cung cấp bù đắp hạn chế, với CapSolver hoạt động như lớp khôi phục có kiểm soát khi thử thách được hỗ trợ làm gián đoạn phiên.
Xây dựng luồng công việc đầu tiên đã được phê duyệt với CapSolver, sau đó thêm các bộ chuyển đổi đặc thù của nhà cung cấp, ngưỡng thay đổi giá, và kiểm tra lại bắt buộc trước bất kỳ hành động đặt chỗ nào.
Tối thiểu, lưu trữ ID bất động sản, ngày lưu trú, số lượng người, loại phòng, chương trình ăn uống, khả năng hoàn tiền, thời hạn hủy, tiền tệ, thuế, phí, tổng giá, nguồn, và thời điểm thu thập dữ liệu.
Ưu tiên sử dụng API chính thức và dữ liệu từ đối tác. Việc thu thập qua trình duyệt chỉ nên giới hạn ở các trang công khai được phép hoặc các nhiệm vụ kiểm tra chất lượng và xác minh được phê duyệt khi truy cập có cấu trúc không thể cung cấp trường yêu cầu.
Sử dụng chính sách dựa trên khoảng thời gian đặt chỗ, mức độ biến động giá, giới hạn của nhà cung cấp và mức độ khẩn cấp của thông báo. Kiểm tra các chuyến lưu trú gần đây thường xuyên hơn và các chuyến lưu trú xa ít thường xuyên hơn.
Không. Kiểm tra lại giá và khả năng có sẵn thông qua nhà cung cấp ngay trước khi đặt chỗ, và yêu cầu xác nhận rõ ràng từ người dùng trước khi tạo đặt chỗ hoặc nghĩa vụ thanh toán.
CapSolver là lớp khôi phục được kiểm soát cho các thách thức được hỗ trợ trong phiên trình duyệt được ủy quyền. Nó không thay thế quyền truy cập nhà cung cấp, giới hạn tốc độ, API hoặc xác nhận đặt chỗ.
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Tự động hóa việc giải CAPTCHA với Nanobot và CapSolver. Sử dụng Playwright để giải reCAPTCHA và Cloudflare tự động.
