VBA通过XMLHTTP60替代IE实现BOM气象站点带参数查询方案咨询
解决方案
完全可以仅通过XMLHTTP60实现带参数的查询请求,无需依赖Selenium等浏览器自动化工具,实现逻辑如下:
核心原理
前端页面输入区域码、点击查询按钮的交互,本质是浏览器向服务端发送带查询参数的HTTP请求,无需模拟前端交互,只需抓包拿到实际请求的规则,直接用XMLHTTP60模拟对应请求即可。
操作步骤
- 打开Edge/Chrome浏览器访问目标站点,按F12打开开发者工具,切换到「网络」面板,勾选「保留日志」选项
- 在页面搜索框输入测试区域码(示例为20),点击查询按钮
- 在网络面板的请求列表中筛选类型为
document的请求,即可找到查询触发的实际请求,记录该请求的请求URL、请求方法、查询参数、必要请求头
修改后的XMLHTTP60示例代码
(以下为GET请求示例,适配绝大多数搜索场景,你可根据实际抓包结果调整参数)
' 引用:Microsoft XML, v6.0、Microsoft HTML Object Library Dim XMLPage As New MSXML2.XMLHTTP60 Dim HTMLDoc As New MSHTML.HTMLDocument Dim queryKeyword As String queryKeyword = "20" ' 替换为实际需要查询的区域码 ' 拼接带参数的请求URL,可根据抓包结果调整参数名和其他固定参数 Dim reqURL As String reqURL = "https://www.bom.gov.au/aviation/forecasts/taf/?keyword=" & VBA.EncodeURL(queryKeyword) XMLPage.Open "GET", reqURL, False ' 增加必要请求头,避免被反爬拦截 XMLPage.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" XMLPage.setRequestHeader "Referer", "https://www.bom.gov.au/aviation/forecasts/taf/" XMLPage.send ' 处理响应内容 If XMLPage.Status = 200 Then HTMLDoc.body.innerHTML = XMLPage.responseText Call ProcessHTMLPage(HTMLDoc) Else Debug.Print "请求失败,状态码:" & XMLPage.Status End If
POST请求适配(若抓包发现是POST请求)
如果查询是POST表单提交,修改代码如下即可:
XMLPage.Open "POST", "https://www.bom.gov.au/aviation/forecasts/taf/", False XMLPage.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" ' 其他请求头同上 XMLPage.send "keyword=" & VBA.EncodeURL(queryKeyword) ' 按抓包结果拼接表单参数
注意事项
- 若返回内容出现乱码,可通过ADODB.Stream组件处理响应的UTF-8编码
- 请遵守站点使用条款,控制请求频率,避免对站点服务造成不必要的压力
内容的提问来源于stack exchange,提问作者SydneyCider
相关产品推荐
相关产品推荐

