談XMLHTTP對(duì)象(屬性和方法)-VBA抓取網(wǎng)頁(yè)數(shù)據(jù)_第1頁(yè)
談XMLHTTP對(duì)象(屬性和方法)-VBA抓取網(wǎng)頁(yè)數(shù)據(jù)_第2頁(yè)
談XMLHTTP對(duì)象(屬性和方法)-VBA抓取網(wǎng)頁(yè)數(shù)據(jù)_第3頁(yè)
談XMLHTTP對(duì)象(屬性和方法)-VBA抓取網(wǎng)頁(yè)數(shù)據(jù)_第4頁(yè)
談XMLHTTP對(duì)象(屬性和方法)-VBA抓取網(wǎng)頁(yè)數(shù)據(jù)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、用VBA抓取網(wǎng)頁(yè)數(shù)據(jù)有不少方法,其中一種便是引用XMLHTT對(duì)象。在這里嘗試 為大家介紹一下這個(gè)對(duì)象的一些基本屬性和方法還有一些應(yīng)用示例。XMLHTT對(duì)象參考IXMLHTTPRequest 提供客戶端同 http 服務(wù)器通訊的協(xié)議示例以下示例建立一個(gè)XMLHTT對(duì)象,并向http服務(wù)器發(fā)出指定地址的請(qǐng)求,請(qǐng)求 返回XML的源文件(XML document),如果服務(wù)器不能連通,則返回錯(cuò)誤。Dim HttpReq As ObjectSet HttpReq = CreateObject("MSXML2.XMLHTTP.3.0")HttpReq.open "GET&qu

