
Adélia Cruz
Neural Network Developer

Os dados de monitoramento de preços de hotéis são valiosos para um agente de viagem de IA apenas quando cada taxa é comparável, atual e rastreável até sua fonte. Um preço noturno exibido pode omitir impostos, depender da ocupação, exigir associação ou usar uma política de cancelamento diferente da oferta ao lado. Portanto, a arquitetura correta começa com APIs oficiais de hotéis e viagens, converte cada oferta em um esquema comum, calcula um total de estadia transparente e registra a data e hora da coleta e as condições. A coleta de navegador autorizada pode preencher lacunas documentadas, mas a recuperação de CAPTCHA deve permanecer uma exceção controlada, em vez de método principal de aquisição. Este guia constrói um pipeline prático para alertas de taxa, recomendações de datas flexíveis, análise de paridade e planejamento de itinerários, preservando consentimento, termos da fonte e aprovação humana para reservas.
Uma taxa não é comparável até que o agente saiba o que o hóspede recebe e quais restrições se aplicam. Pelo menos, capture:
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()
)
O preço total deve representar a estadia e a ocupação solicitadas. Se impostos ou taxas obrigatórias forem desconhecidos, marque a oferta como incompleta, em vez de a classificar como a opção mais barata.
O blog de web scraping do CapSolver contém padrões gerais de coleta, e a FAQ de web scraping do CapSolver aborda perguntas operacionais comuns.
As APIs oficiais fornecem esquemas explícitos, autenticação e termos comerciais. A Sabre Get Hotel Rate Info API descreve a recuperação de taxas de propriedades em tempo real de várias fontes de fornecimento. Sua resposta pode incluir taxas médias noturnas, moeda, valores pré e pós-impostos, taxas, detalhes do quarto, planos de refeições, requisitos de garantia, condições de cancelamento e uma chave de taxa.
A documentação do Hotel Prices do Google define recursos de parceiros para listas de hotéis, disponibilidade, taxas e estoque, transações, regras de taxa, consultas e formatos de data/hora. O atual portal da API Amadeus Enterprise fornece acesso a APIs relacionadas a hotéis para clientes corporativos aprovados.
| Fonte de dados | Melhor uso | Vantagem | Restrição |
|---|---|---|---|
| API de hotel ou cadeia | Disponibilidade e taxas diretas de primeira parte | Propriedade clara e estoque atual | Limitado a um fornecedor |
| GDS ou API de viagem | Pesquisa de taxa de múltiplos fornecedores | Ofertas estruturadas e chaves de reserva | Contrato e autenticação necessários |
| Feed de parceiro | Grande estoque e atualizações de preço | Processamento em lote eficiente | Aprovação do parceiro e regras de feed |
| Página pública autorizada | Validação ou cobertura de lacunas | Reflete a exibição para o hóspede | Alterações de layout e validação de tráfego |
Não trate um feed de parceiro como um ponto de extremidade público geral. Siga o acordo do provedor, política de cache, regras de exibição e requisitos de reserva.
Fontes diferentes retornam estruturas diferentes. Coloque cada fonte atrás de um pequeno adaptador que retorne o mesmo modelo HotelOffer.
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"),
)
O ponto de extremidade e o mapeamento de campos acima representam uma fronteira de adaptador; substitua-os pelo contrato exato do seu provedor aprovado. Nunca invente campos de provedor no código de produção.
Erros de comparação de preços geralmente vêm de condições desalinhadas, em vez de aritmética. Agrupe ofertas apenas quando compartilham a mesma propriedade, datas da estadia, ocupação, categoria de quarto e restrições de taxa.
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"],
),
)
Converta moedas com uma fonte com data e preservar o valor original. Não compare uma taxa com café da manhã reembolsável com uma taxa de quarto não reembolsável sem uma ajuste explícito ou preferência do usuário.
O guia de web scraping em Python do CapSolver é útil ao construir adaptadores, enquanto o glossário do CapSolver pode ajudar a padronizar terminologia entre equipes.
As taxas de hotéis mudam por propriedade, data, pressão de estoque e janela de reserva. Use um cronograma baseado em políticas em vez de varrer todas as propriedades com a mesma frequência.
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
Um scheduler de produção também deve considerar limites do provedor, prioridade da propriedade, volatilidade recente de preços e configurações de alerta do usuário. Jitter os horários de início dos trabalhos para evitar picos de solicitações.
Evite alertar sobre diferenças pequenas em moeda ou arredondamento. Compare o total total e mudanças materiais nas políticas.
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,
}
O limiar deve refletir a aplicação. Um programa corporativo de viagens pode se importar com uma pequena mudança na política, enquanto um alerta de consumidor pode enfatizar uma redução maior no preço total.
Alguns fluxos aprovados precisam verificar uma taxa exibida pública ou coletar um campo indisponível por meio da API contratada. Use a coleta de navegador apenas quando os termos do site e seu acordo permitirem.
A documentação do Agente CapSolver fornecida pelo usuário mapeia a recuperação de navegador para detect() e solve_on_page() em 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": "Nenhum desafio suportado detectado"}
result = await cap.solve_on_page(page)
return {"handled": True, "result": result}
Mantenha o mesmo contexto de navegador autorizado, retenha uma taxa de solicitação conservadora e pare após uma tentativa de recuperação limitada. A FAQ de resolução de CAPTCHA do CapSolver explica o ciclo de tarefas geral, e a FAQ de solução de problemas do CapSolver aborda condições de falha comuns.
Código Bônus: Use o código WEBS no Painel do CapSolver para obter um bônus adicional de 5% em cada recarga.
O agente de viagem de IA deve receber um snapshot conciso e com base em evidências, em vez de payloads brutos de provedores.
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": [
"As taxas podem mudar antes da reserva.",
"Verifique o total, disponibilidade e termos de cancelamento no checkout.",
],
}
Incentive o agente a explicar o trade-off entre preço e flexibilidade. Ele não deve afirmar que um quarto está reservado ou que uma taxa está garantida, a menos que o endpoint de reserva ou verificação de preço do provedor tenha confirmado.
O monitoramento é somente leitura. A reserva muda o estoque, cria uma obrigação financeira e geralmente exige dados pessoais. Mantenha essas capacidades em serviços separados e exija confirmação explícita antes de chamar qualquer endpoint de reserva.
| Fase | Nível de automação | Controle necessário |
|---|---|---|
| Coleta de taxa | Automatizado | Fontes aprovadas e limites de taxa |
| Normalização | Automatizado | Validação de esquema e origem |
| Geração de alerta | Automatizado | Limites definidos pelo usuário |
| Recomendação | Assisted | Critérios de comparação transparentes |
| Recheck de preço | Automatizado antes da compra | Confirmação do provedor atualizada |
| Reserva e pagamento | Confirmado por humano | Autenticação e consentimento explícito |
Essa fronteira evita que um agente de IA transforme uma observação de monitoramento desatualizada em uma compra não intencional.
Rastreie a confiança na correspondência de propriedades, latência da fonte, impostos ausentes, tempo de conversão de moeda, chaves de taxa duplicadas, versão do parser e erros de coleta. Mantenha a resposta bruta do provedor ou um hash de integridade quando permitido pela licença. Quando uma propriedade não puder ser correspondida com confiança entre fontes, direcione-a para revisão, em vez de mesclar registros apenas pelo nome.
Métricas úteis incluem observações bem-sucedidas por fonte, taxa de preço incompleto, latência média de coleta, taxa de mudança de preço substancial, taxa de encontro de desafio e volume de revisão humana. Essas métricas revelam problemas de qualidade de dados antes que afetem as recomendações.
Use o monitoramento de preços de hotéis apenas com APIs, feeds, sites e contas autorizadas. Siga contratos de parceiros, termos do site, limites de cache, regras de preços regionais e requisitos de privacidade. Não colete dados privados de reservas ou informações de contas de fidelidade sem consentimento explícito. Minimize o tráfego de navegador e prefira interfaces estruturadas oficiais sempre que disponíveis.
Dados de monitoramento de preços de hotéis confiáveis exigem mais do que coletar um número de uma página. Um agente de viagem de IA precisa de condições de estadia normalizadas, totais completos, detalhes da política, marcas de tempo e origem da fonte. APIs oficiais de hotéis e GDS devem ser a base; a verificação de navegador autorizada pode fornecer cobertura limitada para lacunas, com o CapSolver atuando como uma camada de recuperação controlada quando um desafio suportado interromper a sessão.
Construa o primeiro fluxo aprovado com CapSolver, em seguida adicione adaptadores específicos do provedor, limites de mudança de preço e uma revisão obrigatória antes de qualquer ação de reserva.
No mínimo, armazene o ID da propriedade, datas da estadia, ocupação, tipo de quarto, plano de refeições, reembolsabilidade, data limite de cancelamento, moeda, taxas, tarifas, preço total, fonte e marca de tempo da coleta.
Use APIs oficiais e feeds de parceiros primeiro. A coleta por navegador deve ser limitada a páginas públicas permitidas ou tarefas de QA e validação aprovadas quando o acesso estruturado não puder fornecer um campo necessário.
Use uma política baseada na janela de reserva, volatilidade dos preços, limites do provedor e urgência dos alertas. Verifique estadias próximas com mais frequência e estadias distantes com menos frequência.
Não. Verifique novamente o preço e a disponibilidade pelo provedor imediatamente antes da reserva e exija confirmação explícita do usuário antes de criar uma reserva ou obrigação de pagamento.
O CapSolver é uma camada de recuperação controlada para desafios suportados em sessões de navegador autorizadas. Ele não substitui os direitos de acesso do provedor, limites de taxa, APIs ou confirmação de reserva.
Aprenda arquitetura de raspagem web escalável em Rust com reqwest, scraper, raspagem assíncrona, raspagem de navegador headless, rotação de proxies e tratamento de CAPTCHA compatível.

Compare o Selenium vs Puppeteer para resolver CAPTCHA. Descubra benchmarks de desempenho, notas de estabilidade e como integrar o CapSolver para o máximo de sucesso.
