Nền tảng so sánh bảo hiểm và trang báo giá của nhà cung cấp dịch vụ bảo vệ công cụ tính giá của họ bằng CAPTCHA để ngăn chặn việc thu thập báo giá tự động. CaptchaAI giải quyết những thách thức này cho các nhóm QA đang thử nghiệm quy trình làm việc bảo hiểm và các công cụ tổng hợp so sánh.
CAPTCHA trên các trang web bảo hiểm
| Loại nhà cung cấp dịch vụ | CAPTCHA | Điểm kích hoạt | Trích dẫn phức tạp |
|---|---|---|---|
| Bảo hiểm ô tô | reCAPTCHA v2 | Gửi mẫu báo giá | Nhiều bước (xe + tài xế) |
| Bảo hiểm y tế | reCAPTCHA v2 | So sánh kế hoạch | Nhiều bước (nhân khẩu học) |
| Bảo hiểm nhà | CAPTCHA hình ảnh | Tra cứu địa chỉ | Trung bình |
| Bảo hiểm nhân thọ | reCAPTCHA v2 | Máy tính tỷ lệ | Hình thức đơn giản |
| Bảo hiểm du lịch | reCAPTCHA v2 Vô hình | Yêu cầu báo giá | Hình thức đơn giản |
| Bảo hiểm kinh doanh | reCAPTCHA v3 | Liên hệ với mẫu/quote | dạng dài |
Bộ sưu tập báo giá đa nhà cung cấp dịch vụ
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']}")
So sánh chương trình bảo hiểm y tế
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 []
Yêu cầu phiên
Báo giá bảo hiểm luôn gồm nhiều bước - các phiên cố định là bắt buộc:
| Bước | Dữ liệu đã gửi | Yêu cầu IP |
|---|---|---|
| 1. Thông tin cá nhân | Tên, ngày sinh, mã zip | Cùng IP |
| 2. Xe/property | Năm, nhãn hiệu, mẫu mã | Cùng IP |
| 3. Lựa chọn phạm vi bảo hiểm | Giới hạn, được khấu trừ | Cùng IP |
| 4. Giải CAPTCHA | Mã thông báo | Cùng IP |
| 5. Hiển thị báo giá | N/A | Cùng IP |
Sử dụng các phiên phiên cố định nội bộ với TTL 10-15 phút cho các luồng bảo hiểm.
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Biểu mẫu báo giá đặt lại giữa dòng | IP đã thay đổi giữa các bước | Sử dụng phiên phiên cố định nội bộ |
| "Không thể cung cấp báo giá" | Xác thực dữ liệu không thành công | Kiểm tra các trường bắt buộc |
| CAPTCHA xuất hiện hai lần | Mã thông báo đầu tiên đã hết hạn | Giải quyết lại ngay |
| Tỷ lệ khác với thủ công | Sự khác biệt của Cookie/session | Bắt đầu phiên sạch |
| Yêu cầu chặn giới hạn tốc độ | Quá nhiều trích dẫn từ IP | Chậm lại, luân chuyển IP giữa các nhà mạng |
Câu hỏi thường gặp
Tôi có thể thu thập bao nhiêu báo giá mỗi ngày?
Thông thường là 20-50 mỗi nhà cung cấp dịch vụ mỗi ngày với độ trễ thích hợp. Vượt quá giới hạn này sẽ kích hoạt giới hạn tốc độ và CAPTCHA mạnh mẽ hơn.
Tại sao tôi cần các phiên cố định cho bảo hiểm?
Quy trình báo giá bảo hiểm gồm nhiều bước. Máy chủ liên kết từng bước với phiên và IP của bạn. Thay đổi IP giữa luồng sẽ làm mất hiệu lực phiên.
Tôi có thể tự động hóa trên nhiều ngành bảo hiểm không?
Vâng. Cách tiếp cận xử lý CAPTCHA tương tự cũng áp dụng cho bảo hiểm ô tô, sức khỏe, nhà ở và nhân thọ - chỉ có các trường biểu mẫu là khác nhau.
Hướng dẫn liên quan
- Phiên cố định và phiên luân phiên
- Tính kiên trì của phiên trình duyệt
- Phương thức xác thực proxy
So sánh báo giá bảo hiểm trên quy mô lớn —lấy khóa CaptchaAI của bạnvà tự động hóa quá trình trích dẫn.