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