2、ot;, "http:/ ajaxServer.aspx", FalseHttpReq.sendMsgBox HttpReq.responseText說明:第一,二行可以用以下語(yǔ)句代替, 但前提是需要在對(duì)象里先引用 Microsoft XML,v2.6-6.0(msxml2.dll, msxml3.dll, msxml4.dll, msxml5.dll, msxml6.dll) 其中之一。Dim HttpReq As New MSXML2.XMLHTTP30備注客戶端可以通過XmlHttp對(duì)象(MSXML2.XMLHTTP.3.C向http服務(wù)器發(fā)送請(qǐng)求并 使用微軟 XML

3、文檔對(duì)象模型 Microsoft? XML Document Object Model (DOM) 處 理回應(yīng)。該對(duì)完全象集成了 Microsoft XMLCore Services (MSXML,) 支持直接發(fā)送請(qǐng)求, 并用 MSXMDO斶析響應(yīng)。由于集成了對(duì) Extensible Stylesheet Language (XSL) 的支持,XMLHTT寸象組件提供一個(gè)很簡(jiǎn)易的途徑向 HTTP服務(wù)器發(fā)送一個(gè)結(jié)構(gòu)化 查詢,并支持用多種形式有效顯示結(jié)果。通常的使用順序是,先用open方法,再用send方法發(fā)送請(qǐng)求,然后用 setRequestHeader 方法設(shè)置自定義頭信息,最后查看四種以不同

4、形式返回的響 應(yīng)結(jié)果。XMLHTT對(duì)象支持 Microsoft In ternet 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 (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 *指定當(dāng) readyState 屬性改變時(shí)的事件處理句柄。 會(huì)觸發(fā)這個(gè)事件處理器只寫 . 每個(gè)狀態(tài)改變時(shí)都readyState返回當(dāng)前請(qǐng)求的狀態(tài),只讀 .responseBody將回應(yīng)信息正文以 unsigned byte 數(shù)組形式返回

6、. 只讀responseStream以 Ado Stream 對(duì)象的形式返回響應(yīng)信息。只讀responseText將響應(yīng)信息作為字符串返回 . 只讀responseXML將響應(yīng)信息格式化為 Xml Document 對(duì)象并返回,只讀status返回當(dāng)前請(qǐng)求的 http 狀態(tài)碼 . 只讀statusText返回當(dāng)前請(qǐng)求的響應(yīng)行狀態(tài),只讀*表示此屬性是W3C文檔對(duì)象模型的擴(kuò)展.在VBA中不能直接調(diào)用方法abort 取消當(dāng)前請(qǐng)求 getAllResponseHeaders 獲取響應(yīng)的所有 http 頭 getResponseHeader從響應(yīng)信息中獲取指定的 http 頭創(chuàng)建一個(gè)新的http請(qǐng)求,并

7、指定此請(qǐng)求的方法、 URL以及驗(yàn)證信息(用戶 open名/ 密碼 )sendsetRequestHeaderreadyState屬性發(fā)送請(qǐng)求到 http 服務(wù)器并接收回應(yīng) 單獨(dú)指定請(qǐng)求的某個(gè) http 頭返回XMLHTT請(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)。這樣以來,腳本才正確響應(yīng)各種狀態(tài) -XMLHttpRequest 對(duì)象擁有一個(gè)描述對(duì)象的當(dāng)前狀 態(tài)的 readyState 屬性。語(yǔ)法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備注此屬性只讀,狀態(tài)用長(zhǎng)度為 4 的整型表示 (4-byte integer). 定義如下:0" 未初始化 " 狀

9、態(tài)。此時(shí),已經(jīng)創(chuàng)建一個(gè) XMLHttpRequest 對(duì)象,但是還沒有初始化(即還沒調(diào)用open 方法)。" 初始化 " 狀態(tài)。此時(shí),已經(jīng)調(diào)用 open 方法 , 并且 XMLHttpRequest 對(duì)象已經(jīng)準(zhǔn)備好把一個(gè)請(qǐng)求發(fā)送 1到服務(wù)器,但還沒調(diào)用 send 方法。"發(fā)送"狀態(tài)。此時(shí),已經(jīng)調(diào)用 send 方法,把一個(gè)請(qǐng)求發(fā)送到服務(wù)器端, 但是還沒有收到一個(gè)響應(yīng), 2即是當(dāng)前的狀態(tài)及 http 頭部信息未知。"正在接收”狀態(tài)。此時(shí),已經(jīng)接收到 HTTP響應(yīng)頭部信息,但是消息體部分還沒有完全接收結(jié)束,3 這時(shí)通過 responseBody 和

10、responseText 獲取部分?jǐn)?shù)據(jù)會(huì)出現(xiàn)錯(cuò)誤。4 數(shù)據(jù)接收完畢 , 此時(shí)可以通過通過 responseBody 和 responseText 獲取完整的回應(yīng)數(shù)據(jù)Note從 MSXML 3.0 開始,如果在數(shù)據(jù)還沒有加載完畢(例如,在加載狀態(tài)或交互式狀態(tài))前就讀取status屬性,則會(huì)返回一個(gè)錯(cuò)誤信息:"The data necessary to complete this operation is not yetavailable."版本MSXML 2.0 及以上版本responseBody 屬性以未解碼的二進(jìn)制數(shù)組形式返回HTTP服務(wù)器響應(yīng)數(shù)據(jù)語(yǔ)法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從服務(wù)器返回一個(gè)二 進(jìn)制數(shù)組,即一個(gè)類型為 VT_ARRAY | VT_UI1的安全數(shù)組(SAFEARRAY來表示返 回?cái)?shù)據(jù)的實(shí)體。 他包含了從服

12、務(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)換來解碼, 否則會(huì)發(fā)生亂碼。 如 以下程序會(huì)發(fā)生中文亂碼:Dim xmlhttp As New Msxml2.XMLHTTP50 xmlhttp.open "GET", "http:/localhost/test.

