設為首頁收藏本站|繁體中文

Excel 技巧網

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

手機號碼,快捷登錄

查看: 50431|回復: 94
打印 上一主題 下一主題

[Excel VBA] VBA的WEB應用系列教程——HTTP通訊基礎篇

  [復制鏈接]

ET圖書作者

跳轉到指定樓層
樓主
發表于 2012-7-24 21:49:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  • 網站名稱: Excel技巧網 | Excel專家棲息谷 | 微軟中文技術社區合作伙伴
  • 署名作者: xmyjk
  • 版權聲明: 版權歸本站與作者共有 除本站官方外非作者本人轉載須經許可并注明出處
  • 本文來自:
  • 引用作品:
  • 適用版本: 2013 2010 2007 2003以前版本 
  • 語言環境: 簡體中文
  • 學習方法: 掌握Excel技巧的關鍵是動手操作 | 下載 ≠ 知識


  • 免費注冊成為本站會員,享用更多功能,結識更多Office辦公高手!

    您需要 登錄 才可以下載或查看,沒有帳號?注冊

    x
    本帖最后由 xmyjk 于 2012-7-24 22:10 編輯

    VBA的WEB應用教程,預計按以下幾方面進行發布,敬請期待:

    (1)HTTP通訊基礎篇:主講INTERNET通訊基礎知識、網絡數據包構成、HTTP協議簡介、收發包工具使用技巧和初步在VBA中進行收發包。
    基礎篇.zip (209.38 KB, 下載次數: 1465)

    (2)網頁元素分析基礎篇:主講XHTML元素基礎知識、HTML DOM基礎知識、網頁元素分析工具使用技巧和初步使用VBA進行網頁操控。

    (3)QUERYTABLE篇:主要介紹EXCEL自帶導入網頁數據對象QUERYTABLE的主要屬性和方法,如何運用它導入網頁數據。

    (4)抓包控件篇:主講XMLHTTP、WINHTTP、inet控件和WINSOCK控件基礎知識、運用技巧和程序模板。

    (5)頁面控制和數據提取篇:主講WEBBROWSER控件的基礎知識和頁面控制技巧,講解如何從網頁頁面上提取所需的表單數據,贈送程序模板。

    (6)文本處理和補遺篇:主講文本處理技巧、文本內碼轉換、URL內碼轉換、補充ADO Stream對象在WEB方面的應用、XML數據交互、WEB服務和服務器推送機制等知識補遺。

    (7)數據提取和數據防盜的博弈:主要介紹幾種常見的網絡數據防盜的情形,并探討如何破解思路。

    (8)JAVASCRIPT篇:高階教程,主要簡介JAVASCRIPT基礎知識,以及MSScriptControl對象主要屬性和方法,VBA如何解析json序列。

    以下開始第一篇的正文:

    評分

    參與人數 12技術分 +1 魅力值 +65 收起 理由
    Tomleej + 5 感謝幫助:)
    開心二點 + 5 **就是牛X
    zhengguide + 5 **!
    windimi007 + 5 思路巧妙:)
    NULL + 5 感謝幫助:)

    查看全部評分

    分享到:  QQ好友和群QQ好友和群
    收藏收藏41

    ET圖書作者

    推薦
     樓主| 發表于 2012-7-24 21:51:02 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:06 編輯

    (三)初識cookie和session

    由于第一節講了,網絡通訊是靜態的,http協議是無狀態的。它對于我們之前的所有通訊都沒有記憶能力。那出現的問題是,如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,就難以驗證用戶的權限和登錄問題。于是,兩種用于解決機制就產生了,就是Cookie和Session。

    Cookie是通過客戶端記錄通訊情況,其是由服務器發給客戶端的特殊信息,以文本文件的方式存放在我們的電腦上(WINDOWS系統哈,瀏覽器會將這些信息存放在[系統盤]:\Documents and Settings\[用戶名]\Cookies目錄中),然后我們的瀏覽器每次向服務器發送請求的時候就會帶上這些特殊的信息。例如,當我們登錄網站時,服務器會發送一段cookie給我們,這就是我們在上面的響應階段所說的Set-Cookie頭部字段的功能,后續的通訊,在請求階段,就會使用cookie請求字段,發送這段文本,服務器收到了這段文本,就知道我們已經登錄了。


    另外一個解決方案是Session,它是通過服務器來記錄通訊情況。Session指的是服務器端為客戶端所開辟的存儲空間,在其中保存的信息就是用于保持狀態。當我們的瀏覽器首次訪問或者登錄服務器時,服務器就創建一個session,服務器會為該Session生成唯一的Session id,這個session id將從URL或者從cookie返回客戶端,以后的HTTP請求,從cookie或者URL附上Session id,服務器接受到請求之后就會依據Session id找到相應的Session,這樣,用戶的狀態也就記憶了。

    ET圖書作者

    2
     樓主| 發表于 2012-7-24 21:49:50 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:13 編輯

    WORD版開放下載,懶得看帖子直接下載吧。 課程一.zip (209.38 KB, 下載次數: 393)

    一、網絡通信基礎知識串講

           網絡通俗的說,是能上網的計算機的集合。計算機彼此不同,它們如何進行通訊呢,通過什么規則來通信呢。通過TCP/IP等標準協議,它允許我們的電腦,通過互聯網直接和另一臺電腦進行通訊。請注意,TCP/IP一般只是底層協議(傳輸層),可以簡單理解為它只是提供計算機設備之間的底層通訊接口,其他例如軟件方面的對接,還需要高層協議,后面我們會講到。

          有了通訊的規則,那計算機硬件方面是怎么互相識別呢。他們是通過數字地址,即我們通常說的IP,就像百度的IP就是119.75.217.56,我們可以在瀏覽器地址欄鍵入119.75.217.56也可以對百度進行訪問。這一串數字實在不好記啊,所以就有了域名, www.baidu.com。用域名通訊的時候,域名要先經過互聯網上的域名服務器(DNS)進行轉換,轉成IP地址,再進行訪問。

          網絡上的兩臺計算機通訊,很多情況,一臺是我們這些客戶機,另外一臺是提供信息的服務器。客戶機需要瀏覽網頁資訊的時候,是通過我們機子上安裝的瀏覽器,例如IE、FIREFOX等,向服務器發送請求,服務器響應瀏覽器的請求,將相關的信息回傳給我們的瀏覽器,瀏覽器進行識別和翻譯,展現出來大量的文本或圖片等,來供我們查看。

          請注意,一般而言,通訊是靜態的。服務器在等待瀏覽器的請求之前,是不會主動做任何事情的。現在頁面很多動態實時的效果,其實還是我們瀏覽器,不停的向服務器發送請求,服務器返回消息再更新頁面的結果,例如AJAX技術;或者是首次請求后,通訊并沒有斷開,服務器源源不斷的往瀏覽器發送更新數據,這就是傳說中的長連接技術。

          服務器能識別我們的請求,我們的瀏覽器,也能翻譯或解釋那些服務器返回的數據或文檔,那彼此之間的通訊格式,還需要一個協議去規范的。這就是我們常說的超文本傳輸協議——HTTP。HTTP協議就是用于客戶端和服務器之間的文檔或數據的交互的。請注意,這里的文檔指的不僅是文本,還可能是圖片、視頻或音頻,或者是指向到其他文檔的嵌入式鏈接,因此叫超文本。

          一般情況,當我們的瀏覽器,通過域名,訪問了某個服務器,一般會進到服務器的門戶主頁面中。當我們點擊門戶頁面的某個超鏈接或者點擊某個提交按鈕后,要求服務器進一步返回我們需要的某個資源文檔,或者執行我們提交給它的某些命令時(例如成績查詢)。其實,我們剛才點擊的超鏈接或按鈕,就蘊含著我們要獲取的文檔或者執行程序的路徑,這個路徑統稱URL——統一資源定位符。

          HTTP通訊中,這個路徑的格式一般為:HTTP://域名:端口/文檔或程序的全路徑?參數。端口就是服務器某個特定進程來處理客戶端發來的消息,默認為80,可以先不用去理解這個名詞。文檔或程序路徑是相對路徑。服務器也是一臺計算機,上面除了存放資源文件,還存放著維護服務器的軟件,因此資源文檔可能并不存放在其根目錄上。例如,可能我們的資源文檔根目錄是服務器上/admin/web這個目錄,那http://域名/news/weather.html其實訪問的就是服務器根目錄下/admin/web/news/weather.html這個文件。最后的?參數,是可選的,用于傳遞瀏覽器向服務器發送的請求參數,可有多個參數,用“&”符號隔開,每個參數的名和值用“=”符號隔開,例如:http://www.baidu.com/s?ie=utf-8&wd=蘋果,就是瀏覽器向百度服務器發送查詢參數,查詢關鍵字是蘋果的數據,并請求按utf-8的內碼進行返回。請注意,URL里面有時候是不支持英文和數字以外的字符的,這時候就需要URLENCODE的函數去轉換了,后話,以后會講。

          綜上所述,一句話而言,服務器接收瀏覽器發來的HTTP請求,并翻譯識別請求中的消息并進行權限校檢,進而識別請求中的URL并翻譯成服務器的一個文檔名稱(找到它并按請求的內容進行返回)或程序名稱(傳遞參數按請求的規定執行它并將結果返回)。

    ET圖書作者

    3
     樓主| 發表于 2012-7-24 21:50:08 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 21:58 編輯

    二、HTTP協議簡析

        基本上,大部分的web通訊,都是使用http協議。我們用下面的圖,復習下通訊的流程(客戶端發起請求,服務器回送響應):


    (1)首先客戶機與服務器建立連接。
    (2)建立連接后,客戶機通過HTTP協議發送一個請求給服務器。
    (3)服務器接到請求后,給予相應的響應信息。
    (4)客戶端接收服務器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客戶機與服務器斷開連接。

          從流程上,可以看出,它由請求和響應構成。通訊的每次請求或相應中,都包含著兩個部分:頭部和主體。頭部包含了構建通訊所需的信息/命令;主體包含了通信傳遞的數據,頭部和主體之間間隔一個VBCRLF。我們還是通過,FIDDLER這個抓包軟件來進行講解,請上http://www.fiddler2.com/Fiddler2/version.asp進行下載。

          舉例說明如下,請在瀏覽器地址欄鍵入:http://www.sgs.gov.cn/lz/etpsInfo.do?method=index,出現企業登記信息查詢的頁面,選擇按注冊號查詢,并將310115000909792輸入至下方的文本框中。如圖所示:


          這時,我們先打開FIDDLER,然后再按下網頁的搜索按鈕。這樣,FIDDLER就可以捕捉到,執行搜索的HTTP請求,還能截取到查詢結果的響應消息。我們分階段進行解析。

    ET圖書作者

    4
     樓主| 發表于 2012-7-24 21:50:25 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:42 編輯

    (一)請求階段

        如圖操作,選擇第一條記錄,有時候就是發送查詢命令的HTTP請求。選擇左邊的INSPECTORS的RAW標簽,就可以看見HTTP請求的內容。


    請求代碼如下:
    POST http://www.sgs.gov.cn/lz/etpsInfo.do?method=doSearch HTTP/1.1
    Host: www.sgs.gov.cn
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    DNT: 1
    Connection: keep-alive
    Referer: http://www.sgs.gov.cn/lz/etpsInfo.do?method=index
    Cookie: JSESSIONIDlz=00002DNpApMXAw1wHVO0vSgVGuf:16f9u5edl; JSESSIONID=0000g4T4RXnmmvxkZ2Vi0rZy3fM:132eapo0d
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 37

    searchType=2&keyWords=310115000909792

        實際情況中,有可能會看到一系列的發包記錄,那實際的獲取數據的發包請求又是哪一條呢?一般不用一個個記錄去看,我們可以選取結果頁面的一個標識語句(例如“搜索結果”啊,“注冊成功”啊,這樣的標示語句),在FIDDLER界面按住CTRL+F,會出現查找功能的界面,然后鍵入我們要查找的標識,如圖,就可以搜索出到底是哪條記錄。


    從上面的RAW標簽,可以看出,HTTP請求的通用格式:
            HTTP方法 URL或URL的路徑部分 HTTP協議版本
            頭部字段
            回車換行
            消息主體

        下面按照該格式的每個條目進行解釋:
        1、首行的HTTP方法,就是請求的方法,總共有5種,但是常用的就GET和POST,GET是索取數據的請求,要求服務器返回URL指定的文檔內容,或返回URL指定的數據處理過程的結果所指向的文檔,是最常見的。POST是向服務器提交數據的請求,要求服務器接收并利用隨附的消息主體的數據,來執行某個程序或獲取文檔,通常用于瀏覽器向服務器發送表單數據,例如提交注冊信息,或者進行數據查詢等。所以,如果采用GET方式,一般消息主體為空,采用POST方式的話,一般就有相應的消息主體。

        請注意,并不意味著采用GET方式就不能攜帶數據了,上一節我們說了,URL是可以攜帶我們需要傳遞給服務器的參數的。例如http://www.baidu.com/s?wd=蘋果。可有多個參數,用“&”符號隔開,每個參數的名和值用“=”符號隔開。

        那既然GET方式也可以攜帶參數,那兩者區別又是什么呢?一是安全性,GET方式參數就在URL,提交的是密碼等私密資料就不合適用GET;二是,GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。三是,GET一般不能改變服務器的數據,而POST可以改變服務器的數據,例如注冊了個用戶,服務器就多了數據條目。

        2、頭部字段,頭部字段主要描述的是我們的請求的內容,絕大部分是可選的。格式為“字段名稱:字段值”,以下列舉幾個常用又比較重要的頭部字段吧,其他請自行參閱HTTP協議:

          2.1 host字段:該字段指定請求資源的Intenet主機和端口號,即URL的域名部分,HTTP/1.1請求必須包含該字段。

          2.2 Referer字段:Referer字段值,就是我們發起HTTP請求時的那個頁面URL,是用來控制盜鏈的一種方式。

          2.3 User-Agent字段:該字段的內容包含發出請求的用戶信息(瀏覽器和系統等消息)。有時候也會作為放盜的一種方式,更多用來服務器判定依據不同用戶系統情況,返回不同的兼容文檔。

          2.4 Cache-Control字段:用來指定請求遵循的緩存機制。包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached等。

          2.5 Cookie字段:這是比較重要的請求頭信息之一;這個我們后面詳細說,先跳過。

          2.6 If-Modified-Since字段:所請求的頁面在客戶端的緩存中的最近更新時間;

          2.7 Pragma字段:指定“no-cache”值表示服務器必須返回一個刷新后的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝;

          2.8 Content-Type字段: 在使用POST方式的時候,這個字段非常關鍵,用來標識后附的消息主體的類型。作為抓包愛好者,理解不了就算了,寫程序的時候,直接抄襲抓包軟件看到的,例如上面例子的是“application/x-www-form-urlencoded”。一般POST方式,這句較少省略,如果不附上,就得不到正確的數據結果。

          2.9 Content-Length字段:表示HTTP請求的消息主體的文本長度

          2.10 If-None-Match字段:后面儲存的是客戶端讀取的緩存中頁面的緩存檢驗值,后面緩存中再講;

    (3)當采用POST方式,就會攜帶消息主體了,這時,頭部和主體之間的回車換行的標示符號,就必不可少了。主體就是請求通信傳遞的數據,上例中的主體內容“searchType=2&keyWords=310115000909792”就是傳遞我們查詢所需的注冊號和查詢方式(按注冊號查詢)等參數,和GET方式一樣,可有多個參數,用“&”符號隔開,每個參數的名和值用“=”符號隔開。

          請注意,發包的整個過程,例如消息主體,都不支持英文和數字以外的字符,如果要寫入中文或特殊字符,就需要URLENCODE的函數進行轉碼了。后話,心急的讀者自行百度,VBA URLENCODE。

    ET圖書作者

    5
     樓主| 發表于 2012-7-24 21:50:44 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:05 編輯

    (二)響應階段
        當我們發送請求后,服務器處理完我們的請求,就會向我們的瀏覽器,發送響應消息了。FIDDLER中,響應消息就在請求消息的下面,一樣看RAW標簽,如圖:



    HTTP/1.0 200 OK
    Date: Sun, 22 Jul 2012 06:46:31 GMT
    Server: IBM_HTTP_Server
    Content-Length: 8292
    Content-Type: text/html; charset=UTF-8
    Content-Language: zh-CN
    Age: 312
    X-Cache: MISS from WebAudit
    Connection: keep-alive

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    ………

    HTTP響應消息的格式如下所示:
    &#61656;        狀態行
    &#61656;        頭部字段
    &#61656;        回車換行
    &#61656;        實體內容

    1、        狀態行 = HTTP協議 [空格] 狀態碼 [空格] 狀態解釋 [回車換行]
    狀態碼常見的就是,200成功、400錯誤請求(一般我們是發送的請求有問題)、500服務器錯誤,其余不說明了,自行搜索百度哈。

    2、        頭部字段
    響應階段的頭部字段主要描述的是服務器響應的情況。最常見的頭部字段如下:
      
      2.1 Content-Type:表示后面的文檔屬于什么類型;
      
      2.2 Expires:指明應該在什么時候認為文檔已經過期,從而不再緩存它。
      
      2.3 Last-Modified:文檔在服務器上最后更新時間。同緩存一起保存這個值,當再次訪問該頁面,在請求的頭部字段的If-Modified-Since中再次攜帶這個時間值發送至服務器,如果服務器此時的文檔更新時間晚于該時間,返回新頁面數據,否則返回一個304(Not Modified)狀態,并加載緩存數據進行顯示;
      
      2.4 Set-Cookie: 服務器向客戶端發送的cookie,cookie后面簡析。
      
      2.5 ETag:一段文本,一般也是用于緩存是否更新的判斷的校檢值,當首次訪問頁面時候,獲取這個值,同緩存一起保存,當再次訪問時候,請求階段的If-None-Match字段就會再次攜帶這段校檢值發送至服務器,服務器判斷ETag校檢值是否變化,變化則返回新的頁面數據,無變化則返回304,讀取緩存數據顯示。

    3、 和請求階段一樣,頭部和實體之間用回車換行符間隔,后面的實體,就是服務器返回的網頁的源代碼了。視服務器文檔情況,大部分情況是html格式的,這個東東,我們第二節課再講咯。

    ET圖書作者

    7
     樓主| 發表于 2012-7-24 21:51:20 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:07 編輯

    (四)初識緩存(cache)

    緩存(cache)保存在客戶端上的。當我們首次訪問某個頁面時,瀏覽器會自動保存這個頁面的部分內容,例如html頁面,圖片等,當下一次再次訪問時,緩存直接使用之前保存的數據響應訪問請求,而不是向服務器再次發送請求。這樣大大的節約了訪問的時間。

    一般緩存判斷的常見流程如下:客戶端首次訪問服務器后,服務器會返回該頁面的Last-Modified或ETag字段值,客戶端將該頁面數據保存在cache中,并記錄這兩個屬性。當客戶端再次訪問這個頁面,請求階段的消息,會在If-Modified-Since(對應Last-Modified)或If-None-Match(對應ETag)兩個字段中攜帶之前在cache中保存的Last-Modified或ETag的屬性值。服務器通過判斷這個兩個屬性,判斷頁面是否發生變化,如無變化,客戶端不需要重新下載,返回304響應。

    其他的判斷方式還有使用Expires的頭部字段,該字段給了一個文檔的有效期,過了這個有效期,就必須重新下載。

    ET圖書作者

    8
     樓主| 發表于 2012-7-24 21:51:36 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:08 編輯

    三、如何模擬HTTP請求

    (一)在FIDDLER中模擬

    在第二節的第一點,我們抓取了,用注冊號,查詢企業注冊信息的HTTP請求,我們怎么模擬它呢?可以在FIDDLER中進行模擬,首先復制一下,第二節第一點中,我們在INSPECTORS選項卡中ROW標簽得到的HTTP請求,然后選擇composer選項卡RAW標簽或者PARSED標簽,填入我們所要發送的HTTP請求,之前也所過了,很多字段其實是可選的,經過刪減測試,最終必須的字段如下圖:





    然后按右上的EXECUTE按鈕,就可以發送請求了,然后繼續在左邊界面和INSPECTORS選項卡中觀看是否成功。

    ET圖書作者

    9
     樓主| 發表于 2012-7-24 21:51:52 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:09 編輯

    (二)VBA中模擬

    當在FIDDLER中模擬成功后,我們就可以把相關的HTTP請求,在VBA中,套用在XMLHTTP對象上。后面的課程會詳細講這些對象的屬性和方法,本次僅是演示,代碼如下:
    1. Option Explicit
    2. Sub test()
    3.     With CreateObject("Microsoft.XMLHTTP")
    4.         .Open "POST", "http://www.sgs.gov.cn/lz/etpsInfo.do?method=doSearch", False
    5.         .setRequestHeader "content-type", "application/x-www-form-urlencoded"
    6.         .SEND "searchType=2&keyWords=310115000909792"
    7.         Debug.Print .responsetext
    8.     End With
    9. End Sub
    復制代碼
    上述代碼,僅僅模擬了HTTP請求的過程,在立即窗口輸出的是網頁的源代碼,后面還需加工處理,以后我們的課再說,其他有一定基礎的同學,可以運用正則等對象或文本處理函數,進行相關處理,獲取我們所需的東東。還有轉碼的東西,不要急,后面也會說。還有,我們的瀏覽器,是怎么把這一大堆源代碼,翻譯成直觀的東西的,下節課就會說了。

    不要小看上面這些通訊原理,沒有他們,是肯定沒法學好后面的內容的,特別是,網頁數據防盜的破解的。

    ET圖書作者

    10
     樓主| 發表于 2012-7-24 21:52:10 | 只看該作者
    本帖最后由 xmyjk 于 2012-7-24 22:10 編輯

    最后,小技巧,POST和GET不一定是絕對的,嘿嘿,有時候,POST的消息主體的內容,加個“?”號帶到URL后邊當參數,也是可以獲取正確的碼源的,呵呵。這個讀者自己去領悟吧,哈哈。上面那個案例是不行噢,只能POST,不能用http://www.sgs.gov.cn/lz/etpsInfo.do?method=doSearch& searchType=2&keyWords=310115000909792去get,我遇到很多情況是可以的,自己找其他頁面測試,哈。
    您需要登錄后才可以回帖 登錄 | 注冊

    本版積分規則

    關閉

    站長推薦上一條 /1 下一條

    Archiver|手機版|Excel技巧網 ( 閩ICP備08107682號-2

    GMT+8, 2020-1-20 08:42

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回復 返回頂部 返回列表
    国际冠军杯