You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求Parivahan网站车辆信息时遭遇Captcha错误的技术求助

解决Parivahan车牌查询的验证码问题

看起来你遇到的核心问题是网站要求验证码验证,但你的请求没有提供正确的验证码参数,所以服务器返回了验证码组件的初始化脚本,而不是你需要的车辆信息。下面是具体的解决思路和修改后的代码:

问题根源

当你第一次发送GET请求获取页面时,网站已经生成了验证码,但你的POST请求里缺少了验证码的输入值,服务器因此拒绝处理你的查询请求,返回了PrimeFaces的验证码控件初始化代码——也就是你看到的PrimeFaces.cw("InputText",...)这段内容。

解决步骤

要解决这个问题,你需要在POST请求前完成两个关键步骤:

  1. 从初始页面中提取验证码图片并获取验证码内容
  2. 将验证码值添加到POST请求的参数中

修改后的代码示例

import sys
import requests
from bs4 import BeautifulSoup, SoupStrainer
from PIL import Image
from io import BytesIO
import matplotlib.pyplot as plt

home_url = 'https://parivahan.gov.in/rcdlstatus/?pur_cd=102'
post_url = 'https://parivahan.gov.in/rcdlstatus/vahan/rcDlHome.xhtml'
first = sys.argv[1]
second = sys.argv[2]

# 1. 使用Session保持会话,确保Cookie在请求间一致
session = requests.Session()
r = session.get(url=home_url)
soup = BeautifulSoup(r.text, 'html.parser')
viewstate = soup.select('input[name="javax.faces.ViewState"]')[0]['value']

# 2. 定位并下载验证码图片(用属性选择器适配动态ID)
captcha_img_tag = soup.find('img', attrs={'src': lambda x: x and 'captcha' in x.lower()})
if not captcha_img_tag:
    print("无法找到验证码图片,请检查页面结构是否变化")
    sys.exit(1)

captcha_src = 'https://parivahan.gov.in' + captcha_img_tag['src']
captcha_response = session.get(captcha_src)
img = Image.open(BytesIO(captcha_response.content))

# 显示验证码图片,让用户手动输入
plt.imshow(img)
plt.axis('off')
plt.show()
captcha_input = input("请输入图片中的验证码:").strip()

# 3. 构造包含验证码的POST数据
data = {
    'javax.faces.partial.ajax':'true',
    'javax.faces.source': 'form_rcdl:j_idt59',
    'javax.faces.partial.execute':'@ALL',
    'javax.faces.partial.render': 'form_rcdl:pnl_show form_rcdl:pg_show form_rcdl:rcdl_pnl',
    'form_rcdl:j_idt59':'form_rcdl:j_idt59',
    'form_rcdl':'form_rcdl',
    'form_rcdl:tf_reg_no1': first,
    'form_rcdl:tf_reg_no2': second,
    # 动态匹配验证码输入框的字段名
    'form_rcdl:' + captcha_img_tag['id'].split(':')[-1]: captcha_input,
    'javax.faces.ViewState': viewstate,
}

# 4. 发送POST请求并解析结果
r = session.post(url=post_url, data=data)
soup = BeautifulSoup(r.text, 'html.parser')
table = SoupStrainer('tr')
soup = BeautifulSoup(soup.get_text(), 'html.parser', parse_only=table)
print(soup.get_text())

额外注意事项

  • 动态ID适配:网站的验证码控件ID(比如j_idt32)是动态生成的,所以代码中用了属性选择器定位图片,并通过图片ID推导输入框的字段名,避免因ID变化导致代码失效。
  • 自动化验证码识别:如果需要完全自动化处理,可以使用Tesseract OCR(搭配pytesseract库),但这类验证码通常带有干扰元素,建议先对图片进行预处理(灰度化、二值化、降噪)来提高识别率。
  • 合规性提示:请严格遵守Parivahan网站的使用条款,不要频繁发送请求,避免IP被封禁。
  • 会话一致性:改用requests.Session()来管理会话,确保Cookie在GET和POST请求中保持一致,避免因会话不一致导致的验证失败。

内容的提问来源于stack exchange,提问作者Akshay Bakshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:17:54