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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:10:37