用VBA抓取網(wǎng)頁(yè)數(shù)據(jù)有不少方法,,其中一種便是引用XMLHTTP對(duì)象,。在這里嘗試為大家介紹一下這個(gè)對(duì)象的一些基本屬性和方法還有一些應(yīng)用示例。 XMLHTTP對(duì)象參考 IXMLHTTPRequest 提供客戶端同http服務(wù)器通訊的協(xié)議 示例 以下示例建立一個(gè)XMLHTTP對(duì)象,,并向http服務(wù)器發(fā)出指定地址的請(qǐng)求,,請(qǐng)求返回XML的源文件(XML document),如果服務(wù)器不能連通,,則返回錯(cuò)誤,。 Dim HttpReq As Object Set HttpReq = CreateObject("MSXML2.XMLHTTP.3.0") HttpReq.open "GET", "http:// ajaxServer.aspx", False HttpReq.send MsgBox HttpReq.responseText 說(shuō)明:第一,二行可以用以下語(yǔ)句代替,,但前提是需要在對(duì)象里先引用Microsoft XML,v2.6-6.0(msxml2.dll, msxml3.dll, msxml4.dll, msxml5.dll, msxml6.dll)其中之一,。 Dim HttpReq As New MSXML2.XMLHTTP30 備注 客戶端可以通過(guò)XmlHttp對(duì)象(MSXML2.XMLHTTP.3.0)向http服務(wù)器發(fā)送請(qǐng)求并使用微軟XML文檔對(duì)象模型Microsoft® XML Document Object Model (DOM)處理回應(yīng)。 該對(duì)完全象集成了Microsoft XML Core Services (MSXML),,支持直接發(fā)送請(qǐng)求,,并用MSXML DOM分析響應(yīng)。由于集成了對(duì)Extensible Stylesheet Language (XSL)的支持,,XMLHTT對(duì)象組件提供一個(gè)很簡(jiǎn)易的途徑向HTTP服務(wù)器發(fā)送一個(gè)結(jié)構(gòu)化查詢,,并支持用多種形式有效顯示結(jié)果。 通常的使用順序是,,先用open 方法,再用send方法發(fā)送請(qǐng)求,,然后用setRequestHeader方法設(shè)置自定義頭信息,,最后查看四種以不同形式返回的響應(yīng)結(jié)果。 XMLHTTP對(duì)象支持Microsoft Internet Explorer (IE) 5.0 及以上版本,,只要你的網(wǎng)頁(yè)瀏覽器指定一種語(yǔ)言進(jìn)行瀏覽,。更詳細(xì)的信息請(qǐng)查看Explorer的幫助文件關(guān)于"To specify another language for Web page content" 的部份。 版本 MSXML 2.0及以上版本 先決條件 如果不用CreateObject方法創(chuàng)建對(duì)象,,則需要先引用以下任意一個(gè)版本的文件: 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成員 屬性
* 表示此屬性是W3C文檔對(duì)象模型的擴(kuò)展.在VBA中不能直接調(diào)用 abort 取消當(dāng)前請(qǐng)求 getAllResponseHeaders 獲取響應(yīng)的所有http頭 getResponseHeader 從響應(yīng)信息中獲取指定的http頭 open 創(chuàng)建一個(gè)新的http請(qǐng)求,,并指定此請(qǐng)求的方法,、URL以及驗(yàn)證信息(用戶名/密碼) send 發(fā)送請(qǐng)求到http服務(wù)器并接收回應(yīng) setRequestHeader 單獨(dú)指定請(qǐng)求的某個(gè)http頭 readyState屬性 返回XMLHTTP請(qǐng)求的當(dāng)前狀態(tài)
此屬性只讀,返回值為4字節(jié)的長(zhǎng)整型(具體值請(qǐng)看備注)
當(dāng)XMLHttp對(duì)象把一個(gè)HTTP請(qǐng)求發(fā)送到服務(wù)器時(shí)將經(jīng)歷若干種狀態(tài):一直等待直到請(qǐng)求被處理,;然后,,它才接收一個(gè)響應(yīng)。這樣以來(lái),,腳本才正確響應(yīng)各種狀態(tài)-XMLHttpRequest對(duì)象擁有一個(gè)描述對(duì)象的當(dāng)前狀態(tài)的readyState屬性,。
strValue = oXMLHttpRequest.readyState;
此屬性只讀,,狀態(tài)用長(zhǎng)度為4的整型表示(4-byte integer).定義如下:
版本 MSXML 2.0及以上版本 responseBody屬性 以未解碼的二進(jìn)制數(shù)組形式返回HTTP服務(wù)器響應(yīng)數(shù)據(jù),。 語(yǔ)法 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從服務(wù)器返回一個(gè)二進(jìn)制數(shù)組,,即一個(gè)類型為VT_ARRAY | VT_UI1*的安全數(shù)組(SAFEARRAY)來(lái)表示返回?cái)?shù)據(jù)的實(shí)體,。他包含了從服務(wù)器返回的未經(jīng)解碼的二進(jìn)制數(shù)據(jù),因此,,基于請(qǐng)求不同的服務(wù)器,,最終 會(huì)顯示不同的二進(jìn)制編碼數(shù)據(jù)(UTF-8, UCS-2, UCS-4, Shift_JIS等等)。 *VT_UI1:無(wú)符號(hào)1字節(jié)整數(shù)(BYTE)數(shù)組 當(dāng)Variant的數(shù)據(jù)類型為VT_ARRAY | VT_UI1時(shí),,返回一個(gè)SAFEARRAY安全數(shù)組 如果想返回解碼后的數(shù)據(jù)實(shí)體則需要進(jìn)行編碼轉(zhuǎn)換來(lái)解碼,,否則會(huì)發(fā)生亂碼。如以下程序會(huì)發(fā)生中文亂碼: Dim xmlhttp As New Msxml2.XMLHTTP50 xmlhttp.open "GET", "http://localhost/test.xml", False xmlhttp.send MsgBox xmlhttp.responseBody 以下為編碼轉(zhuǎn)換函數(shù): Function bytes2BSTR(arrBytes) '編碼轉(zhuǎn)換 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 以下程序不會(huì)發(fā)生亂碼了: Dim xmlhttp As New Msxml2.XMLHTTP50 xmlhttp.open "GET", "http://localhost/test.xml", False xmlhttp.send MsgBox bytes2BSTR(xmlhttp.responseBody) 版本 MSXML 2.0及以上版本 responseStream屬性 以字符串形式返回響應(yīng)信息(即我們通常見到的網(wǎng)頁(yè)源文件)
strValue = oXMLHttpRequest.responseText;
Dim xmlhttp As New Msxml2.XMLHTTP30 xmlhttp.open "GET", "http://localhost/test.xml", False xmlhttp.send MsgBox xmlhttp.responseText
返回值為String類型,此屬性只讀,。
這個(gè)responseText屬性包含客戶端接收到的HTTP響應(yīng)的文本內(nèi)容,。當(dāng)readyState值為0,、1或2時(shí),responseText包含一個(gè)空字符串,。當(dāng)readyState值為3(正在接收)時(shí),,響應(yīng)中包含客戶端還未完成的響應(yīng)信息。當(dāng)readyState為4(已加載)時(shí),,該responseText包含完整的響應(yīng)信息,。
以Xml Document對(duì)象形式返回將響應(yīng)信息
Set objDispatch = oXMLHttpRequest.responseXML
Dim xmlhttp As New Msxml2.XMLHTTP30 xmlhttp.open "GET", "http://localhost/test.xml", False xmlhttp.send MsgBox xmlhttp.responseXML.xml
此屬性只讀,將響應(yīng)信息格式化為Xml Document對(duì)象并返回,。如果響應(yīng)數(shù)據(jù)不是有效的XML文檔,此屬性本身不返回XMLDOMParseError,,可以通過(guò)處理過(guò)的DOMDocument對(duì)象獲取錯(cuò)誤信息,。
此responseXML屬性用于當(dāng)接收到完整的HTTP響應(yīng)時(shí)(readyState為4)描述XML響應(yīng);如果響應(yīng)實(shí)體不是有效的xml格式,,則返回錯(cuò)誤,。無(wú)論何時(shí),只要readyState值不為4,,那么該responseXML的值也會(huì)返回null,。
如果Content-Type頭部并不包含以下這些媒體類型之一:Content-Type頭部指定MIME(媒體)類型為text/xml,application/xml或以+xml結(jié)尾,,例如,,"application/rss+xml",那么responseXML的值為null,。
其實(shí),,這個(gè)responseXML屬性值是一個(gè)文檔接口類型的對(duì)象,,用來(lái)描述被分析的文檔。如果文檔不能被分析(例如,,如果文檔不是良構(gòu)的或不支持文檔相應(yīng)的字符編碼),,那么responseXML的值將為null。
|
|
來(lái)自: zele > 《Internet》