張夢(mèng)元 劉莉
摘要:網(wǎng)頁數(shù)據(jù)提取是人工智能與大數(shù)據(jù)相關(guān)課題學(xué)習(xí)與研究的一項(xiàng)重要內(nèi)容。為了減輕編寫主題網(wǎng)絡(luò)爬蟲程序工作,該文在主題爬蟲的基礎(chǔ)原理上,設(shè)計(jì)一套通用的Java爬蟲程序。程序抽象了下載模塊、內(nèi)容處理模塊和結(jié)果操作等核心內(nèi)容,通過注解或xml配置等低代碼方式,即可實(shí)現(xiàn)不同主題內(nèi)容爬取工作。
關(guān)鍵詞:大數(shù)據(jù);Java;主題爬蟲;低代碼
中圖分類號(hào):TP311? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)30-0033-03
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
1 引言
大數(shù)據(jù)與人工智能是國家高度重視的熱門研究領(lǐng)域[1]。中國開展教學(xué)研究的高校多,從事相關(guān)科研工作和學(xué)習(xí)的人員基數(shù)大。在從事這些工作和學(xué)習(xí)中,收集相關(guān)的領(lǐng)域數(shù)據(jù)是必要的環(huán)節(jié)。目前市面上有一些開源的數(shù)據(jù)可供學(xué)習(xí)使用,但大部分研究領(lǐng)域數(shù)據(jù)被相關(guān)行業(yè)少數(shù)公司掌握,并不對(duì)外開放,給相關(guān)研究學(xué)習(xí)造成了極大的困難。而通過人工的方式從網(wǎng)頁提取數(shù)據(jù)費(fèi)時(shí)費(fèi)力,極大影響研究和學(xué)習(xí)動(dòng)力。因此在不進(jìn)行商業(yè)盈利和違背法律與爬蟲規(guī)則的前提下,開發(fā)一些數(shù)據(jù)爬取工具成為當(dāng)前數(shù)據(jù)采集的一個(gè)主要途徑[2]。然而,這類的開發(fā)工作有一定的領(lǐng)域門檻,而且開發(fā)程序大多都是一次性的,對(duì)于其他主題的研究無法重復(fù)利用。因此,設(shè)計(jì)一套低代碼的主題爬蟲工具,以期沒有爬蟲領(lǐng)域知識(shí)的需求者也能完成相關(guān)主題內(nèi)容數(shù)據(jù)的抓取。
2 爬蟲的概率和原理
2.1 網(wǎng)絡(luò)爬蟲的概念
網(wǎng)絡(luò)爬蟲也叫蜘蛛程序。因?yàn)榛ヂ?lián)網(wǎng)和蜘蛛網(wǎng)一樣,縱橫交錯(cuò)。數(shù)據(jù)存儲(chǔ)在各個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)的主機(jī)上。網(wǎng)絡(luò)爬蟲就如同蜘蛛一樣,在各個(gè)主機(jī)節(jié)點(diǎn)游走,獲取需要的數(shù)據(jù)信息。目前將其分為四類,分別是通用網(wǎng)絡(luò)爬蟲,聚焦網(wǎng)絡(luò)爬蟲,增量式網(wǎng)絡(luò)爬蟲,深層網(wǎng)絡(luò)爬蟲[3]。本文研究的主題爬蟲屬于聚焦爬蟲這一類,主要是爬取一些預(yù)定的網(wǎng)頁數(shù)據(jù)。由于只訪問一些特定的網(wǎng)頁,對(duì)網(wǎng)絡(luò)資源的影響較小。
2.2 主題爬蟲的主要原理
主題網(wǎng)絡(luò)爬蟲是利用程序代替瀏覽器向服務(wù)器發(fā)送一些特定的地址請(qǐng)求,從而獲取到目標(biāo)數(shù)據(jù)。其主要流程是首先下載用戶提供起始頁面,獲取頁面數(shù)據(jù)和處理相關(guān)信息,然后將網(wǎng)頁內(nèi)鏈接進(jìn)行主題相關(guān)度計(jì)算,最后根據(jù)搜索策略進(jìn)行下一次鏈接請(qǐng)求與數(shù)據(jù)獲取[4-5]。其主要流程如圖1所示。
2.3 低代碼開發(fā)概念
低代碼(low code)的核心理念是用少量代碼,或者不寫代碼來進(jìn)行系統(tǒng)開發(fā)。由此帶來的優(yōu)勢(shì)有:降低開發(fā)門檻;減少開發(fā)成本;快速實(shí)現(xiàn)業(yè)務(wù)功能;系統(tǒng)功能更穩(wěn)定,維護(hù)性更好。低代碼開發(fā)分為傳統(tǒng)的軟件開發(fā)、輕量級(jí)無代碼、企業(yè)級(jí)低代碼等開發(fā)形態(tài)[6],其開發(fā)模式的場(chǎng)景適應(yīng)性從左到右依次增強(qiáng)。
輕量級(jí)無代碼開發(fā)模式以表單驅(qū)動(dòng),主要是通過預(yù)先設(shè)定程序規(guī)則,由應(yīng)用開發(fā)人員或者業(yè)務(wù)人員通過圖形化界面配置規(guī)則或者直接編輯配置規(guī)則方式來實(shí)現(xiàn)具體業(yè)務(wù)。
3 爬蟲的設(shè)計(jì)與實(shí)現(xiàn)
3.1 爬蟲設(shè)計(jì)
根據(jù)爬蟲業(yè)務(wù)需求,給網(wǎng)絡(luò)爬蟲設(shè)計(jì)下面幾個(gè)模塊:下載器(Download)模塊,內(nèi)容解析器(ContentsResolver)模塊,控制器(SpiderController)模塊,結(jié)果處理器(Dao)模塊,整體架構(gòu)如圖2所示。
1)SpiderApplication
SpiderApplication是爬蟲程序應(yīng)用上下文的引導(dǎo)類,通過運(yùn)行它的run方法啟動(dòng)爬蟲應(yīng)用。其主要流程為加載下載器、內(nèi)容解析器等實(shí)體對(duì)象;實(shí)例化爬蟲控制器,初始化下載監(jiān)聽器、內(nèi)容處理監(jiān)聽器、結(jié)果處理監(jiān)聽器;初始化下載隊(duì)列,啟動(dòng)下載線程;初始化內(nèi)容解析隊(duì)列,啟動(dòng)內(nèi)容解析線程;初始化結(jié)果處理隊(duì)列,啟動(dòng)結(jié)果處理線程。
2)Downloader
數(shù)據(jù)下載模塊根據(jù)傳遞地址信息拉取網(wǎng)絡(luò)數(shù)據(jù)并轉(zhuǎn)換成page對(duì)象,并將page對(duì)象添加到待處理數(shù)據(jù)隊(duì)列。下載器是爬蟲的通用模塊,后續(xù)實(shí)現(xiàn)其他主題爬蟲可以重復(fù)利用。處理主要問題構(gòu)建爬蟲與服務(wù)間的會(huì)話,如登錄問題等;確保數(shù)據(jù)可靠下載,如下載恢復(fù)與重試;正確處理文件編碼,并正確解析為html文檔對(duì)象。該模塊程序提供完整實(shí)現(xiàn),大多數(shù)情況可直接使用,特定要求也支持重載式擴(kuò)展。其主要流程為首先獲取站點(diǎn)配置信息,包括請(qǐng)求頭、useragent、用戶名、密碼,接著建立與站點(diǎn)會(huì)話,如需登錄則根據(jù)配置信息登錄,然后下載請(qǐng)求數(shù)據(jù),如下載失敗重新添加請(qǐng)求隊(duì)列,并記錄重試次數(shù),超過重試次數(shù)則丟棄,最后解析數(shù)據(jù)編碼,根據(jù)編碼轉(zhuǎn)換成html文檔保存到page對(duì)象。
3)ContentsResolver
內(nèi)容解析器完成對(duì)數(shù)據(jù)的分析處理。調(diào)度器在處理數(shù)據(jù)隊(duì)列數(shù)據(jù)過程中會(huì)根據(jù)page數(shù)據(jù)或?qū)?yīng)的地址信息請(qǐng)求獲取具體解析器對(duì)象,由具體解析器實(shí)際處理數(shù)據(jù)對(duì)象。程序定義兩種類型的通用解析對(duì)象抽象,第一種是鏈接解析器,即識(shí)別并返回后續(xù)需處理地址信息,并交由控制器將地址添加到請(qǐng)求隊(duì)列。第二種是目標(biāo)數(shù)據(jù)解析器,提取page中關(guān)鍵信息,后續(xù)交由結(jié)果處理模塊進(jìn)行相應(yīng)處理。處理器需在程序初始化過程中注冊(cè)到應(yīng)用上下文,程序?qū)崿F(xiàn)IOC注冊(cè)框架,實(shí)現(xiàn)注冊(cè)過程可配置化;程序?qū)崿F(xiàn)解析器可配置式或注解式編寫功能,實(shí)現(xiàn)低代碼式爬蟲程序定制。主要流程為用戶編寫或配置內(nèi)容處理器,程序啟動(dòng),獲取配置信息,初始化到應(yīng)用上下文,然后程序調(diào)度數(shù)據(jù)處理隊(duì)列過程中,根據(jù)page信息獲取對(duì)應(yīng)處理器,處理器解析數(shù)據(jù),返回對(duì)應(yīng)信息,最后控制器根據(jù)放回?cái)?shù)據(jù)類型交由對(duì)應(yīng)模塊處理。
4)SpiderController
任務(wù)控制器模塊實(shí)現(xiàn)爬蟲地址處理邏輯,下載數(shù)據(jù)(page)處理邏輯與結(jié)果(bean)處理邏輯。通過實(shí)現(xiàn)下載回調(diào)接口,數(shù)據(jù)處理回調(diào)接口,結(jié)果處理回調(diào)接口并向下載線程、數(shù)據(jù)處理線程、結(jié)果處理線程添加監(jiān)聽器事件實(shí)現(xiàn)信息處理邏輯。記錄處理過程中的關(guān)鍵日志。其中下載調(diào)度需實(shí)現(xiàn)對(duì)下載鏈接信息的去重與持久化工作,持久化的目的是應(yīng)用程序結(jié)束后重啟能夠恢復(fù)前期下載狀態(tài)。
5)Dao
數(shù)據(jù)處理模塊主要是用來處理提取后的數(shù)據(jù),一般用來保存數(shù)據(jù),如保存文件和數(shù)據(jù)庫,同時(shí)支持對(duì)數(shù)據(jù)進(jìn)行進(jìn)一步統(tǒng)計(jì)或過濾等功能擴(kuò)展需求。程序?qū)崿F(xiàn)數(shù)據(jù)庫與文件配置支持。
3.2 功能實(shí)現(xiàn)
3.2.1 下載器模塊的實(shí)現(xiàn)
Java有許多成熟網(wǎng)絡(luò)請(qǐng)求框架,程序基于httpclient框架實(shí)現(xiàn)。下載器抽象接口定義如下:
public interface Downloader {
public Page download ( String url );
}
可通過接口擴(kuò)展實(shí)現(xiàn)不同下載器,通過SpiderApplication的setDownloader進(jìn)行配置,同時(shí)支持xml配置文件。
下載器在頁面下載結(jié)束后將其轉(zhuǎn)換成Document文檔對(duì)象。頁面解析采用Jsoup框架,該框架支持DOM,CSS方式對(duì)頁面進(jìn)行數(shù)據(jù)提取,后續(xù)用戶根據(jù)需求可簡(jiǎn)單通過低代碼方式擴(kuò)展相應(yīng)的內(nèi)容處理器,實(shí)現(xiàn)不同主題爬蟲任務(wù)。下載器主要代碼如下:
@com.spider.anotation.Downloader//注解下載器
public class HttpClientDownloader implements Downloader{
@Override
public Page download ( String url ) {
//1、初始化httpClient對(duì)象
HttpClient httpClient =? getHttpClient();
//2、構(gòu)建鏈接,發(fā)送訪問請(qǐng)求
httpResponse = httpClient.execute ( getHttpUriRequest(),getHttpClientContext());
//3、獲取與解析放回?cái)?shù)據(jù)
//4、解析數(shù)據(jù),生成page對(duì)象
page = handleResponse ( request ,? getCharset() , httpResponse);
//5、回調(diào)控制器結(jié)果處理邏輯
onSuccess ( request );
return null;
}
}
3.2.2 內(nèi)容處理器的實(shí)現(xiàn)
內(nèi)容處理器是實(shí)現(xiàn)不同主題爬蟲的關(guān)鍵,程序?qū)ζ涑橄笕缦拢?/p>
public interface ContentResolver
public List
}
接口返回泛型T,如果處理鏈接解析器,則返回鏈接字符串。如果處理內(nèi)容,則可以是用戶定義的數(shù)據(jù)實(shí)體類。
該設(shè)計(jì)目的是實(shí)現(xiàn)具體爬蟲任務(wù),可以方便進(jìn)行擴(kuò)展。同時(shí)為了降低編寫門檻,程序提供了基于注解或者xml的低代碼配置方式。爬蟲控制器依據(jù)page的url信息,查找對(duì)應(yīng)的內(nèi)容處理器Resolver。Resolver在應(yīng)用程序啟動(dòng)時(shí),由SpiderApplication初始化。通過Resolver注解被程序識(shí)別,通過type字段設(shè)置處理器類型,默認(rèn)類型為鏈接處理器。被標(biāo)識(shí)為處理器類需指定SourceUrl注解,控制器將根據(jù)value字段來匹配對(duì)應(yīng)內(nèi)容處理器,value支持正則表達(dá)式匹配方式進(jìn)行模糊匹配。數(shù)據(jù)解析器需定義返回?cái)?shù)據(jù)實(shí)體方法,數(shù)據(jù)實(shí)體字段通過Select注解標(biāo)識(shí),Select為抽取規(guī)則的封裝,基于Jsoup框架實(shí)現(xiàn)文檔解析,實(shí)現(xiàn)Css、Xpath數(shù)據(jù)提取,同時(shí)支持Java正則表達(dá)式。Select通過type指定解析類型,通過value設(shè)定解析參數(shù)。
3.2.3 控制器實(shí)現(xiàn)主要邏輯
public class SpiderController implements DownloadListener , ResolveListener {
@Override
public void onDownloadSuccess(String path, Page page) {
//1、記錄下載完成信息
//2、獲取并設(shè)置內(nèi)容處理對(duì)象
//3、添加內(nèi)容解析隊(duì)列
}
@Override
public void onDownloadFail(String path, Result result) {
// 1、記錄失敗信息
// 2、根據(jù)規(guī)則丟棄或者重新排隊(duì)下載
}
@Override
public void onResolveSuccess(DataInfo bean) {
//1、記錄內(nèi)容解析完成信息
//2、添加結(jié)果處理隊(duì)列
}
@Override
public void onResolveFail(Page page, Result result) {
//增加失敗日志
}
}
3.2.4 結(jié)果處理程序?qū)崿F(xiàn)
數(shù)據(jù)處理抽象接口如下:
public interface Dao {
public void process(Object obj);
}
由該接口派生文件保存,數(shù)據(jù)庫保存功能。文件保存將內(nèi)容處理結(jié)構(gòu)對(duì)象轉(zhuǎn)換成json字符串保存指定文件夾中,文件名為時(shí)間加鏈接哈希碼。數(shù)據(jù)庫保存通過ORM方式。程序定義Table,column注解,指定結(jié)果對(duì)象存儲(chǔ)對(duì)應(yīng)數(shù)據(jù)庫表與列。主要代碼邏輯如下:
public class OrmDao implements Dao{
@Override
public void process(Object obj) {
Class beanClass = obj.getClass();
if(beanClass.isAnnotationPresent(Table.class)){
//1、通過注解獲取表明,字段名
//2、生成對(duì)應(yīng)的sql語句
//3、通過jdbc保存到數(shù)據(jù)庫
}
}}
4 爬蟲應(yīng)用案例
4.1 案例分析與應(yīng)用
文化傳媒行業(yè)有大量應(yīng)用研究案例,比如票房預(yù)測(cè)、電影推薦等,這些研究?jī)?nèi)容都是基于電影平臺(tái)數(shù)據(jù)[7-8]。以獲取豆瓣網(wǎng)《獨(dú)行月球》評(píng)論信息為例,可基于前文爬蟲框架簡(jiǎn)易實(shí)現(xiàn)爬蟲程序。
該影片的主頁面為https://movie.douban.com/subject/35183042/,評(píng)論信息頁面地址類似如下https://movie. douban.com/subject/35183042/comments?status=P,評(píng)論信息分頁顯示,地址不變部分為https://movie.douban.com/subject/35183042/comments。對(duì)應(yīng)實(shí)現(xiàn)地址處理代碼如下:
@Resolver ( id = "douban")
@SourceUrl ("https://movie.douban.com/subject/35183042/*")
public class DoubanUrlResolver {
public String getUrlPattern(){
return "https://movie.douban.com/subject/35183042/comments*";
}
}
通過指定該地址處理Resolver,提取包含地址前綴的相關(guān)地址。SourceUrl指定處理主題地址前綴,避免抓取其他影片評(píng)論。此處非標(biāo)準(zhǔn)正則式,程序?qū)rl常見符號(hào)進(jìn)行轉(zhuǎn)義。
評(píng)論具體信息截取片段如下:
好消息是沈騰貢獻(xiàn)了最富層次的一次表演,壞消息是成片的質(zhì)量到底辜負(fù)了他。即便他以一己之力將小品升華成電影,但片中呈現(xiàn)的一切都是二手的,成了一件昂貴而蹩腳的A貨。
評(píng)論內(nèi)容包含在class為comment-item的div標(biāo)簽內(nèi),一個(gè)頁面具有多條該類型信息,通過鏈接翻頁。對(duì)應(yīng)內(nèi)容處理代碼可設(shè)計(jì)如下:
@Resolver ( id = "doubanBean",type = SpiderApplication.TYPE_CONTENT)
@SourceUrl ( "https://movie.douban.com/subject/35183042/comments*")
public class DoubanBeanResolver {
public DoubanComment getComment(){
return new DoubanComment();
}
}
public class DoubanComment {
@Select ( value = ".comment-item ",? type =? Select.Type.Css)
private List
}
通過type = SpiderApplication.TYPE_CONTENT指定為內(nèi)容處理器。SourceUrl指定該類型頁面交由該處理器分析。getComment()函數(shù)指定數(shù)據(jù)對(duì)象,返回對(duì)象定義必須指定Select注解提取方式。由頁面內(nèi)容可知,通過.comment-item即可找出評(píng)論標(biāo)簽p。由于頁面存在該類型標(biāo)簽有多個(gè),因此放回類型為列表,如果選擇內(nèi)容在頁面中唯一,則應(yīng)為字符串。同時(shí)程序也支持XPath與正則表達(dá)式的方式,用戶可根據(jù)實(shí)際情況靈活選擇。
4.2 案例結(jié)果展示
對(duì)獲取《獨(dú)行月球》的影評(píng)文本進(jìn)行分詞,利用WordCloud生成詞云如圖3所示。
5 結(jié)束語
以獲取《獨(dú)行月球》影評(píng)數(shù)據(jù)獲取為例,用戶通過分析頁面鏈接、頁面內(nèi)容,獲取數(shù)據(jù)基本特征。然后用注解的方式表示成對(duì)應(yīng)的ContentResolver,即可實(shí)現(xiàn)內(nèi)容的抓取工作,無須重復(fù)編寫具體解析、下載、保存與任務(wù)管理等業(yè)務(wù)邏輯。同時(shí)程序支持正則表達(dá)式、XPath、Css選擇等方式,基本滿足大部分頁面提取場(chǎng)景。應(yīng)用表明能極大減少用戶編寫主題爬蟲工作。程序目前并未實(shí)現(xiàn)圖形化界面配置的簡(jiǎn)化方式,后期考慮增加該功能,以進(jìn)一步減少開發(fā)時(shí)間。
參考文獻(xiàn):
[1] 張玉鵬.中國人工智能發(fā)展趨勢(shì)現(xiàn)狀及其促進(jìn)策略[J].科技與創(chuàng)新,2022(15):67-69,72.
[2] 劉業(yè),吳建平.動(dòng)態(tài)可配置網(wǎng)絡(luò)爬蟲系統(tǒng)的形式化研究[J].福建電腦,2022,38(8):1-4.
[3] 潘曉英,陳柳,余慧敏,等.主題爬蟲技術(shù)研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2020,37(4):961-965,972.
[4] 顧勤.網(wǎng)絡(luò)爬蟲技術(shù)原理及其應(yīng)用研究[J].信息與電腦(理論版),2021,33(4):174-176.
[5] 劉景發(fā),李帆,丁若堯,等.基于本體和模擬退火算法的暴雨災(zāi)害主題爬蟲策略[J].Frontiers of Information Technology & Electronic Engineering,2022,23(8):1189-1205.
[6] 定義軟件開發(fā)新模式 中國企業(yè)級(jí)無代碼開發(fā)白皮書2021年[C]//艾瑞咨詢系列研究報(bào)告(2021年第8期),2021:439-500.
[7] 王國華.基于python的豆瓣電影網(wǎng)絡(luò)爬蟲設(shè)計(jì)與分析[C]//第三十六屆中國(天津)2022IT、網(wǎng)絡(luò)、信息技術(shù)、電子、儀器儀表創(chuàng)新學(xué)術(shù)會(huì)議論文集, 2022:212-215.
[8] 王恒,唐孝國,郭俊亮.基于python的電影評(píng)分網(wǎng)頁數(shù)據(jù)爬取[J].黑龍江科學(xué),2022,13(14):48-50,54.
【通聯(lián)編輯:謝媛媛】