ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 28554|回复: 30

[转帖] 浅谈XMLHTTP对象(属性和方法)-VBA抓取网页数据

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-6-1 23:34 | 显示全部楼层 |阅读模式
浅谈XMLHTTP对象(属性和方法)-VBA抓取网页数据 (1)


用VBA抓取网页数据有不少方法,其中一种便是引用XMLHTTP对象。在这里尝试为大家介绍一下这个对象的一些基本属性和方法还有一些应用示例。

XMLHTTP对象参考

IXMLHTTPRequest
提供客户端同http服务器通讯的协议

示例

以下示例建立一个XMLHTTP对象,并向http服务器发出指定地址的请求,请求返回XML的源文件(XML document),如果服务器不能连通,则返回错误。

Dim HttpReq As Object
Set HttpReq = CreateObject("MSXML2.XMLHTTP.3.0")
HttpReq.open "GET", "http:// ajaxServer.aspx", False
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的帮助文件关于"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.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属性改变时的事件处理句柄。只写. 每个状态改变时都会触发这个事件处理器

readyState

返回当前请求的状态,只读.

responseBody

将回应信息正文以unsigned byte数组形式返回.只读

responseStream

以Ado Stream对象的形式返回响应信息。只读

responseText

将响应信息作为字符串返回.只读

responseXML

将响应信息格式化为Xml Document对象并返回,只读

status

返回当前请求的http状态码.只读

statusText

返回当前请求的响应行状态,只读


* 表示此属性是W3C文档对象模型的扩展.在VBA中不能直接调用


方法
abort

取消当前请求

getAllResponseHeaders

获取响应的所有http头

getResponseHeader

从响应信息中获取指定的http头

open

创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码)

send

发送请求到http服务器并接收回应

setRequestHeader

单独指定请求的某个http头

转自:http://metrom.blog.163.com/blog/static/20298163200911301090580/

