基於Web過程模擬的動態Web信息獲取

摘要:介紹了分析相關Web頁面的方法和經驗,實現了自動提交HTML表單獲得所需頁面。採用性能優異的Web信息獲取組件CURL,對大量科技文獻網站的網頁進行信息獲取,實驗表明CURL具有優異的處理速度,併成功應用到甘肅省科技文獻共享平臺的統一檢索系統中。
關鍵詞:Web過程模擬;動態Web信息獲取;CURL
中圖分類號:TP393


       隨着Internet的快速發展,Web資源已經成爲一種人們獲取信息的主要來源。但是對於需要查詢的信息,很多網站必須經過註冊登錄後方可使用提供服務的頁面,而且各個網站的信息表示具有很大的異構性,給用戶帶來很大不便。爲了訪問Web上大量有用的信息,動態異構的Web信息獲取方法就成爲了一個研究的熱點。
       對於動態異構的Web資源,首先需要分析其網頁表單,模擬用戶點擊行爲找到結果頁面,這些都是獲取動態Web資源的難點問題;此外,Web網站的動態變化對於保持信息抽取的準確性也是一個挑戰,有待研究者去解決。文獻[1-2]介紹了基於Web過程模擬的異構數字文獻統一檢索系統設計與實現,但對基於Web過程模擬的動態Web信息獲取原理及實現沒有詳細闡述。本文以獲取科技文獻資源網站的動態Web信息爲例來說明問題。


1 基於Web過程模擬的動態Web信息獲取原理
      現在很多網站提供的頁面往往並不是可以通過一個簡單的URL就可以訪問的,而必須經過註冊並登錄後方可使用提供服務的頁面。不同的資源對於登錄有不同的限制。由於與Web交互的細節需要人們自己來實現,這就需要人們對訪問Web資源的細節進行模擬和描述,得到所需結果頁面。
      源數據站點分析模擬是指對資源站點的頁面結構進行分析,通過分析獲取其請求參數用來模擬HTTP請求。其分析結果包括如何得到查詢結果頁面及其規律等。
      網頁源數據站點分析與提取技術是實現和Web資源自動交互的基礎,也是對所需網頁提取數據的基礎。一方面,與Web資源的交互過程中,有些參數和數據是通過網頁分析與提取獲得的;另一方面,得到的所需網頁是通過網頁分析和提取獲得的。
用戶通過瀏覽器來訪問Web資源時,瀏覽器爲用戶隱藏了與Web資源交互的具體細節,用戶看到的只是結果。對於需要查詢的信息,一般需要通過Web瀏覽器登錄到一個Web服務器,輸入查詢條件,提交查詢請求,服務器返回查詢結果。由於用戶與Web資源的交互是以HTTP協議爲基礎進行的,這種交互可以由程序模擬出瀏覽器向遠程Web服務器發送HTTP請求的過程。用戶每查詢一次信息,就是向服務器發送一次HTTP請求的過程。
     HTTP協議[3]是基於請求/響應模式的。HTTP請求信息由請求行、請求頭部域和請求實體三部分組成。請求行中的方法描述指定資源中應該執行的動作。常用方法有get、post和head。請求頭部域是關於該次請求的一些附加信息。請求實體則是該次請求所需傳遞的一些參數信息。HTTP響應信息由響應行、響應頭部域和響應實體三部分組成。響應行主要顯示HTTP版本,以及此次響應結果的狀態碼;響應頭部域爲該次響應的附加信息;響應實體則爲該次響應結果的詳細信息。
       由於可以通過程序模擬發送HTTP請求的過程,對於HTTP請求信息的獲取是模擬成功的關鍵。有些Web服務程序的設計要求瀏覽器端通過腳本技術,對檢索項進行預處理,在瀏覽器端生成一個檢索表達式,再將此表達式以HTTP請求的方式傳遞給服務器進行檢索。在此情況下,需要分析HTML文件中的腳本代碼,構造出正確的檢索表達式。有些請求信息參數是動態變化的。這需要人工仔細分析,找出其中規律,才能實現實時請求、實時響應,以及對查詢頁面的翻頁等功能。這些參數信息都不能有絲毫差錯。可以藉助已有的一些網絡通信攔截工具軟件,如Sniff’em、EHSniffer、HttpWatch、HttpTracer等。這些軟件可以捕獲並解碼瀏覽器發出的HTTP請求的數據,分析HTTP通信的網絡活動等。這樣就可以正確獲取HTTP請求通信所需的參數。


