VBA下载自有网站文件失败(403错误)的排查与解决
问题原因与解决方案
核心问题
403错误是因为目标服务器(atwebpages.com)的反爬虫机制拦截了你的VBA请求。Microsoft.XMLHTTP默认发送的请求头缺少浏览器标识(比如User-Agent),服务器识别出这是自动化程序发起的请求,因此拒绝访问。而维基百科的链接能正常工作,是因为其服务器对自动化请求的限制更宽松。
解决方法
在发送请求前添加模拟浏览器的请求头,最关键的是User-Agent字段,部分服务器可能还需要Referer字段辅助验证。修改你的代码如下:
Private Sub DownloadFile(myURL As String, target As String) Dim WinHttpReq As Object Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", myURL, False ' 添加模拟浏览器的请求头 WinHttpReq.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" WinHttpReq.setRequestHeader "Referer", "http://pavimarcon.atwebpages.com/prueba/" ' 匹配目标文件所在页面的地址 WinHttpReq.Send Debug.Print "WinHttpReq.Status=" & WinHttpReq.Status If WinHttpReq.Status = 200 Then Set oStream = CreateObject("ADODB.Stream") oStream.Open oStream.Type = 1 oStream.Write WinHttpReq.responseBody oStream.SaveToFile target, 2 ' 1 = 不覆盖, 2 = 覆盖 oStream.Close Set oStream = Nothing End If Set WinHttpReq = Nothing End Sub
额外说明
- 如果添加User-Agent后仍报错,可以尝试补充更多常见请求头(如Accept、Accept-Language等),模拟更完整的浏览器请求。
- 对于
URLDownloadToFile函数,同样可以通过设置请求头解决,但需要借助额外的回调函数来添加头信息,实现起来不如XMLHTTP灵活,因此优先推荐修改后的XMLHTTP方案。
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

