谈xmlhttp对象(属性和方法)-vba抓取网页数据

上传人:第*** 文档编号:33551677 上传时间:2018-02-15 格式:DOC 页数:11 大小:83KB
返回 下载 相关 举报
谈xmlhttp对象(属性和方法)-vba抓取网页数据_第1页
第1页 / 共11页
谈xmlhttp对象(属性和方法)-vba抓取网页数据_第2页
第2页 / 共11页
谈xmlhttp对象(属性和方法)-vba抓取网页数据_第3页
第3页 / 共11页
谈xmlhttp对象(属性和方法)-vba抓取网页数据_第4页
第4页 / 共11页
谈xmlhttp对象(属性和方法)-vba抓取网页数据_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《谈xmlhttp对象(属性和方法)-vba抓取网页数据》由会员分享,可在线阅读,更多相关《谈xmlhttp对象(属性和方法)-vba抓取网页数据(11页珍藏版)》请在金锄头文库上搜索。

1、用 VBA 抓取网页数据有不少方法,其中一种便是引用 XMLHTTP 对象。在这里尝试为大家介绍一下这个对象的一些基本属性和方法还有一些应用示例。XMLHTTP 对象参考IXMLHTTPRequest提供客户端同 http 服务器通讯的协议示例以下示例建立一个 XMLHTTP 对象,并向 http 服务器发出指定地址的请求,请求返回 XML 的源文件(XML document),如果服务器不能连通,则返回错误。Dim HttpReq As ObjectSet HttpReq = CreateObject(MSXML2.XMLHTTP.3.0)HttpReq.open GET, http:/ a

2、jaxServer.aspx, FalseHttpReq.sendMsgBox 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 Do

3、cument Object Model (DOM)处理回应。 该对完全象集成了 Microsoft XML Core Services (MSXML),支持直接发送请求,并用 MSXML DOM 分析响应。由于集成了对 Extensible Stylesheet Language (XSL)的支持,XMLHTT 对象组件提供一个很简易的途径向 HTTP 服务器发送一个结构化查询,并支持用多种形式有效显示结果。通常的使用顺序是,先用 open 方法,再用 send 方法发送请求,然后用setRequestHeader 方法设置自定义头信息,最后查看四种以不同形式返回的响应结果。XMLHTTP 对

4、象支持 Microsoft Internet Explorer (IE) 5.0 及以上版本,只要你的网页浏览器指定一种语言进行浏览。更详细的信息请查看 Explorer 的帮助文件关于To specify another language for Web page content 的部份。版本MSXML 2.0 及以上版本先决条件如果不用 CreateObject 方法创建对象,则需要先引用以下任意一个版本的文件: msxml3.dll, msxml2.lib (MSXML 3.0)msxml4.dll, msxml2.lib (MSXML 4.0)msxml5.dll, msxml2.li

5、b (MSXML 5.0 for Microsoft Office Applications)msxml6.dll, msxml2.lib (MSXML 6.0)Header and IDL files: msxml2.h, msxml2.idlXMLHttp 成员属性onreadystatechange*指定当 readyState 属性改变时的事件处理句柄。只写. 每个状态改变时都会触发这个事件处理器readyState 返回当前请求的状态,只读.responseBody 将回应信息正文以 unsigned byte 数组形式返回.只读responseStream 以 Ado Stream

6、 对象的形式返回响应信息。只读responseText 将响应信息作为字符串返回.只读responseXML 将响应信息格式化为 Xml Document 对象并返回,只读status 返回当前请求的 http 状态码.只读statusText 返回当前请求的响应行状态,只读* 表示此属性是 W3C 文档对象模型的扩展.在 VBA 中不能直接调用方法abort 取消当前请求getAllResponseHeaders获取响应的所有 http 头getResponseHeader 从响应信息中获取指定的 http 头open 创建一个新的 http 请求,并指定此请求的方法、URL 以及验证信息(

7、用户名/密码)send 发送请求到 http 服务器并接收回应setRequestHeader 单独指定请求的某个 http 头readyState 属性返回 XMLHTTP 请求的当前状态此属性只读,返回值为 4 字节的长整型(具体值请看备注)当 XMLHttp 对象把一个 HTTP 请求发送到服务器时将经历若干种状态:一直等待直到请求被处理;然后,它才接收一个响应。这样以来,脚本才正确响应各种状态-XMLHttpRequest 对象拥有一个描述对象的当前状态的 readyState 属性。语法strValue = oXMLHttpRequest.readyState; 示例Dim XmlH

