基本技術: 基於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