遠程獲得服務器html文擋,並解析其內容(初步)

基本技術:  基於tcp協議的winsocket 通信    COM對象(具體就是MSHTML)

 

基本流程: 通過基於tcp協議的socket,與服務器端通信,用"get" 命令得到想要的html文檔.

                   然後通過使用MSHTML對象提供的接口,對目標文檔進行分析,提取相應元

                  素內容.ps:socket用的通信方式是阻塞式.

 

僞代碼:   WSAStartup()  (winsock網絡協議的初始化)

                                                    ||

           gethostbyname()  (對得到的域名進行解析,得到服務器的ip地址,端口一般是默認的80)   

                                                    ||                

               socket()  (創建連接通信用的SOCKET對象)

                                                    ||

                connect()     (通過socket對象連接服務器)

                                                    ||

           構造"get"包 (完整的get命令包的格式如下:GET   http://127.0.0.1/1.html )/r/n

                                                    ||

                                  send()    (向服務器發送請求包)     

                                                    ||

                          recv()   (得到服務器上指定文檔 ,並存入數據緩衝區)

                                                    ||

                    Shutdown() ; WSACleanup() (關閉連接,清除SOCKET資源)

                                                    ||

         CoInitialize()  (初始化COM庫,爲使用COM對象--MSHTML做準備,這個可以放到使用

                                       COM對象之前的任何地方)

                                                    ||
                          MSHTML::IHTMLDocument2Ptr pDoc;
                          MSHTML::IHTMLDocument3Ptr pDoc3;
                          MSHTML::IHTMLElementCollectionPtr pCollection;
                          MSHTML::IHTMLElementPtr pElement;

                    CoCreateInstance()           (創建MSHTML對象,並傳出Document接口指針)

                  SafeArrayCreateVector()     (把得到的文檔數據緩衝的內容存儲到SafeArray中並讀入到  document中);

                                                     ||

                   pCollection = pDoc->getElementsByTagName(L"P")  (取得文檔中元素爲"P"的集合)

                                                     ||

                              然後對pCollection 進行遍歷,取出需要的東西

                    (幾個關鍵的接口:      pElement = pCollection->item(i, (long)0);

                                                         pElement->getAttribute("id", 2)

                                                         BSTR tmp;
                                                        pElement->get_innerHTML(&tmp);

                並且注意:COM使用的字符串都是基於UNICODE的,要注意對字符串的轉換:

                              _com_util::ConvertBSTRToString()   (將UNICODE 轉換成ASIIC)

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/aganpro/archive/2004/07/19/45204.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章