Vba WinHttpRequest gzip响应解析
我在VBA项目中使用Vba WinHttpRequest gzip响应解析,vba,web-scraping,xmlhttprequest,winhttp,Vba,Web Scraping,Xmlhttprequest,Winhttp,我在VBA项目中使用MSXML2.XMLHTTP60进行http冲浪。问题是MSXML2。XMLHTTP60被限制为四个并发请求 我正在尝试使用WinHttp.WinHttpRequest.5.1,但还有另一个问题MSXML2.XMLHTTP60自动解析gzip结果,但 WinHttpRequest.responseText方法失败,出现错误: 目标多字节代码页中不存在unicode字符的映射 如何使用标准Windows库解析此结果 代码示例: MSXML2.XMLHTTP60限制: Publi
MSXML2.XMLHTTP60
进行http冲浪。问题是MSXML2。XMLHTTP60
被限制为四个并发请求
我正在尝试使用WinHttp.WinHttpRequest.5.1
,但还有另一个问题MSXML2.XMLHTTP60
自动解析gzip结果,但
WinHttpRequest.responseText
方法失败,出现错误:
目标多字节代码页中不存在unicode字符的映射
如何使用标准Windows库解析此结果
代码示例:MSXML2.XMLHTTP60限制:
Public req1 As MSXML2.XMLHTTP60
Public req2 As MSXML2.XMLHTTP60
Public req3 As MSXML2.XMLHTTP60
Public req4 As MSXML2.XMLHTTP60
Public req5 As MSXML2.XMLHTTP60
Private Const url As String = "http://speedtest.tele2.net/100MB.zip"
Public Sub ConcurrentIssue()
Set req1 = New MSXML2.XMLHTTP60
req1.Open "get", url, True
Set req2 = New MSXML2.XMLHTTP60
req2.Open "get", url, True
Set req3 = New MSXML2.XMLHTTP60
req3.Open "get", url, True
Set req4 = New MSXML2.XMLHTTP60
req4.Open "get", url, True
Set req5 = New MSXML2.XMLHTTP60
req5.Open "get", url, True
req1.send
req2.send
req3.send
req4.send
'This query will be wait
req5.send
End Sub
问题是WinHttp.WinHttpRequest.5.1
不支持解压缩(验证链接:)。我需要自己解压回应 解压问题示例:
Public Sub DecompressOk()
Set req1 = New MSXML2.XMLHTTP60
req1.Open "get", "http://www.google.ru", False
req1.setRequestHeader "User-Agent", "Fiddler"
req1.setRequestHeader "Accept-Encoding", "gzip, deflate"
req1.send
Debug.Print req1.responseText
End Sub
Public Sub WithoutDecompress()
Dim req As WinHttp.WinHttpRequest
Set req = New WinHttp.WinHttpRequest
req.Open "get", "http://www.google.ru", False
req.setRequestHeader "User-Agent", "Fiddler"
req.setRequestHeader "Accept-Encoding", "gzip, deflate"
req.send
Debug.Print req.responseText
End Sub
我试图做这个把戏却没有成功:
Public Sub DecompressIssue()
Dim req As WinHttp.WinHttpRequest
Set req = New WinHttp.WinHttpRequest
req.Open "get", "http://www.google.ru", False
req.setRequestHeader "User-Agent", "Fiddler"
req.setRequestHeader "Accept-Encoding", "gzip, deflate"
req.send
SaveBinaryToFile req.responseBody, "C:\test.zip"
Dim xmlReq As MSXML2.XMLHTTP60
Set xmlReq = New MSXML2.XMLHTTP60
xmlReq.Open "get", "C:\test.zip", False
xmlReq.setRequestHeader "Accept-Encoding", "gzip, deflate"
xmlReq.setRequestHeader "Content-Type", "text/html; charset=windows-1251"
xmlReq.send
Debug.Print xmlReq.responseBody
End Sub
Sub SaveBinaryToFile(arrBytes() As Byte, strPath As String)
With CreateObject("ADODB.Stream")
.Type = 1 ' adTypeBinary
.Open
.Write arrBytes
.SaveToFile strPath, 2 ' adSaveCreateOverWrite
.Close
End With
End Sub
这个答案证实了这一点
.setRequestHeader“接受编码”,“标识”
是正确答案
我已经搜索了好几天,寻找解码gzip响应的方法,但不知道我们可以告诉服务器不要压缩响应。请编辑并添加最少的代码。问题应该是,其他人可以重现4个并发请求的问题
MSXML2.XMLHTTP60
限制和WinHttp.WinHttpRequest.5.1
的“无映射”错误。某些网页可能包含不可读字符,请尝试从WinHttpRequest.responseBody
获取二进制内容,然后通过ADODB.Sream
将其转换为文本,如中所示。尝试使用.setRequestHeader“接受编码”、“标识”
创建XHR,以强制Web服务器发送未压缩的响应。我正试图这样做,但服务器冻结。我不能影响它。