
Ethan Collins
Pattern Recognition Specialist

AI旅游代理需要实时访问航班可用性、酒店库存和预订平台数据,以提供准确的推荐并自动化预订。旅游网站部署了激进的CAPTCHA保护——reCAPTCHA、Cloudflare Turnstile和自定义挑战——在仅几十次请求后就会阻止自动化数据收集。本指南展示了如何使用CapSolver构建旅行可用性数据管道,以保持对航空公司、酒店和OTA平台的持续访问。
在线旅行社(OTAs)、航空公司网站和酒店预订平台是互联网上保护最严密的网站之一。这些平台在机器人检测上投入了大量资源,因为定价数据具有商业价值,且在预订高峰期服务器资源成本高昂。
当AI旅游代理尝试跨多条航线检查航班可用性、比较不同日期的酒店价格或监控票价变化时,会生成触发验证挑战的请求模式。 Cloudflare的机器人管理报告称,旅行网站的机器人流量是普通网站的3-5倍,导致更严格的保护阈值。
旅行平台上常见的CAPTCHA部署包括搜索结果页上的reCAPTCHA v2、现代OTA前端上的Cloudflare Turnstile、主要航空公司预订引擎上的DataDome,以及酒店聚合器上的自定义JavaScript挑战。没有自动解决,AI旅游代理无法维持实时推荐所需的持续数据访问。
# CapSolver核心引擎
pip install git+https://github.com/capsolver-ai/capsolver-core.git
# 数据收集依赖
pip install aiohttp beautifulsoup4 pandas schedule
export CAPSOLVER_API_KEY="你的CapSolver API密钥"
其他要求:
映射你的代理需要访问的每个旅行平台的CAPTCHA保护:
TRAVEL_PLATFORMS = {
"booking_com": {
"name": "Booking.com",
"captcha_type": "AntiTurnstileTaskProxyLess",
"trigger": "after_20_searches_per_session",
"data_available": ["hotels", "apartments", "pricing", "availability"]
},
"skyscanner": {
"name": "Skyscanner",
"captcha_type": "ReCaptchaV2TaskProxyLess",
"trigger": "rate_limit_50_per_hour",
"data_available": ["flights", "prices", "routes", "airlines"]
},
"expedia": {
"name": "Expedia",
"captcha_type": "ReCaptchaV3TaskProxyLess",
"trigger": "behavioral_score_based",
"data_available": ["flights", "hotels", "packages", "car_rental"]
},
"airbnb": {
"name": "Airbnb",
"captcha_type": "AntiTurnstileTaskProxyLess",
"trigger": "after_search_and_listing_views",
"data_available": ["listings", "pricing", "availability", "reviews"]
}
}
在开发过程中使用CapSolver浏览器扩展来识别每个平台的站点密钥和CAPTCHA参数。
创建一个集成CAPTCHA解决的异步收集引擎:
import asyncio
import aiohttp
import time
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class TravelDataCollector:
"""收集旅行可用性数据并处理CAPTCHA。"""
def __init__(self, api_key: str, proxies: list):
self.cap = create_capsolver(api_key=api_key)
self.proxies = proxies
self.proxy_idx = 0
self.stats = {"queries": 0, "captchas_solved": 0}
async def search_flights(self, origin: str, destination: str, date: str) -> dict:
"""搜索航班可用性并处理CAPTCHA。"""
proxy = self.proxies[self.proxy_idx % len(self.proxies)]
self.proxy_idx += 1
# 尝试搜索
result = await self._make_search_request(
platform="skyscanner",
params={"origin": origin, "dest": destination, "date": date},
proxy=proxy
)
# 处理触发的CAPTCHA
if self._is_captcha_response(result):
token = await self._solve_captcha("skyscanner")
result = await self._retry_with_token(token, proxy)
self.stats["captchas_solved"] += 1
self.stats["queries"] += 1
return self._parse_flight_results(result)
async def search_hotels(self, location: str, checkin: str, checkout: str) -> dict:
"""搜索酒店可用性并处理CAPTCHA。"""
proxy = self.proxies[self.proxy_idx % len(self.proxies)]
self.proxy_idx += 1
result = await self._make_search_request(
platform="booking_com",
params={"location": location, "checkin": checkin, "checkout": checkout},
proxy=proxy
)
if self._is_captcha_response(result):
token = await self._solve_captcha("booking_com")
result = await self._retry_with_token(token, proxy)
self.stats["captchas_solved"] += 1
self.stats["queries"] += 1
return self._parse_hotel_results(result)
async def _solve_captcha(self, platform_key: str) -> str:
"""为特定旅行平台解决CAPTCHA。"""
platform = TRAVEL_PLATFORMS[platform_key]
type_map = {
"ReCaptchaV2TaskProxyLess": CaptchaType.RECAPTCHA_V2,
"ReCaptchaV3TaskProxyLess": CaptchaType.RECAPTCHA_V3,
"AntiTurnstileTaskProxyLess": CaptchaType.CLOUDFLARE
}
info = CaptchaInfo(
type=type_map[platform["captcha_type"]],
website_url=f"https://www.{platform_key.replace('_', '')}.com",
website_key=platform.get("site_key", "")
)
solution = await self.cap.solve(info)
return solution.token
async def close(self):
await self.cap.aclose()
CapSolver API文档涵盖了优化高频监控场景的解决时间。
class TravelPriceMonitor:
"""监控旅行价格并在价格变化时发出警报。"""
def __init__(self, collector: TravelDataCollector):
self.collector = collector
self.price_history = {}
async def monitor_route(self, origin: str, dest: str, dates: list) -> list:
"""监控多天的航班路线。"""
alerts = []
for date in dates:
current = await self.collector.search_flights(origin, dest, date)
route_key = f"{origin}-{dest}-{date}"
if route_key in self.price_history:
prev_price = self.price_history[route_key]
curr_price = current.get("lowest_price", 0)
if curr_price < prev_price * 0.9: # 10%以上的价格下降
alerts.append({
"type": "PRICE_DROP",
"route": f"{origin} → {dest}",
"date": date,
"old_price": prev_price,
"new_price": curr_price,
"savings": f"{(1 - curr_price/prev_price)*100:.0f}%"
})
self.price_history[route_key] = current.get("lowest_price", 0)
await asyncio.sleep(5) # 限速
return alerts
| 监控范围 | 每日查询量 | 每月CAPTCHA(估计) | 每月成本 |
|---|---|---|---|
| 10条路线,每天2次 | ~60 | ~180 | $0.36-0.54 |
| 50条路线,每天2次 | ~300 | ~900 | $1.80-2.70 |
| 200条路线,每天4次 | ~2,400 | ~7,200 | $14-22 |
| 500家酒店,每天 | ~1,500 | ~4,500 | $9-14 |
优化策略:
领取你的优惠码:在CapSolver仪表板使用代码WEBS,每次充值可获得额外5%的奖励。非常适合监控多个平台价格的旅行AI代理。
旅行数据收集应遵循负责任的做法:
robots.txt指令和速率限制CapSolver关于负责任使用的常见问题提供了更多指导。关于处理Cloudflare保护的旅行网站,Turnstile解决文档涵盖了具体的实现模式。CapSolver网络爬虫指南提供了高容量收集的其他基础设施模式。
为AI代理构建旅行可用性数据管道需要分析平台的CAPTCHA系统,使用CapSolver实现异步解决,并设置带有价格警报的定时监控。住宅代理、会话持久性和自动化CAPTCHA解决的结合,使在可管理成本下跨航空公司、酒店和OTA平台的可靠数据收集成为可能。
此方法适用于使用标准CAPTCHA系统的平台:Booking.com、Skyscanner、Expedia、Kayak、Google Flights、Airbnb和大多数OTA。每个平台需要特定的CAPTCHA参数识别,但所有平台的解决机制是一致的。
对于航班监控,每天2-4次检查可以捕捉大部分价格变化。在旺季监控酒店可用性时,可能需要每小时检查一次。平衡检查频率与CAPTCHA解决成本和平台速率限制。
每天检查50条路线两次,大约30%的CAPTCHA遇到率,每月CAPTCHA解决费用约为1.80-2.70美元。加上住宅代理池的每月20-50美元费用。综合路线监控的总基础设施成本低于55美元/月。
数据收集管道提供定价和可用性信息。实际预订需要额外的表单提交和支付处理步骤。CapSolver也可以在预订流程中处理CAPTCHA,但请确保在每个平台上拥有自动化预订的适当授权。
实施基于时间戳的快照,并在短时间内收集所有路线数据(少于30分钟)。这确保价格比较基于近似同时的数据点。标记在收集开始和结束之间发生变化的价格以进行重新验证。