蔣莘
摘要:數(shù)字圖書館是Web數(shù)據(jù)庫的典型應(yīng)用領(lǐng)域之一。為了幫助用戶高效地訪問數(shù)字圖書館中的海量資源,該文提出一種按需論文檢索系統(tǒng),通過本地搜索和在線搜索的有效結(jié)合,可以批量處理用戶的查詢請求,進行快速響應(yīng)。在詳細介紹系統(tǒng)框架和實現(xiàn)原理的基礎(chǔ)上,該文對基于知網(wǎng)的原型系統(tǒng)實現(xiàn)過程進行了詳細闡述。
關(guān)鍵詞:Web數(shù)據(jù)庫;數(shù)字圖書館;按需檢索;知網(wǎng)
中圖分類號TP311文獻標(biāo)識碼:A文章編號:1009-3044(2012)02-0340-05
CNKI-based Requirement-oriented System for Searching Paper
JIANG Xin
(Wenzhou Teaching andResearching Institute, Wenzhou 325000, China)
Abstract: Digital library is one of the typical applications of web databases. To help users to effectively access the resources in digital li? brary, a requirement-oriented system for searching paper is proposed. By means of the combination of local search and online search, the system can deal with the users query in the way of batch processing. The details of the system based on the open-source libcurl library are introduced, which can construct and submit the query form to CNKI automatically.
Key words: deep web; digital library; requirement-oriented; CNKI
Web作為互聯(lián)網(wǎng)信息發(fā)布平臺蘊含著海量信息,按照信息蘊涵的“深度”可以將Web劃分為Surface Web和Deep Web[1]。與Surface Web相比,Deep Web蘊藏了更加豐富的高質(zhì)量結(jié)構(gòu)化信息,也被稱為Web數(shù)據(jù)庫。如何使得用戶能夠方便地訪問Web數(shù)據(jù)庫中隱藏的豐富資源是一項極其值得期待的需求[2],已經(jīng)成為近幾年來數(shù)據(jù)庫領(lǐng)域研究的熱點。
作為Web數(shù)據(jù)庫典型應(yīng)用的數(shù)字圖書館[3],基于現(xiàn)代計算機和網(wǎng)絡(luò)技術(shù)的數(shù)字信息資源系統(tǒng),將分散于各種載體、不同地理位置的信息資源以數(shù)字化的方式儲存,以網(wǎng)絡(luò)化的方式互相連接,通過分布式的信息管理實現(xiàn)全球范圍的信息資源共享[4]。近年來,數(shù)字圖書館的建設(shè)得到飛速發(fā)展,知網(wǎng)、萬方等數(shù)據(jù)庫中存儲著越來越多的豐富數(shù)字資源。然而,從如此海量的信息中快速獲取用戶所需的信息,并不是一件容易的事情。如何構(gòu)建以用戶需求為導(dǎo)向,以服務(wù)為中心[5]的數(shù)字資源檢索系統(tǒng)引起了廣泛關(guān)注。
本文針對數(shù)字圖書館中的典型資源——中國知網(wǎng)(CNKI)進行應(yīng)用研究,在分析其工作原理的基礎(chǔ)上,設(shè)計出一個根據(jù)用戶的需求批量地從知網(wǎng)獲取相關(guān)信息的按需論文檢索系統(tǒng),以實現(xiàn)用戶“隨需即取”的查詢體驗。
1基于知網(wǎng)的論文按需檢索系統(tǒng)框架
通常,用戶要從知網(wǎng)、萬方、期刊網(wǎng)等數(shù)據(jù)庫中下載論文資源,必須使用一個合法的帳號登錄到網(wǎng)站的檢索系統(tǒng),然后通過網(wǎng)站提供的查詢表單提交搜索關(guān)鍵字,網(wǎng)站后臺動態(tài)地生成檢索結(jié)果,以網(wǎng)頁的形式返回給用戶。這種方式最大的不足在于一次只能進行一個搜索,用戶需要花費大量的時間等待網(wǎng)站的查詢響應(yīng)[6]。為了提高用戶查詢的效率,本文設(shè)計了一個按需的論文檢索系統(tǒng),借助于本地搜索和在線搜索的智能組合,能夠以批處理的方式響應(yīng)用戶的檢索請求,極大地提高了用戶的檢索效率。目前,我們已經(jīng)實現(xiàn)了基于中國知網(wǎng)的論文按需檢索原型系統(tǒng),系統(tǒng)的體系結(jié)構(gòu)圖如圖1所示。
該系統(tǒng)的基本原理如下:在系統(tǒng)中,我們將用戶的歷史檢索請求存儲在本地數(shù)據(jù)庫中。當(dāng)用戶提交一個新的檢索請求時,系統(tǒng)首先檢索本地元數(shù)據(jù)庫,判斷該請求是否存在于本地數(shù)據(jù)庫中。如果存在,則進行本地搜索并將與該查詢請求相關(guān)的論文返回給用戶。如果不存在,則系統(tǒng)自動抽取用戶的檢索請求信息并構(gòu)造出知網(wǎng)能夠接收的查詢請求,提交給知網(wǎng)服務(wù)器進行在線檢索。在將知網(wǎng)返回的查詢結(jié)果返回給用戶的同時,系統(tǒng)存儲該查詢及相應(yīng)結(jié)果于本地服務(wù)器,便于后續(xù)查詢使用。
2知網(wǎng)的工作原理分析
中國知網(wǎng)(CNKI)是全球領(lǐng)先的數(shù)字出版平臺,是一家致力于為海內(nèi)外各行各業(yè)提供知識與情報服務(wù)的專業(yè)網(wǎng)站[7]。從知網(wǎng)上獲取信息和從谷歌、百度等通用搜索引擎獲取信息的不同之處在于:知網(wǎng)是授權(quán)訪問的網(wǎng)站,要想從知網(wǎng)上獲取信息,必須具有知網(wǎng)注冊用戶的權(quán)限,并且處于已登錄狀態(tài)。
在知網(wǎng)的查詢首頁,如果用戶指定了查詢信息并點擊“跨庫檢索”按鈕,瀏覽器將再次發(fā)送一個表單給知網(wǎng),該表單中的各個查
圖1按需論文檢索系統(tǒng)體系結(jié)構(gòu)圖詢屬性包括:檢索項、匹配、開始年份、結(jié)束年份、檢索詞以及所選擇的數(shù)據(jù)庫。
知網(wǎng)與谷歌、百度等搜索引擎獲取信息之間的另一個不同之處是:谷歌與百度把搜索關(guān)鍵字等相關(guān)信息直接拼接在url地址中,并用http的GET方式向服務(wù)器索取搜索結(jié)果;而知網(wǎng)則像它提交登錄信息一樣,把搜索關(guān)鍵字等相關(guān)信息拼裝在一個表單中,并用http的POST方式把該表單發(fā)送給服務(wù)器,以請求搜索結(jié)果。
在查詢首頁中,當(dāng)用戶輸完檢索詞等相關(guān)信息并點擊“跨庫檢索”按鈕后,瀏覽器就把相應(yīng)的查詢屬性拼裝成一個表單,用POST方法提交給知網(wǎng)。
在將該查詢表單發(fā)送給知網(wǎng)服務(wù)器之后,瀏覽器將收到一個如圖2所示的結(jié)果頁面。為表示方便,將被框起來的部分稱為“內(nèi)頁”,框意外的部分稱為“外頁”。實際上,在提交了第一個查詢表單之后,瀏覽器只收到了外頁。而當(dāng)瀏覽器繼續(xù)提交第二個表單后,才將收到內(nèi)頁。這第二個表單是由瀏覽器自動提交的,不需要用戶再輸入相關(guān)的查詢信息。
具體來說,瀏覽器在收到外頁后,根據(jù)外頁的“要求”自動構(gòu)造了一個第二個查詢表單,該查詢表單不僅包括前面提到的所有查詢屬性,還包括了其他的一些默認的屬性,如“searchflag=0”等。第二個查詢表單發(fā)送之后,瀏覽器將收到查詢結(jié)果頁,也就是圖5中的內(nèi)頁。內(nèi)頁包含了所有符合要求的論文詳細信息的鏈接地址。這些鏈接地址是臨時的,一段時間之后將會失效,即過了有效時間之后用戶再點擊那些鏈接將無法跳轉(zhuǎn)到詳細信息的頁面。如果查詢結(jié)果數(shù)量比較多,結(jié)果頁面并不會一次把所有結(jié)果的鏈接都顯示出來,而是每次只顯示10條,用戶可以點擊“下一頁”鏈接來繼續(xù)顯示后續(xù)的10條鏈接,以此類推。
圖2知網(wǎng)的查詢結(jié)果頁面
如果用戶在有效時間之內(nèi)點擊那些詳細信息的鏈接,那么瀏覽器將使用http的GET方法去獲取這個頁面,該頁面也就是用戶所需要的最終頁面,包含了論文的作者中文名,作者單位,關(guān)鍵詞,摘要等詳細信息,并提供了該論文的caj格式和pdf格式的全文供用戶下載。
3按需論文檢索系統(tǒng)的實現(xiàn)
在深入分析知網(wǎng)的信息獲取原理基礎(chǔ)上,本章將介紹如何實現(xiàn)基于知網(wǎng)的論文按需檢索系統(tǒng),利用程序自動實現(xiàn)與知網(wǎng)服務(wù)器的交互功能,達到根據(jù)用戶需求從知網(wǎng)上批量下載資源的目標(biāo)。
3.1系統(tǒng)類庫定義
本文所實現(xiàn)的原型系統(tǒng)均基于libcurl庫進行開發(fā),系統(tǒng)中所定義的主要類庫介紹如下。
由于每個新定義的CURL類型指針在使用前都需要用curl_easy_init函數(shù)初始化,為了使用方便,將把CURL類型的指針封裝在Curl類中。
class Curl{
public:
Curl(){根據(jù)*link的值調(diào)用curl_easy_init函數(shù)}
Curl(const Curl&c){修改*link的值}
Curl&operator=(const Curl c){復(fù)制c并修改*link} CURL*get();
virtual~Curl()
{
根據(jù)*link的值調(diào)用curl_easy_cleanup函數(shù)
}
private:
CURL*curl;
int*link;
};
每次構(gòu)造一個新的Curl對象時都會由構(gòu)造函數(shù)自動地調(diào)用curl_easy_init函數(shù)對curl成員進行初始化,而每次刪除一個Curl對象時都會由析構(gòu)函數(shù)調(diào)用curl_easy_cleanup函數(shù)來對curl成員做清理工作。因此,使用Curl類將不用再考慮何時需要調(diào)用curl_easy_init函數(shù)和curl_easy_cleanup函數(shù),從而簡化了對CURL指針的使用。
類GetPage用于實現(xiàn)網(wǎng)頁信息的獲取功能。由于http協(xié)議提供了兩種獲取信息的方式:GET和POST,因此類GetPage定義為一個基類??梢酝ㄟ^調(diào)用set_ret_func_h等四個成員函數(shù)來設(shè)置如何保存獲取到的頁面和把獲取到的頁面保存到哪里。為了使用方便,GetPage的構(gòu)造函數(shù)指定了默認的回調(diào)函數(shù)和存儲區(qū),這樣,就不必在每次獲取網(wǎng)頁前設(shè)置回調(diào)函數(shù)和存儲區(qū)了。
為了使程序能夠分別使用GET方法和POST方法獲取頁面,從GetPage類派生出兩個類GetPage_get和GetPage_post,分別對應(yīng)使用GET方法和使用POST方法。其中GetPage_get類相對其基類GetPage沒有增加任何成員,而GetPage_post則增加了一個string成員post_content,用來存放表單的內(nèi)容。另外,雖然GetPage_get和GetPage_post都繼承了它們基類的url成員,但含義不一樣:Get? Page_get中的url存放所要獲取的頁面的url地址,而GetPage_post中的url存放的是提交表單的目的地址。
class GetPage{
public:
typedef size_t(*ret_func)(void*,size_t,size_t,void*);
GetPage(string u);
GetPage(Curl c,string u);
void set_ret_func_h(ret_func h);//設(shè)置報文頭的回調(diào)函數(shù)
void set_ret_func_b(ret_func b);//設(shè)置報文體的回調(diào)函數(shù)
void set_stream_h(void*sh); //設(shè)置報文頭的存儲區(qū)
void set_stream_b(void*sb); //設(shè)置報文體的存儲區(qū)
virtual int get_html(void); //獲取頁面
void*get_sh(void); //獲取報文頭
void*get_sb(void); //獲取報文體
Curl get_Curl(void);//返回本對象所使用的Curl對象
virtual~GetPage();
protected:
Curl curl;
string url;
ret_func head,body;
void*streamh,*streamb;
bool alloc_flag_h,alloc_flag_b;};
由于需要頻繁地從獲取的頁面中解析出一些信息(如鏈接地址等),所以定義一個Parser類,用于從一個字符串中獲取以指定字段開頭,并以指定字段結(jié)尾的字符串。在類Parser中,read_file函數(shù)用于把源字符串讀到成員file中。parse函數(shù)的作用是從成員file中找出以head開頭并以tail結(jié)尾的字符串。在其參數(shù)中,如果reserve_head的值為true,則會在目標(biāo)字符串中保留head;如果為false,則在目標(biāo)字符串中不保留head。reserve_tail也一樣,表示是否保留tail。最后一個參數(shù)get_first_num表示最多把多少個符合條件的目標(biāo)字符串存放在作為返回值的list中,0表示返回所有符合條件的,n(n>0)表示返回符合條件的前n個。
class Parser{
public:
Parser(string s);
void read_file(string&str);
list
reserve_tail,unsigned int get_first_num=0);
private:
string file;
list
};
3.2知網(wǎng)的自動登錄實現(xiàn)
在Curl,GetPage和Parser三個類實現(xiàn)之后,就可以實現(xiàn)登錄知網(wǎng)的程序了。因為libcurl庫支持自動跳轉(zhuǎn),即自動重定向,從而不用特意地去判斷是否需要跳轉(zhuǎn),而直接得到查詢首頁。登錄過程的流程如下所示。
cnki_login函數(shù)最后返回Curl對象這一步是必需的,因為這個Curl對象“保存”著程序和知網(wǎng)之間的交互信息(cookie),即這個Curl對象維持著程序作為已登錄用戶的狀態(tài)。返回這個Curl對象將便于后續(xù)的查詢操作能始終使用這個Curl對象與知網(wǎng)進行交互。
其實,從本質(zhì)上來講,整個登錄的過程就是為了使程序在之后的查詢過程中能始終以已登錄用戶的身份來與網(wǎng)站進行交互,因此,cnki_login函數(shù)的最終目標(biāo)就是生成一個具有已登錄用戶身份的Curl對象,并把該對象返回給后續(xù)的程序使用。
3.3本地數(shù)據(jù)庫的存儲模式
系統(tǒng)的本地數(shù)據(jù)庫用于存儲用戶的查詢需求和查詢結(jié)果,主要包括兩個模式:需求表和結(jié)果表。需求表用來存放用戶的需求,即用戶對所要搜索論文的相關(guān)描述,程序?qū)鶕?jù)每一條需求分別從知網(wǎng)上獲取相關(guān)信息。需求表的模式如圖3所示。其中,searchfield表示查找域,即“題名”,“關(guān)鍵詞”,“作者”等;database表示所要選擇的數(shù)據(jù)庫;match表示匹配模式,“1”為精確匹配,“2”為模糊匹配;value表示搜索關(guān)鍵字;startyear和endyear分別表示查詢的起始年份和結(jié)束年份。
圖3需求表模式
結(jié)果表用來存放每一篇論文的相關(guān)信息,其模式如圖4所示。其中,titlech和titleen分別表示中文題名和英文題名;authorch和authoren分別表示中文作者名和英文作者名;keych和keyen分別表示中文關(guān)鍵詞和英文關(guān)鍵詞;abstractch和abstracten分別表示中文摘要和英文摘要;pdf_url表示該論文的下載鏈接地址。
圖4結(jié)果表模式
由于程序只需要對需求表執(zhí)行讀操作和對結(jié)果表執(zhí)行寫操作,因此僅為DbOper類定義兩個相應(yīng)的成員函數(shù),就可以實現(xiàn)用戶需求的獲取,DbOper類定義如下所示。
class GetQuery{
public:
int setQuery(Query&);//獲取需求并拼裝成表單
string getJQ()const;//獲取拼裝后的表單
private:
void joint();//把需求拼裝成表單
Query q;
string jointedQuery;//用來存放表單};
3.4查詢處理的實現(xiàn)
系統(tǒng)的查詢處理由類DoQuery實現(xiàn),其功能包括:把查詢表單提交給知網(wǎng),解析知網(wǎng)返回的結(jié)果頁面并獲取論文的詳細信息,以及把這些信息存入數(shù)據(jù)庫之中。DoQuery類定義如下所示。
class DoQuery{
public:
DoQuery(const Curl&,const GetQuery&);
void setGetQuery(const GetQuery&);
void setUrl(const string&);
int run(DbConn&);
private:
DoQuery();
Paper detail_parse(string);
Curl curl;
string post_url;
string post_content;
};
一般來說,應(yīng)該將所獲得的內(nèi)頁中的所有論文鏈接地址解析出來,一頁解析完之后再解析后一頁,直到所有鏈接地址都解析完成。但知網(wǎng)比較特殊,同一次搜索出的所有結(jié)果鏈接都是相關(guān)聯(lián)的。例如第一條結(jié)果鏈接地址為“/kns50/detail.aspx?QueryID= 17&CurRec=1”,則第二條的地址為“kns50/detail.aspx?QueryID=17&CurRec=2”,以此類推,每條結(jié)果的地址除了最后一個數(shù)字不同,前面的完全相同。因此,可以只解析出第一個結(jié)果鏈接的地址,抽取其最后一個數(shù)字之前部分地址,然后來推出所有結(jié)果的鏈接地址。該方法可以大大地提高程序的效率。假設(shè)某個搜索請求的結(jié)果有210條,每個結(jié)果頁面顯示10條結(jié)果,而獲取1個頁面的速度為0.2秒,那么用該方法將整整剩下(210-10)/10*0.2=4秒時間。
在獲取了結(jié)果的地址之后,run函數(shù)將根據(jù)每個地址循環(huán)地通過GET方法從知網(wǎng)上獲取論文詳細信息的頁面。對于每一個論文詳細信息的頁面,run函數(shù)將會調(diào)用DoQuery類的私有函數(shù)detail_parse來從中解析出諸如作者名,關(guān)鍵字,摘要,論文下載鏈接地址等信息并存入數(shù)據(jù)庫中。
3.5用戶查詢需求的響應(yīng)
針對某一組用戶需求(查詢關(guān)鍵字),該系統(tǒng)可以將從知網(wǎng)檢索得到的有效結(jié)果全部存儲在本地數(shù)據(jù)庫中,每條檢索結(jié)果記錄對應(yīng)需求表中相應(yīng)的需求編號。然而,對于不同用戶而言,其查詢需求各異,如果有效地利用系統(tǒng)存儲在本地的檢索結(jié)果是提高查詢效率的關(guān)鍵。由于系統(tǒng)在本地數(shù)據(jù)庫中的需求表存儲了用戶查詢的相關(guān)信息,因此可以利用不同的SQL查詢來表達用戶的不同需求。
不同用戶需求之間的關(guān)系可以通過其查詢結(jié)果集合間的關(guān)系所呈現(xiàn)?;诮Y(jié)果集合上的覆蓋關(guān)系,任意兩個需求可被分為相離、相交和相容三種情況。假設(shè)用戶需求都被執(zhí)行過至少一次,執(zhí)行后的返回結(jié)果已被存儲在數(shù)據(jù)庫中。需求關(guān)系判斷的基本思想如下:首先產(chǎn)生需求P、Q的對應(yīng)數(shù)據(jù)集data(P)、data(Q)。當(dāng)遍歷data(P)集合后,如未發(fā)現(xiàn)與data(Q)存在交集,則視為需求相離;當(dāng)所有data(P)中的記錄都相交于data(Q),則P相容于Q。當(dāng)data(P)與data(Q)部分相交,還要結(jié)合對data(Q)的遍歷做進一步判斷。此時,如果data(Q)中的記錄都相交于data(P),則是Q相容于P,否則P、Q是相交關(guān)系。
由于判斷所需的數(shù)據(jù)均存儲于本地,對于已經(jīng)存儲在數(shù)據(jù)庫中的用戶需求關(guān)系判斷很容易實現(xiàn),但對于一個新的用戶需求而言,其查詢結(jié)果尚未獲取,而無法使用上述方法判斷與已有需求之間的關(guān)系。我們通過構(gòu)造SELECT查詢在本地數(shù)據(jù)庫中檢索是否存在滿足新用戶需求的數(shù)據(jù)。例如,新用戶需求形如“searchfield=SF,value=V,…”,我們可以構(gòu)造如下查詢:“select * from public.que? ry where searchfield=SF and value like‘%V%”,在用戶需求表中檢索匹配的記錄,如果檢索成功,則將這些需求對應(yīng)的查詢結(jié)果直接返回給用戶,否則就將用戶需求提交知網(wǎng)進行在線查詢。通過這種處理方式,系統(tǒng)一定程度上提高了用戶需求的響應(yīng)效率,而更加完善的用戶需求響應(yīng)方案也是我們下一步研究的重點。
4結(jié)論
為了幫助用戶高效地訪問數(shù)字圖書館中的海量資源,本文提出一種基于知網(wǎng)的按需論文檢索系統(tǒng),通過本地搜索和在線搜索的有效結(jié)合,批量處理用戶的查詢請求,進行快速響應(yīng)。下一步將繼續(xù)完善本系統(tǒng),將其擴展到其它的數(shù)字資源庫。
參考文獻:
[1]劉偉,孟小峰.Deep Web數(shù)據(jù)集成研究綜述[J].計算機學(xué)報,2007,30(9):1475-1489.
[2]崔曉軍,彭智勇.Deep Web信息按需集成研究綜述[J].武漢大學(xué)學(xué)報:理學(xué)版.2009,55(4):465-472.
[3]馬翠嫦.國外數(shù)字圖書館可用性評價研究綜述[J].現(xiàn)代圖書情報技術(shù),2007,2(2):1-6.
[4]陳亞召.以需求為導(dǎo)向的數(shù)字信息資源建設(shè)模式研究[J].圖書館,2009(2):105-106.
[5]李虹.面向用戶的數(shù)字圖書館信息服務(wù)模式研究[J].情報雜志,2007,26(8):134-136.
[6]魯海寧.自建數(shù)據(jù)庫信息服務(wù)平臺模式構(gòu)建[J].圖書館工作與研究,2009(2):40-43.
[7]朱延峰.數(shù)字圖書館信息服務(wù)模式問題簡析[J].南陽師范學(xué)院學(xué)報,2011(8):1-5.