Excel VBA使用XMLHTTP下载网页黄金价格表格无有效数据问题咨询
核心问题原因
你请求的目标页面属于前端动态渲染页面,初始静态HTML本身不包含黄金价格表格数据。页面加载完成后会通过JavaScript调用后端数据接口拉取表格内容,再动态插入到页面DOM中。而XMLHTTP只能获取首次GET请求返回的静态源码,没有浏览器的JS执行和渲染能力,不管等待多久都拿不到动态加载的表格数据。
你现有代码的可优化点
- 等待逻辑无效:
ReadyState = 4仅代表XMLHTTP自身的请求动作完成,和页面动态内容加载没有任何关系,这段循环等待的代码没有实际作用。如果不需要异步处理,直接把Open方法的第三个参数改为False即可实现同步阻塞请求,无需自己写等待逻辑。 - 请求地址错误:你现在请求的是前端页面地址,而非实际返回价格数据的后端接口,自然拿不到需要的内容。
可行的解决方案
方案1(优先推荐):直接请求数据接口
不需要解析页面,直接抓包拿到返回黄金价格数据的后端接口:
- 用浏览器打开目标页面,按F12打开开发者工具,切换到「网络」面板,筛选「XHR/提取」类型的请求
- 刷新页面后逐一查看请求的响应内容,找到返回黄金价格结构化数据(一般为JSON格式)的接口
- 直接用XMLHTTP请求该接口地址,拿到响应后直接解析数据即可,比解析HTML表格效率高很多。
参考代码示例:
Dim http As MSXML2.XMLHTTP60 Set http = New MSXML2.XMLHTTP60 ' 此处替换为你抓包获取到的实际数据接口地址 Const DATA_API_URL As String = "你抓包得到的实际接口地址" With http ' 同步请求,第三个参数设为False,无需额外写等待逻辑 .Open "GET", DATA_API_URL, False .setRequestHeader "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" .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" .send ' 同步请求send执行完成后直接读取响应即可 Debug.Print .responseText End With
方案2:使用带渲染能力的自动化工具
如果找不到接口,就放弃XMLHTTP,改用IE自动化、Selenium等带浏览器内核的工具,这类工具会自动执行页面JS完成渲染,等表格渲染完成后直接提取DOM中的表格内容即可。
内容的提问来源于stack exchange,提问作者drb01
相关产品推荐
相关产品推荐