8、ttp As ObjectSet XmlHttp = CreateObject(Msxml2.XMLHTTP.3.0)XmlHttp.Open GET, http:/localhost/test.xml, TrueXmlHttp.sendIf XmlHttp.readyState = 4 ThenMsgBox DoneEnd If备注此属性只读,状态用长度为 4 的整型表示(4-byte integer).定义如下:0未初始化状态。此时,已经创建一个 XMLHttpRequest 对象,但是还没有初始化(即还没调用open 方法)。1初始化状态。此时,已经调用 open 方法,并且 XMLHt

9、tpRequest 对象已经准备好把一个请求发送到服务器,但还没调用 send 方法。2发送状态。此时,已经调用 send 方法,把一个请求发送到服务器端,但是还没有收到一个响应,即是当前的状态及 http 头部信息未知。3正在接收状态。此时,已经接收到 HTTP 响应头部信息,但是消息体部分还没有完全接收结束,这时通过 responseBody 和 responseText 获取部分数据会出现错误。4 数据接收完毕,此时可以通过通过 responseBody 和 responseText 获取完整的回应数据Note 从 MSXML 3.0 开始,如果在数据还没有加载完毕(例如,在加载状态或交

10、互式状态)前就读取status 属性,则会返回一个错误信息:The data necessary to complete this operation is not yet available.版本MSXML 2.0 及以上版本responseBody 属性以未解码的二进制数组形式返回 HTTP 服务器响应数据。语法strValue = oXMLHttpRequest.responseBody; 示例Dim xmlhttp As New Msxml2.XMLHTTP50xmlhttp.open GET, http:/localhost/test.xml, Falsexmlhttp.sendMs

11、gBox 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 时,返回一个 S

12、AFEARRAY 安全数组如果想返回解码后的数据实体则需要进行编码转换来解码,否则会发生乱码。如以下程序会发生中文乱码:Dim xmlhttp As New Msxml2.XMLHTTP50xmlhttp.open GET, http:/localhost/test.xml, Falsexmlhttp.sendMsgBox xmlhttp.responseBody以下为编码转换函数:Function bytes2BSTR(arrBytes) 编码转换Dim strReturn As StringDim ThisCharCode As StringDim NextCharCode As Stri

13、ngDim i As LongstrReturn = arrBytes = CStr(arrBytes)For i = 1 To LenB(arrBytes)ThisCharCode = AscB(MidB(arrBytes, i, 1)If ThisCharCode &H80 ThenstrReturn = strReturn & Chr(ThisCharCode)ElseNextCharCode = AscB(MidB(arrBytes, i + 1, 1)strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextC

14、harCode)i = i + 1End IfNext ibytes2BSTR = strReturnEnd Function以下程序不会发生乱码了:Dim xmlhttp As New Msxml2.XMLHTTP50xmlhttp.open GET, http:/localhost/test.xml, Falsexmlhttp.sendMsgBox bytes2BSTR(xmlhttp.responseBody)版本MSXML 2.0 及以上版本responseStream 属性以 Ado Stream 对象的形式返回响应信息语法strValue = oXMLHttpRequest.res

15、ponseStream; 备注返回值为 Variant 类型,只读。XMLHTTP 的 responseStream 从服务器返回一数据流入 stream(IStream)。该包含了从服务器返回的未经解码的二进制数据,因此,基于请求不同的服务器,最终会显示不同的二进制编码数据(UTF- 8, UCS-2, UCS-4, Shift_JIS 等等)。如果请求的网页的数据编码不是二进制,则会发生乱码。版本MSXML 2.0 及以上版本responseText 属性以字符串形式返回响应信息(即我们通常见到的网页源文件)语法strValue = oXMLHttpRequest.responseText

16、; 示例Dim xmlhttp As New Msxml2.XMLHTTP30xmlhttp.open GET, http:/localhost/test.xml, Falsexmlhttp.sendMsgBox xmlhttp.responseText备注返回值为 String 类型,此属性只读。XMLHTTP 尝试将响应信息解码为 Unicode 字符串,XMLHTTP 默认将响应数据的编码定为 UTF-8,如果服务器返回的数据是匹配的 Unicode BOM(byte-order mark)编码,XMLHTTP 可以解码任何 UCS-2 (big or little endian)或者 UCS-4 数据。注意,如果服务器返回的是 xml 文档,此属性并不处理 xml 文档中的编码声明。你需要使用 responseXML 来处理。这个 responseText 属性包含客户端接收到的 HTTP 响应的文本内容。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号