保险比较平台和承运人报价页面使用验证码保护其费率引擎,以防止自动获取报价。 CaptchaAI 为测试保险工作流程和比较聚合器的 QA 团队应对这些挑战。
保险网站上的验证码
| 载体类型 | 验证码 | 触发点 | 报价复杂性 |
|---|---|---|---|
| 汽车保险 | reCAPTCHA v2 | 报价单提交 | 多步骤(车辆+司机) |
| 健康保险 | reCAPTCHA v2 | 方案比较 | 多步骤(人口统计) |
| 家庭保险 | 图片验证码 | 地址查询 | 缓和 |
| 人寿保险 | reCAPTCHA v2 | 费率计算器 | 简单的形式 |
| 旅游保险 | reCAPTCHA v2 隐形 | 报价请求 | 简单的形式 |
| 商业保险 | reCAPTCHA v3 | 联系/quote表格 | 长格式 |
多运营商报价收集器
import requests
import time
import re
import base64
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def solve_recaptcha(sitekey, pageurl):
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": pageurl, "json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = result.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Timeout")
def solve_image_captcha(image_bytes):
img_b64 = base64.b64encode(image_bytes).decode()
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY, "method": "base64",
"body": img_b64, "json": 1,
})
task_id = resp.json()["request"]
for _ in range(20):
time.sleep(3)
result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = result.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Timeout")
class InsuranceQuoteCollector:
def __init__(self, proxy=None):
self.session = requests.Session()
if proxy:
self.session.proxies = {"http": proxy, "https": proxy}
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})
def get_auto_quote(self, carrier_url, vehicle_data, driver_data, sitekey):
"""Get auto insurance quote from a single carrier."""
# Step 1: Load quote page
self.session.get(carrier_url)
# Step 2: Submit vehicle info
resp = self.session.post(f"{carrier_url}/vehicle", data=vehicle_data)
# Step 3: Submit driver info
resp = self.session.post(f"{carrier_url}/driver", data=driver_data)
# Step 4: Solve CAPTCHA on quote page
token = solve_recaptcha(sitekey, f"{carrier_url}/quote")
# Step 5: Get quote
resp = self.session.post(f"{carrier_url}/quote", data={
"g-recaptcha-response": token,
})
if resp.status_code == 200:
return self._parse_quote(resp.text)
return None
def compare_carriers(self, carriers, vehicle_data, driver_data):
"""Compare quotes across multiple carriers."""
quotes = []
for carrier in carriers:
try:
quote = self.get_auto_quote(
carrier_url=carrier["url"],
vehicle_data=vehicle_data,
driver_data=driver_data,
sitekey=carrier["sitekey"],
)
quotes.append({
"carrier": carrier["name"],
"status": "success",
"quote": quote,
})
except Exception as e:
quotes.append({
"carrier": carrier["name"],
"status": "failed",
"error": str(e),
})
time.sleep(5) # Delay between carriers
# Sort by price
successful = [q for q in quotes if q["status"] == "success" and q["quote"]]
successful.sort(key=lambda x: x["quote"].get("monthly_premium", float("inf")))
return {
"quotes": quotes,
"best_rate": successful[0] if successful else None,
"total_compared": len(carriers),
"successful": len(successful),
}
def _parse_quote(self, html):
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
premium_el = soup.select_one(".premium, .monthly-rate, .quote-amount")
coverage_el = soup.select_one(".coverage-summary, .plan-details")
return {
"monthly_premium": premium_el.get_text(strip=True) if premium_el else "",
"coverage": coverage_el.get_text(strip=True) if coverage_el else "",
}
# Usage
collector = InsuranceQuoteCollector(
proxy="http://user-session-abc:pass@residential.proxy.com:5000"
)
vehicle = {
"year": "2022",
"make": "Toyota",
"model": "Camry",
"vin": "",
"mileage": "15000",
}
driver = {
"age": "35",
"gender": "M",
"zip": "90210",
"driving_record": "clean",
}
carriers = [
{"name": "Carrier A", "url": "https://carrier-a.example.com/auto", "sitekey": "6Lc_xxx1"},
{"name": "Carrier B", "url": "https://carrier-b.example.com/auto", "sitekey": "6Lc_xxx2"},
{"name": "Carrier C", "url": "https://carrier-c.example.com/auto", "sitekey": "6Lc_xxx3"},
]
comparison = collector.compare_carriers(carriers, vehicle, driver)
print(f"Best rate: {comparison['best_rate']}")
健康保险计划比较
def compare_health_plans(marketplace_url, demographics, sitekey):
"""Compare health insurance plans on marketplace sites."""
collector = InsuranceQuoteCollector(
proxy="http://user-session-xyz:pass@residential.proxy.com:5000"
)
# Load marketplace
collector.session.get(marketplace_url)
# Submit demographics
collector.session.post(f"{marketplace_url}/demographics", data=demographics)
# Solve CAPTCHA for plan results
token = solve_recaptcha(sitekey, f"{marketplace_url}/plans")
resp = collector.session.post(f"{marketplace_url}/plans", data={
"g-recaptcha-response": token,
})
if resp.status_code == 200:
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.text, "html.parser")
plans = []
for card in soup.select(".plan-card, .insurance-plan"):
plans.append({
"name": card.select_one(".plan-name").get_text(strip=True) if card.select_one(".plan-name") else "",
"premium": card.select_one(".premium").get_text(strip=True) if card.select_one(".premium") else "",
"deductible": card.select_one(".deductible").get_text(strip=True) if card.select_one(".deductible") else "",
})
return plans
return []
会议要求
保险报价始终是多步骤的——粘性会话是强制性的:
| 步 | 已提交数据 | 知识产权要求 |
|---|---|---|
| 1. 个人信息 | 姓名、出生日期、邮政编码 | 相同IP |
| 2.车辆/property | 年份、品牌、型号 | 相同IP |
| 3. 覆盖范围选择 | 限额、免赔额 | 相同IP |
| 4.验证码解决 | 代币 | 相同IP |
| 5. 报价显示 | N/A | 相同IP |
使用 TTL 为 10-15 分钟的持久 QA 会话会话来实现保险流。
故障排除
| 问题 | 原因 | 处理方式 |
|---|---|---|
| 报价表单在流程中重置 | 步骤之间 IP 发生变化 | 使用持久 QA 会话会话 |
| “无法提供报价” | 数据验证失败 | 检查必填字段 |
| 验证码出现两次 | 第一个令牌已过期 | 立即再次解决 |
| 费率与手动不同 | Cookie/session 差异 | 开始清理会话 |
| 速率限制器阻止请求 | IP 引用过多 | 放慢速度,在运营商之间轮换 IP |
常问问题
我每天可以收集多少报价?
通常每个承运商每天 20-50 个,并有适当的延迟。超过此限制会更积极地触发速率限制器和验证码。
为什么我需要粘性会话来获得保险?
保险报价工作流程是多步骤的。服务器将每个步骤链接到您的会话和 IP。中途更改 IP 会使会话失效。
我可以跨多个保险垂直领域实现自动化吗?
是的。相同的验证码处理方法适用于汽车、健康、家庭和人寿保险 - 只是表单字段不同。
相关指南
- 粘性会话与轮换会话
- 浏览器会话持久性
- 代理认证方法
大规模比较保险报价 -获取您的 CaptchaAI 密钥并自动化报价过程。