2 Web信息獲取工具
      通過程序模擬訪問網頁的方法有SOCKET通信方式、FOPEN方式、第三方組件(如:libcurl)等。當網頁文件很大或者網頁根本不存在的時候,使用FOPEN的方法經常會出現超時。在實際工程應用中,必須考慮系統的性能及可移植性。Web信息獲取工具是系統性能好壞的一個最重要的技術環節,不論是採用PHP中的SOCKET通信方式還是FOPEN方式都不能勝任如此頻繁的文件獲取時間要求。系統採用性能優異的CURL訪問組件,該組件遠程訪問速度比傳統方式速度快了近200倍,採用FOPEN方式對於100個HTTP文件請求每分鐘只能打開10個,而採用CURL組件方式對於2000個HTTP文件請求每分鐘可以打開2000個[4]。該組件支持FTP,FTPS,TFTP,HTTP,HTTPS,TELNET,DICT,FILE和LDAP協議的訪問,極大地提高了Web會話的速度和協議範圍。此外,該組件支持多種開發語言工具的驅動,主要包括C、C++、PHP、PERL、JAVA、.NET等,支持廣泛的操作系統,包括Solaris、NetBSD、FreeBSD、OpenBSD、HPUX、IRIX、AIX、Tru64、Linux、UnixWare、Windows等,具有廣泛的可移植性,爲程序開發打造了良好的接口。


3 實現及應用實例
       基於CURL的動態Web信息獲取方法已應用於甘肅省科技文獻共享平臺[5]的統一檢索系統。該系統採用PHP5.0作爲開發工具,Apache 2.0作爲Web服務器。
以下是模擬檢索重慶維普中文科技期刊數據庫題錄信息的簡單實現:
以檢索題名爲cad,年限爲2002-2007的數據爲例。


首先用網絡通信攔截工具軟件Sniff’em捕獲請求,結果如下:
POST /CSTJ/Sear.dll?SearchZK HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer:

http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; POTU(RR:27062616:0:5064085); TencentTraveler )
Host: vip.gsinfo.net.cn
Content-Length: 215
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: GTZ=-480; ASPSESSIONIDAQQSSRRS=IKDLFENCMFAIGAMBEJFIMMKL; WebSite=YW=0; CSID=%7BDAF8D431%2D845D%2D4B0F%2D9F49%2DEEC550C0438F%7D061%2E178%2E020%2E160; VIPCSID=%7BDAF8D431%2D845D%2D4B0F%2D9F49%2DEEC550C0438F%7D; User=YR=1989%2C2016&UN=1&YWBrowse=0&UserID=1&UR=ZZ&Alllist=1&Name=guest
E=%3C1%2C4%3E%3A%28%28Title_C%3DCAD%29*Years%3D%282002%2B2003%2B2004%2B2005%2B2006%2B2007%29%29&S=1&N=20&P=1&C=0&H=%28%CC%E2%C3%FB%3DCAD%29*Year%3D2002-2007&M=&KM=&GX=&CSID=%7BDAF8D431-845D-4B0F-9F49-EEC550C0438F%7DHTTP/1.1 200 OK
Connection: close
Date: Sun, 23 Mar 2008 02:24:35 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
可以看到,這個請求使用了POST命令,向
http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK發出請求,後面幾行是這個請求的一些附加字段信息,倒數第五行是這個請求的HTTP Body,其內容就是POST命令所要附帶的數據,是經過HTML編碼的一個字符串,解碼後爲:
E=<1,4>:((Title_C=CAD)*Years=(2002+2003+2004+2005+2006+2007))&S=1&N=20&P=1&C=0&H=(題名=CAD)*Year=2002-2007&M=&KM=&GX=&CSID={DAF8D431-845D-4B0F-9F49-EEC550C0438F}


