使用Python Requests获取西澳交通局车辆注册信息失败求助
西澳交通局车辆注册查询爬取问题解决
问题说明
使用Python的requests库获取西澳交通局网站(https://online.transport.wa.gov.au)的车辆注册查询结果时,提交车牌号码1hdv242后,页面已接收该参数,但未返回包含车辆品牌、型号、注册到期日等目标信息的结果页面。
现有代码
import requests from bs4 import BeautifulSoup rego = "1hdv242" #plate = {'plate' : rego} url = 'https://online.transport.wa.gov.au/webExternal/registration/?1-1.IBehaviorListener.1-layout-layout_body-registrationRequestForm-id7_hf_0=&plate=1hdv242&searchButton=16' response = requests.post(url, data = {'plate': '1hdv242'}) soup = BeautifulSoup(response.text, features='html.parser') data = [item.text for item in soup.select('.data')] #print(data) print(soup)
页面关键片段(参数接收部分)
<ol> <li> <span class="emphasized-plain">Plate number:</span> <div style="display: inline-block;"> # # # <input id="id1" maxlength="15" name="plate" onchange="var wcall=wicketAjaxPost('./;jsessionid=SwzIYkP1Lh9XDh-k4XDn_GQCD2-vmQ-xKm-aBlu89OPIaD-XMkRs!1563753950!-1720409949?0-1.IBehaviorListener.2-layout-layout_body-registrationRequestForm-plate', wicketSerialize(Wicket.$('id1')),function() { }.bind(this),function() { }.bind(this), function() {return Wicket.$('id1') != null;}.bind(this));" title="Please enter your plate number here" type="text" value="1HDV242"/> </div> </li> <li>
期望获取的车辆信息
- 车牌:1HDV242
- 品牌:KIA
- 型号:RIO
- 年份:2020
- 颜色:BLACK
- 注册到期日:12/02/2023
解决方案
该网站基于Wicket框架构建,这类框架对请求完整性要求极高,需携带会话信息、表单隐藏字段及正确参数才能返回有效结果。以下是修正后的代码:
import requests from bs4 import BeautifulSoup # 初始化会话,维持Cookie一致性 session = requests.Session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' }) # 第一步:获取初始页面,提取表单隐藏字段和会话信息 base_url = 'https://online.transport.wa.gov.au/webExternal/registration/' initial_response = session.get(base_url) soup_initial = BeautifulSoup(initial_response.text, 'html.parser') # 收集所有隐藏表单字段 form_data = {} for input_tag in soup_initial.select('input[type="hidden"]'): form_data[input_tag.get('name')] = input_tag.get('value') # 添加查询参数 form_data['plate'] = '1hdv242' form_data['searchButton'] = 'Search' # 第二步:发送符合Wicket要求的POST请求 post_url = f"{base_url}?1-1.IBehaviorListener.0-layout-layout_body-registrationRequestForm-searchButton" response = session.post(post_url, data=form_data) soup_result = BeautifulSoup(response.text, 'html.parser') # 提取目标车辆信息 vehicle_info = {} for row in soup_result.select('.data-row'): key = row.select_one('.label').text.strip() value = row.select_one('.data').text.strip() vehicle_info[key] = value print(vehicle_info)
核心注意事项
- 会话保持:用
requests.Session()维持会话,确保Cookie和会话ID一致,这是Wicket验证请求合法性的关键。 - 隐藏字段:必须携带初始页面所有隐藏表单字段(如Wicket生成的
hf系列字段),缺失会导致请求被拦截。 - 请求URL:需匹配页面实际触发查询的Wicket监听器URL,可通过浏览器开发者工具的网络面板查看真实提交路径。
- 浏览器模拟:添加User-Agent头,避免被网站识别为爬虫拦截。
内容的提问来源于stack exchange,提问作者drunknmonkie
相关产品推荐
相关产品推荐