[ 本帖最后由 Dillon 于 2011-6-2 10:26 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-1 23:37 | 显示全部楼层
浅谈XMLHTTP对象(属性和方法)-VBA抓取网页数据 (2)


readyState属性

返回XMLHTTP请求的当前状态


此属性只读,返回值为4字节的长整型(具体值请看备注)


当XMLHttp对象把一个HTTP请求发送到服务器时将经历若干种状态:一直等待直到请求被处理;然后,它才接收一个响应。这样以来,脚本才正确响应各种状态-XMLHttpRequest对象拥有一个描述对象的当前状态的readyState属性。


语法

strValue = oXMLHttpRequest.readyState;


示例

Dim XmlHttp As Object
Set XmlHttp = CreateObject("Msxml2.XMLHTTP.3.0")

    XmlHttp.Open "GET", "http://localhost/test.xml", True
    XmlHttp.send
    If XmlHttp.readyState = 4 Then
        MsgBox "Done"
    End If

备注


此属性只读,状态用长度为4的整型表示(4-byte integer).定义如下:


0

"未初始化"状态。此时,已经创建一个XMLHttpRequest对象,但是还没有初始化(即还没调用open方法)。

1

"初始化"状态。此时,已经调用open方法,并且XMLHttpRequest对象已经准备好把一个请求发送到服务器,但还没调用send方法。

2

"发送"状态。此时,已经调用send方法,把一个请求发送到服务器端,但是还没有收到一个响应,即是当前的状态及http头部信息未知。

3

"正在接收"状态。此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束,这时通过responseBody和responseText获取部分数据会出现错误。

4

数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据


Note
从MSXML 3.0开始,如果在数据还没有加载完毕(例如,在加载状态或交互式状态)前就读取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.XMLHTTP50
xmlhttp.open "GET", "http://localhost/test.xml", False
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 "GET", "http://localhost/test.xml", False
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 "GET", "http://localhost/test.xml", False
xmlhttp.send
MsgBox bytes2BSTR(xmlhttp.responseBody)


版本

MSXML 2.0及以上版本

转自:http://metrom.blog.163.com/blog/static/20298163200911301090153/

[ 本帖最后由 Dillon 于 2011-6-2 10:27 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-1 23:40 | 显示全部楼层
浅谈XMLHTTP对象(属性和方法)-VBA抓取网页数据 (3)

Microsoft Office 2009-12-30 22:09:19 阅读19 评论0   字号:大中小 订阅
responseStream属性

以Ado Stream对象的形式返回响应信息

语法
strValue = oXMLHttpRequest.responseStream;

备注
返回值为Variant类型,只读。XMLHTTP的responseStream从服务器返回一数据流入 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 "GET", "http://localhost/test.xml", False

xmlhttp.send

MsgBox 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响应的文本内容。当readyState值为0、1或2时,responseText包含一个空字符串。当readyState值为3(正在接收)时,响应中包含客户端还未完成的响应信息。当readyState为4(已加载)时,该responseText包含完整的响应信息。



版本
MSXML 2.0及以上版本


responseXML属性

以Xml Document对象形式返回将响应信息


语法

Set objDispatch = oXMLHttpRequest.responseXML


示例
Dim xmlhttp As New Msxml2.XMLHTTP30

xmlhttp.open "GET", "http://localhost/test.xml", False

xmlhttp.send

MsgBox xmlhttp.responseXML.xml


备注

此属性只读,将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档,此属性本身不返回XMLDOMParseError,可以通过处理过的DOMDocument对象获取错误信息。



此responseXML属性用于当接收到完整的HTTP响应时(readyState为4)描述XML响应;如果响应实体不是有效的xml格式,则返回错误。无论何时,只要readyState值不为4,那么该responseXML的值也会返回null。


如果Content-Type头部并不包含以下这些媒体类型之一:Content-Type头部指定MIME(媒体)类型为text/xml,application/xml或以+xml结尾,例如,"application/rss+xml",那么responseXML的值为null。


其实,这个responseXML属性值是一个文档接口类型的对象,用来描述被分析的文档。如果文档不能被分析(例如,如果文档不是良构的或不支持文档相应的字符编码),那么responseXML的值将为null。



版本

MSXML 2.0及以上版本

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-1 23:43 | 显示全部楼层
浅谈XMLHTTP对象(属性和方法)-VBA抓取网页数据 (4)

Microsoft Office 2009-12-30 22:08:19 阅读16 评论0   字号:大中小 订阅
status属性

返回当前请求的http状态码,长整型,只读。

语法
lValue = oXMLHttpRequest.status;

示例

Dim xmlServerHttp As New Msxml2.ServerXMLHTTP30
xmlServerHttp.open "GET", "http://localhost/books.xml", False
xmlServerHttp.send
MsgBox xmlServerHttp.status

返回值

长整形标准http状态码,定义如下:

状态码

描述

100

Continue

101

Switching protocols

200

OK

201

Created

202

Accepted

203

Non-Authoritative Information

204

No Content

205

Reset Content

206

Partial Content

300

Multiple Choices

301

Moved Permanently

302

Found

303

See Other

304

Not Modified

305

Use Proxy

307

Temporary Redirect

400

Bad Request

401

Unauthorized

402

Payment Required

403

Forbidden

404

Not Found

405

Method Not Allowed

406

Not Acceptable

407

Proxy Authentication Required

408

Request Timeout

409

Conflict

410

Gone

411

Length Required

412

Precondition Failed

413

Request Entity Too Large

414

Request-URI Too Long

415

Unsupported Media Type

416

Requested Range Not Suitable

417

Expectation Failed

500

Internal Server Error

501

Not Implemented

502

Bad Gateway

503

Service Unavailable

504

Gateway Timeout

505

HTTP Version Not Supported



备注

以长整形数字来表示当前请求的http状态,此属性仅当数据发送并接收完毕后才可获取。 而且,仅当readyState值为3(正在接收中)或4(已加载)时,这个status属性才可用。当readyState的值小于3时试图存取status的值将引发一个异常。

版本
MSXML 2.0及以上版本

statusText属性

返回当前请求的响应状态代码描述,字符串类型,只读。

语法
strValue = oXMLHttpRequest.statusText

示例

Dim xmlhttp As New Msxml2.XMLHTTP30
xmlhttp.open "GET", "http://localhost/books.xml", False
xmlhttp.send
MsgBox xmlhttp. statusText

备注

以BSTR返回当前请求的响应状态代码描述,此属性仅当数据发送并接收完毕后才可获取,即仅当readyState值为3或4才可用。当readyState为其它值时试图存取statusText属性将引发一个异常。

版本
MSXML 2.0及以上版本

转自:http://metrom.blog.163.com/blog/static/20298163200911301081910/

[ 本帖最后由 Dillon 于 2011-6-2 10:29 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-6-1 23:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
还有没?

TA的精华主题

TA的得分主题

发表于 2011-6-2 00:02 | 显示全部楼层
转帖吧,标明下出处,不然被作者看到要说了。
不过还是谢谢分享。

TA的精华主题

TA的得分主题

发表于 2011-6-2 05:50 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-2 10:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 xmyjk 于 2011-6-2 00:02 发表
转帖吧,标明下出处,不然被作者看到要说了。
不过还是谢谢分享。


好的,我已标明出处,但,无法保证,这个博客就是原作者,如果,哪位知道原作者的链接,我再改。谢谢。

TA的精华主题

TA的得分主题

发表于 2011-8-29 17:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-9-10 14:54 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 20:47 , Processed in 0.038783 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表