用VBA抓取网页数据有不少方法,其中一种便是引用XMLHTTP对象。在这里尝试为大家介绍一下这个对象的一些基本属性和方法还有一些应用示例。
XMLHTTP对象参考
IXMLHTTPRequest
提供客户端同http服务器通讯的协议
示例
以下示例建立一个XMLHTTP对象,并向http服务器发出指定地址的请求,请求返回XML的源文件(XML document),如果服务器不能连通,则返回错误。
Dim HttpReq As Object
Set HttpReq = CreateObject(\HttpReq.open \HttpReq.send
MsgBox HttpReq.responseText
说明:第一,二行可以用以下语句代替,但前提是需要在对象里先引用Microsoft XML,v2.6-6.0(msxml2.dll, msxml3.dll, msxml4.dll, msxml5.dll, msxml6.dll)其中之一。
Dim HttpReq As New MSXML2.XMLHTTP30
备注
客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft? XML Document Object Model (DOM)处理回应。
该对完全象集成了Microsoft XML Core Services (MSXML),支持直接发送请求,并用MSXML DOM分析响应。由于集成了对Extensible Stylesheet Language (XSL)的支持,XMLHTT对象组件提供一个很简易的途径向HTTP服务器发送一个结构化查询,并支持用多种形式有效显示结果。
通常的使用顺序是,先用open 方法,再用send方法发送请求,然后用
setRequestHeader方法设置自定义头信息,最后查看四种以不同形式返回的响应结果。
XMLHTTP对象支持Microsoft Internet Explorer (IE) 5.0 及以上版本,只要你的网页浏览器指定一种语言进行浏览。更详细的信息请查看Explorer的帮助
文件关于\的部份。
版本
MSXML 2.0及以上版本
先决条件
如果不用CreateObject方法创建对象,则需要先引用以下任意一个版本的文件: msxml3.dll, msxml2.lib (MSXML 3.0) msxml4.dll, msxml2.lib (MSXML 4.0)
msxml5.dll, msxml2.lib (MSXML 5.0 for Microsoft Office Applications) msxml6.dll, msxml2.lib (MSXML 6.0)
Header and IDL files: msxml2.h, msxml2.idl
XMLHttp成员
属性
onreadystatechange* readyState responseBody responseStream responseText responseXML status
statusText
指定当readyState属性改变时的事件处理句柄。只写. 每个状态改变时都会触发这个事件处理器 返回当前请求的状态,只读.
将回应信息正文以unsigned byte数组形式返回.只读 以Ado Stream对象的形式返回响应信息。只读 将响应信息作为字符串返回.只读
将响应信息格式化为Xml Document对象并返回,只读 返回当前请求的http状态码.只读 返回当前请求的响应行状态,只读
* 表示此属性是W3C文档对象模型的扩展.在VBA中不能直接调用
方法
取消当前请求 abort
获取响应的所有http头 getAllResponseHeaders
从响应信息中获取指定的http头 getResponseHeader
open
创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码)
send
setRequestHeader
发送请求到http服务器并接收回应 单独指定请求的某个http头
readyState属性
返回XMLHTTP请求的当前状态
此属性只读,返回值为4字节的长整型(具体值请看备注)
当XMLHttp对象把一个HTTP请求发送到服务器时将经历若干种状态:一直等待直到请求被处理;然后,它才接收一个响应。这样以来,脚本才正确响应各种状态-XMLHttpRequest对象拥有一个描述对象的当前状态的readyState属性。
语法
strValue = oXMLHttpRequest.readyState;
示例
Dim XmlHttp As Object
Set XmlHttp = CreateObject(\
XmlHttp.Open \ XmlHttp.send
If XmlHttp.readyState = 4 Then MsgBox \ End If
备注
此属性只读,状态用长度为4的整型表示(4-byte integer).定义如下:
0 \未初始化\状态。此时,已经创建一个XMLHttpRequest对象,但是还没有初始化(即还没调用
open方法)。 1 2 3
\初始化\状态。此时,已经调用open方法,并且XMLHttpRequest对象已经准备好把一个请求发送到服务器,但还没调用send方法。
\发送\状态。此时,已经调用send方法,把一个请求发送到服务器端,但是还没有收到一个响应,即是当前的状态及http头部信息未知。
\正在接收\状态。此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束,这时通过responseBody和responseText获取部分数据会出现错误。
4 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
Note
从MSXML 3.0开始,如果在数据还没有加载完毕(例如,在加载状态或交互式状态)前就读取status 属性,则会返回一个错误信息:\available.\
版本
MSXML 2.0及以上版本
responseBody属性
以未解码的二进制数组形式返回HTTP服务器响应数据。
语法
strValue = oXMLHttpRequest.responseBody;
示例
Dim xmlhttp As New Msxml2.XMLHTTP50
xmlhttp.open \xmlhttp.send
MsgBox UBound(xmlhttp.responseBody)
备注
返回值为Variant类型,只读。XMLHTTP的responseBody从服务器返回一个二进制数组,即一个类型为VT_ARRAY | VT_UI1*的安全数组(SAFEARRAY)来表示返回数据的实体。他包含了从服务器返回的未经解码的二进制数据,因此,基于请
求不同的服务器,最终 会显示不同的二进制编码数据(UTF-8, UCS-2, UCS-4, Shift_JIS等等)。
*VT_UI1:无符号1字节整数(BYTE)数组 当Variant的数据类型为VT_ARRAY | VT_UI1时,返回一个SAFEARRAY安全数组
如果想返回解码后的数据实体则需要进行编码转换来解码,否则会发生乱码。如以下程序会发生中文乱码:
Dim xmlhttp As New Msxml2.XMLHTTP50
xmlhttp.open \xmlhttp.send
MsgBox xmlhttp.responseBody
以下为编码转换函数:
Function bytes2BSTR(arrBytes) '编码转换 Dim strReturn As String Dim ThisCharCode As String Dim NextCharCode As String Dim i As Long
strReturn = \
arrBytes = CStr(arrBytes) For i = 1 To LenB(arrBytes)
ThisCharCode = AscB(MidB(arrBytes, i, 1)) If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode) Else
NextCharCode = AscB(MidB(arrBytes, i + 1, 1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next i
bytes2BSTR = strReturn End Function
以下程序不会发生乱码了:
Dim xmlhttp As New Msxml2.XMLHTTP50
xmlhttp.open \xmlhttp.send
MsgBox bytes2BSTR(xmlhttp.responseBody)