谈XMLHTTP对象(属性和方法)-VBA抓取网页数据_第1页
谈XMLHTTP对象(属性和方法)-VBA抓取网页数据_第2页
谈XMLHTTP对象(属性和方法)-VBA抓取网页数据_第3页
谈XMLHTTP对象(属性和方法)-VBA抓取网页数据_第4页
谈XMLHTTP对象(属性和方法)-VBA抓取网页数据_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、ot;, "http:/ ajaxServer.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.C向http服务器发送请求并 使用微软 XML

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

4、形式返回的响 应结果。XMLHTT对象支持 Microsoft In ternet 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 (MSX

5、ML 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.idlXMLHttp 成员属性onreadystatechange *指定当 readyState 属性改变时的事件处理句柄。 会触发这个事件处理器只写 . 每个状态改变时都readyState返回当前请求的状态,只读 .responseBody将回应信息正文以 unsigned byte 数组形式返回

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

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

8、adyState;示例Dim XmlHttp As ObjectSet XmlHttp = CreateObject("Msxml2.XMLHTTP.3.0")XmlHttp.Open "GET", "http:/localhost/test.xml", TrueXmlHttp.sendIf XmlHttp.readyState = 4 ThenMsgBox "Done"End If备注此属性只读,状态用长度为 4 的整型表示 (4-byte integer). 定义如下:0" 未初始化 " 状

9、态。此时,已经创建一个 XMLHttpRequest 对象,但是还没有初始化(即还没调用open 方法)。" 初始化 " 状态。此时,已经调用 open 方法 , 并且 XMLHttpRequest 对象已经准备好把一个请求发送 1到服务器,但还没调用 send 方法。"发送"状态。此时,已经调用 send 方法,把一个请求发送到服务器端, 但是还没有收到一个响应, 2即是当前的状态及 http 头部信息未知。"正在接收”状态。此时,已经接收到 HTTP响应头部信息,但是消息体部分还没有完全接收结束,3 这时通过 responseBody 和

10、responseText 获取部分数据会出现错误。4 数据接收完毕 , 此时可以通过通过 responseBody 和 responseText 获取完整的回应数据Note从 MSXML 3.0 开始,如果在数据还没有加载完毕(例如,在加载状态或交互式状态)前就读取status属性,则会返回一个错误信息:"The data necessary to complete this operation is not yetavailable."版本MSXML 2.0 及以上版本responseBody 属性以未解码的二进制数组形式返回HTTP服务器响应数据语法strValue =

11、 oXMLHttpRequest.responseBody;示例Dim xmlhttp As New Msxml2.XMLHTTP50 xmlhttp.open "GET", "http:/localhost/test.xml", False xmlhttp.sendMsgBox UBound(xmlhttp.responseBody)备注返回值为Variant类型,只读。XMLHTT的responseBody从服务器返回一个二 进制数组,即一个类型为 VT_ARRAY | VT_UI1的安全数组(SAFEARRAY来表示返 回数据的实体。 他包含了从服

12、务器返回的未经解码的二进制数据, 因此,基于请 求不同的服务器,最终 会显示不同的二进制编码数据 (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 "GET", "http:/localhost/test.

13、xml", False xmlhttp.sendMsgBox xmlhttp.responseBody以下为编码转换函数:Function bytes2BSTR(arrBytes) ' 编码转换Dim strReturn As StringDim ThisCharCode As StringDim NextCharCode As StringDim i As LongstrReturn = "" arrBytes = CStr(arrBytes) For i = 1 To LenB(arrBytes)ThisCharCode = AscB(MidB(arr

14、Bytes, i, 1)If ThisCharCode < &H80 Then strReturn = strReturn & Chr(ThisCharCode) ElseNextCharCode = AscB(MidB(arrBytes, i + 1, 1) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode) i = i + 1 End IfNext i bytes2BSTR = strReturn End Function以下程序不会发生乱码了:Dim

15、xmlhttp As New Msxml2.XMLHTTP50 xmlhttp.open "GET", "http:/localhost/test.xml", False xmlhttp.sendMsgBox bytes2BSTR(xmlhttp.responseBody)版本MSXML 2.0及以上版本responseStream 属性以 Ado Stream 对象的形式返回响应信息语法strValue = oXMLHttpRequest.responseStream;备注返回值为Variant类型,只读。XMLHTT的responseStream从服

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

17、uot;GET", "http:/localhost/test.xml", Falsexmlhttp.sendMsgBox xmlhttp.responseText备注返回值为String类型,此属性只读。XMLHTT尝试将响应信息解码为 Unicode字符串,XMLHTT默认将响应数据的编码定为UTF-8,如果服务器返回的数据是匹配的 Unicode BOM(byte-order mark) 编码,XMLHTT可以解码任何 UCS-2 (big or little endian)或者UCS-4数据。注意,如果服务器返回的是xml文档,此属性并不处理 xml文档中

18、的编码声明。你需要使用responseXML来处理。这个responseText属性包含客户端接收到的 HTTP响应的文本内容。当 readyState 值为0、1或2时, responseText包含一个空字符串。 当readyState 值为3(正在接收)时,响应中包含客户端还未完成的响应 信息。当readyState 为4(已加载)时,该responseText包含完整的响应信息。版本MSXML 2.0 及以上版本respo nseXML 属性以Xml Document对象形式返回将响应信息语法Set objDispatch = oXMLHttpRequest.respo nseXML示

19、例Dim xmlhttp As New Msxml2.XMLHTTP30xmlhttp.sendMsgBox xmlhttp.responseXML.xml备注此属性只读,将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档,此属性本身不返回XMLDOMParseErro,可以通过处理过的 DOMDocumen对象获取错误信息。此responseXML属性用于当接收到完整的 HTTP响应时(readyState 为4)描述XML卩向应;如果响应实体不是 有效的 xml 格式,则返回错误。无论何时,只要 readyState 值不为 4,那么该 response

20、XML 的值也会返回 null 。如果Content-Type头部并不包含以下这些媒体类型之一:Content-Type头部指定MIME媒体)类型为text/xml , application/xml 或以 +xml 结尾,例如, "application/rss+xml" ,那么 responseXML 的值为 null 。其实,这个 responseXML 属性值是一个文档接口类型的对象,用来描述被分析的文档。如果文档不能被分 析( 例如,如果文档不是良构的或不支持文档相应的字符编码 ) ,那么 responseXML 的值将为 null版本MSXML 2.0 及以上版

21、本status返回当前请求的 http 状态码,长整型,只读语法lValue = oXMLHttpRequest.status;示例Dim xmlServerHttp As New Msxml2.ServerXMLHTTP30 xmlServerHttp.open "GET", "http:/localhost/books.xml", False xmlServerHttp.sendMsgBox xmlServerHttp.status返回值长整形标准http 状态码,定义如下:状态码描述100Continue101Switching protocols

22、200OK201Created202Accepted203Non-Authoritative Information204No Content205Reset Content206Partial Content300Multiple Choices301Moved Permanently302Found303See Other304Not Modified305Use Proxy307Temporary Redirect400Bad Request401Unauthorized402Payment Required403Forbidden404Not Found405Method Not Allowed406Not Acceptable407Proxy Authentication Required408Request Timeout409Conflict410Gone411Length Required412Precondition Failed413Request Entity Too Lar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论