请求Parivahan网站车辆信息时遭遇Captcha错误的技术求助
解决Parivahan车牌查询的验证码问题
看起来你遇到的核心问题是网站要求验证码验证,但你的请求没有提供正确的验证码参数,所以服务器返回了验证码组件的初始化脚本,而不是你需要的车辆信息。下面是具体的解决思路和修改后的代码:
问题根源
当你第一次发送GET请求获取页面时,网站已经生成了验证码,但你的POST请求里缺少了验证码的输入值,服务器因此拒绝处理你的查询请求,返回了PrimeFaces的验证码控件初始化代码——也就是你看到的PrimeFaces.cw("InputText",...)这段内容。
解决步骤
要解决这个问题,你需要在POST请求前完成两个关键步骤:
- 从初始页面中提取验证码图片并获取验证码内容
- 将验证码值添加到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
相关产品推荐
相关产品推荐

