使用VBA与MSXML2.XMLHTTP爬取网页时遇响应异常求助
解决VBA中MSXML2.XMLHTTP请求Detran MS返回跳转提示的问题
看起来你遇到的是典型的网站会话验证/反爬拦截问题——网站会校验请求是否来自合法的用户操作上下文,你的直接POST请求缺少这些必要验证信息,所以被导向跳转提示页。下面是具体的排查思路和解决方案:
核心问题分析
- 缺失会话Cookie:网站需要请求携带从主查询页面获取的会话标识,否则会判定请求非法
- 关键请求头缺失:比如
Referer(验证请求来源页面)、User-Agent(模拟浏览器身份),这些是很多网站判断是否为爬虫的基础依据 - 参数格式不匹配:部分交管系统对车牌(placa)的大小写敏感,小写参数可能无法被正确识别
修改后的可运行代码
下面的代码会先建立合法会话,再携带所有必要信息发送POST请求:
Sub SearchVehicle() Dim strPlaca As String Dim strRenavam As String strPlaca = UCase("oon5868") ' 转换为大写,匹配网站参数校验规则 strRenavam = "01021783231" Dim oXmlPage As MSXML2.XMLHTTP60 Dim strMainUrl As String Dim strPostUrl As String Dim strPostData As String Set oXmlPage = New MSXML2.XMLHTTP60 ' 第一步:先访问查询主页面,获取会话Cookie和合法上下文 strMainUrl = "http://www.detran.ms.gov.br/consulta-de-debitos/" oXmlPage.Open "GET", strMainUrl, False oXmlPage.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" oXmlPage.send ' 第二步:发送POST请求,携带会话信息和验证头 strPostUrl = "http://www2.detran.ms.gov.br/detranet/nsite/veiculo/veiculos/retornooooveiculos.asp" strPostData = "placa=" & strPlaca & "&renavam=" & strRenavam oXmlPage.Open "POST", strPostUrl, False oXmlPage.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" oXmlPage.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" oXmlPage.setRequestHeader "Referer", strMainUrl ' 告知服务器请求来自合法入口页 oXmlPage.setRequestHeader "Cookie", oXmlPage.getResponseHeader("Set-Cookie") ' 携带会话Cookie oXmlPage.send strPostData ' 输出响应结果,你可以在这里解析Chassis信息 Debug.Print oXmlPage.responseText End Sub
关键修改说明
- 预访问主页面:通过GET请求获取服务器生成的会话Cookie,建立合法的用户操作上下文
- 模拟浏览器标识:添加
User-Agent头,避免被网站识别为非浏览器请求 - 校验请求来源:添加
Referer头,证明请求是从官方查询页面发起的 - 维持会话一致性:将主页面获取的Cookie传递给POST请求,确保服务器识别为同一会话
- 统一参数格式:将车牌转换为大写,匹配交管系统的参数校验规则
额外注意事项
- 确保你的VBA工程已引用
Microsoft XML, v6.0(可通过「工具」→「引用」找到并勾选) - 如果仍然无法获取有效响应,可以尝试替换为
MSXML2.ServerXMLHTTP60对象,它在处理部分网站的反爬机制时兼容性更好 - 请严格遵守网站的使用条款和当地法律法规,确保爬虫行为合法合规
内容的提问来源于stack exchange,提问作者Adriano Ianase
相关产品推荐
相关产品推荐