13、xml", False xmlhttp.sendMsgBox xmlhttp.responseBody以下為編碼轉(zhuǎn)換函數(shù):Function bytes2BSTR(arrBytes) ' 編碼轉(zhuǎn)換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以下程序不會(huì)發(fā)生亂碼了: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 對(duì)象的形式返回響應(yīng)信息語(yǔ)法strValue = oXMLHttpRequest.responseStream;備注返回值為Variant類型,只讀。XMLHTT的responseStream從服

16、務(wù)器返回一數(shù) 據(jù)流入 stream (IStream )。該包含了從服務(wù)器返回的未經(jīng)解碼的二進(jìn)制數(shù)據(jù), 因此,基于請(qǐng)求不同的服務(wù)器, 最終會(huì)顯示不同的二進(jìn)制編碼數(shù)據(jù) (UTF- 8, UCS-2, UCS-4, Shift_JIS 等等 )。如果請(qǐng)求的網(wǎng)頁(yè)的數(shù)據(jù)編碼不是二進(jìn)制,則會(huì)發(fā)生亂 碼。版本MSXML 2.0及以上版本responseText 屬性以字符串形式返回響應(yīng)信息(即我們通常見到的網(wǎng)頁(yè)源文件)語(yǔ)法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嘗試將響應(yīng)信息解碼為 Unicode字符串,XMLHTT默認(rèn)將響應(yīng)數(shù)據(jù)的編碼定為UTF-8,如果服務(wù)器返回的數(shù)據(jù)是匹配的 Unicode BOM(byte-order mark) 編碼,XMLHTT可以解碼任何 UCS-2 (big or little endian)或者UCS-4數(shù)據(jù)。注意,如果服務(wù)器返回的是xml文檔,此屬性并不處理 xml文檔中

18、的編碼聲明。你需要使用responseXML來處理。這個(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)信息。版本MSXML 2.0 及以上版本respo nseXML 屬性以Xml Document對(duì)象形式返回將響應(yīng)信息語(yǔ)法Set objDispatch = oXMLHttpRequest.respo nseXML示

19、例Dim xmlhttp As New Msxml2.XMLHTTP30xmlhttp.sendMsgBox xmlhttp.responseXML.xml備注此屬性只讀,將響應(yīng)信息格式化為Xml Document對(duì)象并返回。如果響應(yīng)數(shù)據(jù)不是有效的XML文檔,此屬性本身不返回XMLDOMParseErro,可以通過處理過的 DOMDocumen對(duì)象獲取錯(cuò)誤信息。此responseXML屬性用于當(dāng)接收到完整的 HTTP響應(yīng)時(shí)(readyState 為4)描述XML卩向應(yīng);如果響應(yīng)實(shí)體不是 有效的 xml 格式,則返回錯(cuò)誤。無(wú)論何時(shí),只要 readyState 值不為 4,那么該 response

20、XML 的值也會(huì)返回 null 。如果Content-Type頭部并不包含以下這些媒體類型之一:Content-Type頭部指定MIME媒體)類型為text/xml , application/xml 或以 +xml 結(jié)尾,例如, "application/rss+xml" ,那么 responseXML 的值為 null 。其實(shí),這個(gè) responseXML 屬性值是一個(gè)文檔接口類型的對(duì)象,用來描述被分析的文檔。如果文檔不能被分 析( 例如,如果文檔不是良構(gòu)的或不支持文檔相應(yīng)的字符編碼 ) ,那么 responseXML 的值將為 null版本MSXML 2.0 及以上版

21、本status返回當(dāng)前請(qǐng)求的 http 狀態(tài)碼,長(zhǎng)整型,只讀語(yǔ)法lValue = oXMLHttpRequest.status;示例Dim xmlServerHttp As New Msxml2.ServerXMLHTTP30 xmlServerHttp.open "GET", "http:/localhost/books.xml", False xmlServerHttp.sendMsgBox xmlServerHttp.status返回值長(zhǎng)整形標(biāo)準(zhǔn)http 狀態(tài)碼,定義如下:狀態(tài)碼描述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. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論