以下是用CURL組件實現這個請求的PHP代碼:
<?
$bench = new Tii_Timer;    //實例化一個計時類對象
$bench->start();           //計時開始
$bench->setMarker(‘Start of the script');
$url="

http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK";
$param="E=%3C1%2C4%3E%3A%28%28Title_C%3DCAD%29*Years%3D%282002%2B2003%2B2004%2B2005%2B2006%2B2007%29%29&S=1&N=20&P=1&C=0&H=%28%CC%E2%C3%FB%3DCAD%29*Year%3D2002-2007&M=&KM=&GX=&CSID=%7BDAF8D431-845D-4B0F-9F49-EEC550C0438F%7D"; //指定POST數據
ob_start();                                     //打開輸出緩衝區
$ch = curl_init()[6];                            //初始化會話
curl_setopt( $ch, CURLOPT_URL, $url );         //設定目標URL
curl_setopt( $ch, CURLOPT_POST, 1 );           //設定表單發送方式爲POST
curl_setopt($ch,CURLOPT_POSTFIELDS,$param);   //POST數據
curl_exec($ch);                               //發送請求
$retrievedhtml = ob_get_contents();             //返回內部緩衝區的內容
ob_end_clean();                   //刪除內部緩衝區的內容並關閉內部緩衝區
curl_close( $ch );                //會話結束
$bench->stop();                   //計時結束
$resp = $bench->getProfiling();
echo $resp[2][diff]."S";          //輸出計時時間
?>


現在獲取的信息就在$retrievedhtml中,然後就可以對獲取的信息進行分析,得到元數據。
用CURL組件實現這個請求的平均時間是0.62S.
    以下是用FOPEN方式實現這個請求的PHP代碼:
<?
$bench = new Tii_Timer;    //實例化一個計時類對象
$bench->start();           //計時開始
$bench->setMarker('Start of the script');
$url="

http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK";
$param="E=%3C1%2C4%3E%3A%28%28Title_C%3DCAD%29*Years%3D%282002%2B2003%2B2004%2B2005%2B2006%2B2007%29%29&S=1&N=20&P=1&C=0&H=%28%CC%E2%C3%FB%3DCAD%29*Year%3D2002-2007&M=&KM=&GX=&CSID=%7B7CC87A4E-5D78-41D7-B8D9-289746EFA53E%7D"; //指定POST數據
$fp = fopen($url.'?'.$param, "r");     //發送請求
$retrievedhtml = "";
do {                                    //讀取返回的信息
   $data = fread($fp, 8192);
   if (strlen($data) == 0) {
   break;
   }
   $retrievedhtml .= $data;
} while(true);
fclose($fp);
$bench->stop();
$resp = $bench->getProfiling();
echo $resp[2][diff]."S";
?>


用FOPEN方式實現這個請求的平均時間是1S.


     雖然通過這個例子不能說明用CURL組件實現動態Web信息獲取的優越性能,但經過大量的實驗,如:通過訪問清華同方CNKI數據庫、萬方數據庫、NSTL數據庫等文獻資源網站,表明,用CURL組件實現動態Web信息獲取的性能遠優於用FOPEN方式。
4 技術難點和重點
4.1 檢索選項到檢索表達式的轉換
     對於要傳遞給Web服務器的檢索選項,根據Web服務器設計的不同,需要做相應的處理,有的Web服務器只需要瀏覽器端直接返回選項值,由服務器端程序進行邏輯處理後返回結果;有些Web服務程序的設計要求瀏覽器端通過腳本技術,對檢索選項進行預處理,在瀏覽器端生成一個檢索表達式,再將此表達式以HTTP請求的方式傳遞給服務器進行檢索,在這種情況下,開發人員需要分析HTML文件中嵌入的腳本代碼或引用的腳本文件,理清各個檢索選項到檢索表達式的轉換關係,才能構造出正確的檢索表達式。例如,有些網站的翻頁鏈接或全文鏈接是Javascript寫成的腳本命令,在HTML源代碼中的靜態文本是固定的,但實際指向的真正鏈接,卻需要在腳本函數中動態生成。
4.2 連接狀態的管理
     目前的檢索系統都應用了Session(如:上例中POST數據中的CSID=%7BDAF8D431-845D-4B0F-9F49-EEC550C0438F%7D)技術,爲了解決Session過期和各文獻數據庫限制併發訪問數的問題,採用了檢索時一次性釋放檢索系統Session會話的機制,當翻頁時再次建立檢索系統Session會話。此外,各文獻數據庫都限制了併發訪問數,通過這個方法能很好解決這個問題。
4.3 多任務開發
     儘管PHP的優勢主要在於優異的字符運算處理速度和可靠性,通過與Apache 2.0 Web服務器的組合使得統一檢索系統具備了良好的穩定性和性能,但它本身不支持多線程,而統一檢索系統需要對多個數據庫同時進行檢索,如果是普通的單線程程序,處理速度會慢得讓人無法忍受,本文使用Ajax技術實現多任務編程技術,以提高程序的運行效率、避免程序界面出現“假死”狀態。
      Ajax對Web服務的通信調用過程分爲同步調用和異步調用,同步調用好處是一次性將用戶的所有請求併發處理,但對於統一檢索系統來說,多個資源數據庫的檢索響應將受限於耗時最長的資源數據庫,用戶等待時間較長,服務器端併發處理的壓力較大。採用異步調用方式可很好的解決這一問題,用戶按需發出請求,用戶發出的多個資源數據庫的檢索在服務器端是按線程處理的,用戶請求的響應以服務器處理結果爲準,檢索處理過程互不影響,大大縮短了用戶的總體響應時間,降低了服務器的併發處理壓力,在用戶端等待數據處理結果時,可進行其它資源庫的檢索,實現了多任務檢索處理和操作。
5 結語
       本文針對動態Web信息獲取問題,介紹了基於Web過程模擬的解決方法。該方法主要用於如何得到查詢頁面和實現信息抓取。如何提高對多種網頁結構的適應性,以及感知Web信息和網頁結構的更新變化,同時減少其複雜性,提高其自動化和智能性,需要作進一步研究和探討。
參考文獻:
[1]曹方,施韶亭.基於Web過程模擬的異構數字文獻統一檢索系統設計與實現[J].情報學報, 2006,25(5):575-579.
[2]王權,施韶亭.基於PHP的統一檢索系統的設計與實現[J].蘭州理工大學學報,2008,34(1):91-94.
[3] Hypertext Transfer Protocol--HTTP/1.1[EB/OL].[2008-03-19].

http://www.w3.org/Protocols/rfc2616/rfc2616.html
[4]PHP/CURL-using libcurl with PHP[EB/OL].[2008-03-19].http://curl.haxx.se/libcurl/php.
[5] 甘肅科技文獻資源共享平臺[EB/OL].[2008-03-19].http://www.gsstd.cn
[6] XVIII.CURL:Client URL library functions[EB/OL].[2008-03-19].
http://cn.php.net/manual/zh/ref.curl.php.


補充:

用CURL吧,速度比FILE()或FOPEN()都快,參考http://curl.haxx.se/libcurl/
簡單點的
<?
$url='http://www.163.com';
ob_start(); //打開輸出緩衝區
$ch = curl_init(); //初始化會話
curl_setopt( $ch, CURLOPT_URL, $url ); //設定目標URL
curl_exec( $ch ); //發送請求
//$retrievedhtml = ob_get_contents(); //返回內部緩衝區的內容
//ob_end_clean(); //刪除內部緩衝區的內容並關閉內部緩衝區
curl_close( $ch ); //會話結束
?>
複雜點的
<?
$url='http://202.201.7.9/CSTJ/Sear.dll?SearchZK';
$param='E=%3C1%2C4%3E%3A%28%28Title_C%3DCAm%29*Years%3D%282002%2B2003%2B2004%2B2005%2B2006%2B2007%29%29&S=1&N=20&P=1&C=0&H=%28%CC%E2%C3%FB%3DCAD%29*Year%3D2002-2007&M=&KM=&GX=&CSID=%7BC8E8BDCF-73D3-45F2-9FE9-89C8B28A02D1%7D'; //指定POST數據
ob_start(); //打開輸出緩衝區
$ch = curl_init(); //初始化會話
curl_setopt( $ch, CURLOPT_URL, $url ); //設定目標URL
curl_setopt( $ch, CURLOPT_POST, 1 ); //設定表單發送方式爲POST
curl_setopt( $ch, CURLOPT_POSTFIELDS, $param ); //POST數據
curl_exec( $ch ); //發送請求
//$retrievedhtml = ob_get_contents(); //返回內部緩衝區的內容
//ob_end_clean(); //刪除內部緩衝區的內容並關閉內部緩衝區
curl_close( $ch ); //會話結束
?>
     通過程序模擬訪問網頁的方法有SOCKET通信方式、FOPEN方式、第三方組件(如:libcurl)等。當網頁文件很大或者網頁根本不存在的時候,使用FOPEN的方法經常會出現超時。在實際工程應用中,必須考慮系統的性能及可移植性。Web信息獲取工具是系統性能好壞的一個最重要的技術環節,不論是採用PHP中的SOCKET通信方式還是FOPEN方式都不能勝任如此頻繁的文件獲取時間要求。系統採用性能優異的CURL訪問組件,該組件遠程訪問速度比傳統方式速度快了近200倍,採用FOPEN方式對於100個HTTP文件請求每分鐘只能打開10個,而採用CURL組件方式對於2000個HTTP文件請求每分鐘可以打開2000個[4]。該組件支持FTP,FTPS,TFTP,HTTP,HTTPS,TELNET,DICT,FILE和LDAP協議的訪問,極大地提高了Web會話的速度和協議範圍。此外,該組件支持多種開發語言工具的驅動,主要包括C、C++、PHP、PERL、JAVA、.NET等,支持廣泛的操作系統,包括Solaris、NetBSD、FreeBSD、OpenBSD、HPUX、IRIX、AIX、Tru64、Linux、UnixWare、Windows等,具有廣泛的可移植性,爲程序開發打造了良好的接口。

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