亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于WebMagic 爬蟲框架的網(wǎng)頁信息系統(tǒng)設(shè)計(jì)

        2023-08-22 10:30:34朱延剛
        無線互聯(lián)科技 2023年11期
        關(guān)鍵詞:爬蟲設(shè)計(jì)者代碼

        朱延剛

        (南京信息工程大學(xué),江蘇 南京 210044))

        0 引言

        隨著互聯(lián)網(wǎng)技術(shù)的迅速發(fā)展,各類互聯(lián)網(wǎng)平臺(tái)大量涌現(xiàn)。 但這些平臺(tái)在為網(wǎng)絡(luò)用戶提供豐富的媒體資源的同時(shí),也增加了用戶直接高效獲取有用信息的難度,特別是具有行業(yè)性、專業(yè)性的信息,很容易淹沒在信息的海洋中。 僅僅通過傳統(tǒng)的搜索引擎獲取的檢索信息,已經(jīng)無法滿足更為專業(yè)的信息需求。 因此,如何對海量的信息進(jìn)行歸納和提取變得十分重要。 目前,有很多針對特定場景設(shè)計(jì)的Java 爬蟲系統(tǒng),可以滿足如圖片下載[1]、特定技術(shù)主題或新聞媒體咨詢整合等多種特定需求[2-4]。 這些爬蟲系統(tǒng)的提出,都能針對特定的業(yè)務(wù)場景設(shè)計(jì)出針對性比較強(qiáng)的解決方案。 設(shè)計(jì)一種適用性和可擴(kuò)展性更好的爬蟲信息采集系統(tǒng),不僅可以降低用戶構(gòu)建特定場景的爬蟲系統(tǒng)設(shè)計(jì)難度,還能提高設(shè)計(jì)者的開發(fā)效率。 本文基于WebMagic 框架,提出了一種適用性和可擴(kuò)展性更好的開發(fā)框架。

        1 技術(shù)介紹

        1.1 HttpClient 和Jsoup

        HttpClient 是Apache HttpComponentsTM項(xiàng)目負(fù)責(zé)創(chuàng)建和維護(hù)的一個(gè)基于HTTP 協(xié)議的Java 組件開發(fā)包。 HttpClient 與一般的瀏覽器不同,它不提供UI 界面,但是可以完成和瀏覽器相同的功能。 此外,還可以用來發(fā)送請求,接收服務(wù)器響應(yīng)數(shù)據(jù)。 因此,HttpClient 通常被開發(fā)人員作為API 來調(diào)用。 Jsoup是一個(gè)用于處理HTML 的Java 庫,可以提供一個(gè)非常便捷的API。 在網(wǎng)頁爬蟲中,Jsoup 主要用來從URL、文件或字符串中抓取和解析HTML,使用DOM 遍歷或CSS 選擇器查找和提取數(shù)據(jù),操作 HTML 元素、屬性和文本。 除此之外,它還能根據(jù)安全列表清理用戶提交的內(nèi)容,以防止 XSS 攻擊。

        1.2 SpringData

        SpringData 是被廣泛使用的Web 開發(fā)框架Spring的重要組成部分,用于簡化數(shù)據(jù)庫的訪問。 本文之所以介紹SpringData,是因?yàn)樗哂袕?qiáng)大的數(shù)據(jù)持久層的支持開發(fā)能力。 不僅支持關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)存儲(chǔ),比如JDBC,JPA 等,也支持非關(guān)系型的數(shù)據(jù)存儲(chǔ),比如Redis[5],ElasticSearch[6],Neo4j[7]等。 SpringData框架很好地提升了數(shù)據(jù)存儲(chǔ)層面的適用性和可擴(kuò)展性。

        1.3 WebMagic

        目前,主流的Java 爬蟲框架主要有Nutch,Crawler4j,WebMagic,WebCollector 等。 這些爬蟲框架都有各自的優(yōu)缺點(diǎn)。 本文選擇WebMagic 作為基本的爬蟲框架,主要基于以下3 點(diǎn):(1)WebMagic 的設(shè)計(jì)參考了業(yè)界比較成熟的爬蟲框架 Scrapy;(2)WebMagic 支持多線程任務(wù),能充分利用硬件資源,提高數(shù)據(jù)的處理速率;(3)WebMagic 的4 大組件Downloader,PageProcessor,Scheduler,Pipeline 對應(yīng)了爬蟲生命周期中的下載、處理、管理和持久化4 個(gè)過程。 對系統(tǒng)開發(fā)者來說,主要的業(yè)務(wù)代碼通常在PageProcessor 完 成 即 可。 其 他 的3 大 組 件, 即Downloader,Scheduler,Pipeline,也具有定制性。 系統(tǒng)設(shè)計(jì)者可以根據(jù)自己的需求,來修改完善組件的代碼。 因此,選擇WebMagic 框架作為基礎(chǔ)架構(gòu)能夠使整個(gè)系統(tǒng)具有更好的適應(yīng)性和可用性。

        2 框架結(jié)構(gòu)設(shè)計(jì)

        本文提出的基于WebMagic 的爬蟲框架,主要包含了3 個(gè)業(yè)務(wù)處理流程:頁面數(shù)據(jù)獲取、數(shù)據(jù)分析處理和數(shù)據(jù)存儲(chǔ)持久化。 每個(gè)業(yè)務(wù)流程也會(huì)提交或者產(chǎn)生不同階段的數(shù)據(jù)。 通過分析這些數(shù)據(jù)流,能促進(jìn)系統(tǒng)設(shè)計(jì)者更好地理解系統(tǒng)結(jié)構(gòu),了解需要參與的實(shí)體,以及每個(gè)業(yè)務(wù)流程在每個(gè)階段需要完成的明確任務(wù)和目標(biāo)。 具體的結(jié)構(gòu)如圖1 所示。 本文將具體闡述每個(gè)框架結(jié)構(gòu)部分,具體的設(shè)計(jì)思路。

        2.1 頁面數(shù)據(jù)獲取

        對于頁面數(shù)據(jù)獲取而言,系統(tǒng)設(shè)計(jì)者在設(shè)計(jì)任何場景的網(wǎng)頁爬蟲系統(tǒng)時(shí),都需要確定目標(biāo)信息定位,明確將哪些站點(diǎn)平臺(tái)作為信息來源,其選取的信息源的質(zhì)量越高,得到的信息就越有價(jià)值。 因此系統(tǒng)設(shè)計(jì)者是否能選取合適的站點(diǎn),對于獲取數(shù)據(jù)頁面信息是至關(guān)重要的。 一般網(wǎng)頁獲取分為開放式和注冊登錄式。 前者的瀏覽權(quán)限比較低,使用者通過訪客模式就可以正常瀏覽站點(diǎn)信息,這種類型的頁面數(shù)據(jù)獲取比較容易。 相比之下,登錄注冊式的站點(diǎn)更加復(fù)雜,信息獲取的流程更為煩瑣。 本文針對登錄注冊式站點(diǎn)的頁面數(shù)據(jù)獲取流程做了簡要闡述。

        對于登錄注冊式的頁面,用戶可以進(jìn)行常規(guī)的注冊,然后獲取用戶名和密碼,再通過框架的API 接口,模擬瀏覽器登錄。 對于帶有圖片驗(yàn)證的模擬登錄,其登錄過程也是目前的一個(gè)難點(diǎn)。 對于站點(diǎn)的分類分頁頁面數(shù)據(jù),系統(tǒng)設(shè)計(jì)者還要通過瀏覽器的開發(fā)者工具,分析HTTP 報(bào)文的請求頭和響應(yīng)頭以及響應(yīng)參數(shù)的特點(diǎn)。 設(shè)計(jì)者對請求頭的請求參數(shù)進(jìn)行分析可以幫助其確定需要提交哪些請求參數(shù)。 設(shè)計(jì)者通過點(diǎn)擊分頁發(fā)起請求時(shí),對應(yīng)的請求參數(shù)需要攜帶Cookie中的JSESSIONID,而當(dāng)設(shè)計(jì)者對這一請求所產(chǎn)生的響應(yīng)數(shù)據(jù)進(jìn)行分析時(shí),有時(shí)候可以得到一些JSON 字符串,也就是設(shè)計(jì)者需要提取的信息文本。

        2.2 數(shù)據(jù)分析處理

        系統(tǒng)設(shè)計(jì)者獲取了頁面的數(shù)據(jù)之后,需要進(jìn)一步地對頁面數(shù)據(jù)進(jìn)行分析處理。 這里的頁面數(shù)據(jù)的主要形式就是服務(wù)器響應(yīng)給請求端的HTML 標(biāo)簽,CSS樣式表等字符源碼。 為了更好地定位到需要的頁面標(biāo)簽數(shù)據(jù),系統(tǒng)設(shè)計(jì)者同樣可以借助瀏覽器的開發(fā)者工具,通過點(diǎn)擊元素檢查按鈕,迅速定位標(biāo)簽,提升數(shù)據(jù)分析效率。 在確定了具體的元素標(biāo)簽之后,系統(tǒng)設(shè)計(jì)者就可以借助WebMagic 3 種數(shù)據(jù)抽取技術(shù)(即XPath、CSS 選擇器和正則表達(dá)式)對需要的頁面數(shù)據(jù)進(jìn)行分割提取,或者選擇相對獨(dú)立的Jsoup 開發(fā)庫作為數(shù)據(jù)抽取工具。

        基于WebMagic 的爬蟲框架有一個(gè)比較大的優(yōu)點(diǎn),就是支持多線程任務(wù)。 系統(tǒng)設(shè)計(jì)者可以充分利用開發(fā)平臺(tái)的硬件性能,減少數(shù)據(jù)抓取處理的時(shí)間,但是需要注意線程的安全性問題。 WebMagic 會(huì)自動(dòng)提取頁面出現(xiàn)的HTTP 的請求連接,然后把它們放到請求的隊(duì)列中去。 如果有多個(gè)分類,每個(gè)分類還有多個(gè)頁面,而且每個(gè)分類頁面數(shù)據(jù)返回的時(shí)間也具有不確定性。 如果系統(tǒng)設(shè)計(jì)者在同一個(gè)PageProcessor 里處理業(yè)務(wù)邏輯,就要考慮多線程條件下的線程安全問題,否則將無法保證結(jié)果數(shù)據(jù)的準(zhǔn)確可靠。

        2.3 數(shù)據(jù)持久化

        系統(tǒng)設(shè)計(jì)者在獲得了目標(biāo)數(shù)據(jù)之后,為了便于后期進(jìn)一步對數(shù)據(jù)進(jìn)行分析提取,就要解決數(shù)據(jù)的存儲(chǔ)問題。 目前,數(shù)據(jù)存儲(chǔ)主要有兩種方案:關(guān)系型數(shù)據(jù)持久方案和非關(guān)系型數(shù)據(jù)持久方案。 系統(tǒng)設(shè)計(jì)者最終選取何種數(shù)據(jù)存儲(chǔ)方案更合適,需要根據(jù)自身的業(yè)務(wù)需求和特點(diǎn)并結(jié)合下一步對數(shù)據(jù)處理需要采取的具體策略來確定。 關(guān)系型數(shù)據(jù)持久方案的優(yōu)點(diǎn)是易于維護(hù),支持通用的SQL 查詢語句,且支持事務(wù)處理。但它也有缺點(diǎn),即讀寫較慢,不適合對I/O 要求高的操作。 非關(guān)系型數(shù)據(jù)持久方案存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)靈活,還支持內(nèi)存存儲(chǔ),所以讀寫性能較好,查詢速度快,但它的缺點(diǎn)是不支持通用的SQL 查詢,基本也不支持事務(wù)處理,且對于初學(xué)者來說,其學(xué)習(xí)成本也更高。

        基于WebMagic 的爬蟲框架使用了Pipeline 數(shù)據(jù)持久化組件,并提供了3 個(gè)實(shí)現(xiàn)類:用于向控制臺(tái)輸出的ConsolePipeline 類,用于向磁盤輸出文件的FilePipeline 類,還有用于保存Json 格式文件的JsonFilePipeline 類。 系統(tǒng)設(shè)計(jì)者可以根據(jù)需要定制合適的Pipeline,以實(shí)現(xiàn)對數(shù)據(jù)的持久化存儲(chǔ)。 系統(tǒng)設(shè)計(jì)者可以把Pipeline 作為一個(gè)可選的組件,因?yàn)閃ebMagic 作為一種Java 開發(fā)平臺(tái)本身就擁有很好的靈活性,設(shè)計(jì)者可以使用個(gè)性化的數(shù)據(jù)持久化組件,例如,設(shè)計(jì)者可以把本文技術(shù)介紹部分提到的SpringData 框架作為組件,從而發(fā)揮該框架支持的多種數(shù)據(jù)類型的持久化功能。 系統(tǒng)設(shè)計(jì)者可以進(jìn)一步提升系統(tǒng)的適用性和可擴(kuò)展性以及對抓取數(shù)據(jù)后期的可用性。 這些系統(tǒng)提升有利于對數(shù)據(jù)進(jìn)行更深層次的處理。

        3 技術(shù)實(shí)現(xiàn)

        3.1 創(chuàng)建頁面數(shù)據(jù)爬取業(yè)務(wù)實(shí)現(xiàn)類

        基于WebMagic 爬蟲框架的系統(tǒng)設(shè)計(jì)中,一般不可缺少的組件是PageProcessor。 通過這個(gè)組件,系統(tǒng)設(shè)計(jì)者可以對頁面數(shù)據(jù)分析處理邏輯進(jìn)行設(shè)計(jì),而具體的邏輯設(shè)計(jì)需要根據(jù)具體的業(yè)務(wù)需求來確定。PageProcessor 組件也定義實(shí)現(xiàn)了一些具有HttpClient功能的對象,比如Site 對象。 站點(diǎn)本身的一些配置信息,例如編碼、HTTP 頭、超時(shí)時(shí)間、重試策略和代理等,都可以通過設(shè)置Site 對象來進(jìn)行配置,增強(qiáng)框架的功能。 下面展示了一個(gè)帶分頁的爬蟲數(shù)據(jù)分析提取的例子,部分核心代碼如下:

        class DemoProcessor implements PageProcessor {

        / /站點(diǎn)對象參數(shù)設(shè)置

        private Site site = Site.me()

        .setCharset("UTF-8")/ /設(shè)置編碼

        .setTimeOut(10000)/ /超時(shí)時(shí)間

        .setRetrySleepTime(3000)/ /重試時(shí)間

        .setSleepTime(10);/ /重試次數(shù)

        public Site getSite() {return site;}

        public void process(Page page) {

        / /編寫頁面數(shù)據(jù)分析處理代碼

        / /獲取頁面上的HTTP 鏈接

        String pageUrl = page.getUrl().toString();

        / /將頁面的HTML 標(biāo)簽通過Jsoup 生成一個(gè)可解析的文檔

        Document doc = Jsoup. parse(page. getHtml().toString());

        / /借助開發(fā)者工具定位標(biāo)簽元素解析數(shù)據(jù)

        String div = doc.select("div[module-name=icbupc-productListPc]").attr("module-data");

        / /對數(shù)據(jù)進(jìn)行URLDecode 解碼

        String decode = URLDecoder.decode(div);

        / /將字符串轉(zhuǎn)化成JSON 對象進(jìn)行解析

        JSONObject jsonObject =JSON. parseObject(decode);

        / /獲得當(dāng)前分類是數(shù)據(jù)總數(shù)目

        Integer totalLines = jsonObject. getJSONObject("mds")

        . getJSONObject(" pageNavView"). getInteger("totalLines");

        / /獲取當(dāng)前分頁的頁碼

        Integer pageLines = jsonObject. getJSONObject("mds")

        . getJSONObject(" pageNavView"). getInteger("pageLines");

        / /獲取當(dāng)前分類的總頁數(shù)

        int totalPage = (totalLines + pageLines - 1) /pageLines;

        }}

        3.2 創(chuàng)建爬蟲業(yè)務(wù)的啟動(dòng)入口

        Spider 對象是爬蟲啟動(dòng)的入口對象。 在這個(gè)入口對象create 方法的內(nèi)部,系統(tǒng)設(shè)計(jì)者可以傳入完成的頁面數(shù)據(jù)爬取業(yè)務(wù)實(shí)現(xiàn)類DemoProcessor,然后再調(diào)用run 方法進(jìn)行啟動(dòng)。 此外,另一個(gè)在Spider 對象上比較常用的方法是addUrl,系統(tǒng)設(shè)計(jì)者可以用這個(gè)方法來添加初始的URL 地址參數(shù)。 該地址參數(shù)一般就是站點(diǎn)的入口地址。 Spider 對象的部分核心代碼如下:

        Spider. create (newDemoProcessor ( ))/ /傳入PageProcessor 參數(shù)

        .addUrl(URL)/ /初始的URL

        .thread(10)/ /開啟的線程數(shù)

        .run();

        Spider 對象還提供一個(gè)addPipeline 方法,顧名思義,這個(gè)方法主要是用于傳入設(shè)計(jì)人員自定義的Pipeline 組件對象的。

        3.3 創(chuàng)建數(shù)據(jù)持久化邏輯接口

        關(guān)于如何把獲取的提取數(shù)據(jù)進(jìn)行持久化的問題,本文在框架結(jié)構(gòu)設(shè)計(jì)部分已經(jīng)做了闡述。 如果系統(tǒng)設(shè)計(jì)者將得到的目標(biāo)數(shù)據(jù)保存成文件的形式,則不利于大數(shù)據(jù)量的管理和查詢。 對此,本文認(rèn)為,系統(tǒng)設(shè)計(jì)者需要對數(shù)據(jù)進(jìn)行數(shù)據(jù)庫的持久化設(shè)計(jì)。

        3.3.1 通過定制Pipeline 的方式

        通過Pipeline 有兩種導(dǎo)入數(shù)據(jù)庫的方式:注解方式和常規(guī)的代碼方式。 系統(tǒng)設(shè)計(jì)者可以定義一個(gè)名為AnnotationObjectDaoPipeline 的注解類,具體代碼如下:

        @Component("AnnotationObjectDaoPipeline")

        public class AnnotationObjectDaoPipeline implements PageModelPipeline {}

        注 解 的 方 式 需 要 實(shí) 現(xiàn) WebMagic 的PageModelPipeline 接口。 系統(tǒng)設(shè)計(jì)者通過泛型傳入定義好的數(shù)據(jù)模型,最后在內(nèi)部實(shí)現(xiàn)process 方法即可。

        另一種是常規(guī)代碼的實(shí)現(xiàn)方式。 系統(tǒng)設(shè)計(jì)者需要定義一個(gè)實(shí)現(xiàn)類CommonCodePipeline,具體代碼如下:

        public class CommonCodePipelineimplements Pipeline {}

        這種方式也需要系統(tǒng)設(shè)計(jì)者重寫內(nèi)部的process方法。 兩種方式可以根據(jù)設(shè)計(jì)者自身的需求,靈活應(yīng)用。 Pipeline 其實(shí)就是將PageProcessor 的抽取結(jié)果,進(jìn)行獨(dú)立的處理。 之所以設(shè)計(jì)者可以考慮使用Pipeline 組件,主要是因?yàn)槠渚哂袃纱髢?yōu)點(diǎn):(1)這種方式實(shí)現(xiàn)了模塊分離,代碼結(jié)構(gòu)比較清晰,而且解析抽取和數(shù)據(jù)保存各自占用獨(dú)立的線程,互不干擾;(2)Pipeline 的功能比較固定,更容易做成通用組件。

        3.3.2 自定義數(shù)據(jù)持久化接口

        如果系統(tǒng)設(shè)計(jì)者認(rèn)為使用Pipeline 組件比較煩瑣,學(xué)習(xí)成本較高,也可以設(shè)計(jì)定義常規(guī)的數(shù)據(jù)接口層。 具體而言,設(shè)計(jì)者可以根據(jù)業(yè)務(wù)需求設(shè)計(jì)Service層和Dao 層,然后直接在PageProcessor 組件內(nèi)部使用process 方法,增加數(shù)據(jù)保存的業(yè)務(wù)代碼。 這種方式的優(yōu)勢是降低了學(xué)習(xí)成本,提高了系統(tǒng)設(shè)計(jì)開發(fā)的效率,但其缺點(diǎn)是增加了系統(tǒng)模塊的耦合性,不利于后期的代碼維護(hù)。

        4 結(jié)語

        針對一般網(wǎng)頁爬蟲系統(tǒng)設(shè)計(jì)具有的特殊性和場景單一性,本文提出了一種基于WebMagic 框架的具有可適用性和可擴(kuò)展性的系統(tǒng)設(shè)計(jì)。 系統(tǒng)設(shè)計(jì)人員若采用這一系統(tǒng)的設(shè)計(jì)方案,可以更好地搭建自己的爬蟲項(xiàng)目,構(gòu)建可用性和健壯性更好的數(shù)據(jù)系統(tǒng)。 本文提出的系統(tǒng)仍存在較大的可完善空間,比如設(shè)計(jì)者可以繼續(xù)優(yōu)化增量爬蟲數(shù)據(jù)的備份以及解決去重問題等,以進(jìn)一步提升系統(tǒng)功能的完善性。

        猜你喜歡
        爬蟲設(shè)計(jì)者代碼
        利用網(wǎng)絡(luò)爬蟲技術(shù)驗(yàn)證房地產(chǎn)灰犀牛之說
        基于Python的網(wǎng)絡(luò)爬蟲和反爬蟲技術(shù)研究
        2020德國iF設(shè)計(jì)獎(jiǎng)
        2019德國IF設(shè)計(jì)大獎(jiǎng)
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        利用爬蟲技術(shù)的Geo-Gnutel la VANET流量采集
        電子測試(2018年1期)2018-04-18 11:53:04
        大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲技術(shù)
        電子制作(2017年9期)2017-04-17 03:00:46
        亚洲精品中文字幕一二| 国产精品毛片一区二区三区 | 亚洲成av人片在线观看麦芽 | 一边摸一边抽搐一进一出口述 | 伊人久久大香线蕉综合影院首页| 亚洲av熟妇高潮30p| 2021年性爱喷水视频| 国产精品黄页免费高清在线观看| 久久成人精品国产免费网站| 开心久久综合婷婷九月| 欧美日韩精品久久久免费观看| 亚洲另类激情综合偷自拍图| 日本视频精品一区二区| 久久综合国产精品一区二区| 国产亚洲欧美精品永久| 日本老熟妇毛茸茸| 乱人伦视频69| 久久色悠悠亚洲综合网| 五月激情四射开心久久久| 一边摸一边做爽的视频17国产| a级毛片免费观看在线| 久精品国产欧美亚洲色aⅴ大片| 色优网久久国产精品| 国产精品自拍视频免费观看| 不卡一区二区视频日本| 伊人久久大香线蕉亚洲五月天 | 男人激烈吮乳吃奶视频免费| 亚洲AⅤ精品一区二区三区| 蜜桃视频成年人在线观看| av免费在线播放视频| 最近在线更新8中文字幕免费 | 风韵人妻丰满熟妇老熟| 国产精品久久久久9999赢消| 521色香蕉网站在线观看| 91青青草视频在线播放| 无码a级毛片免费视频内谢5j| 三上悠亚久久精品| 五月天婷婷一区二区三区久久| 亚洲一区二区三区激情在线观看| 亚洲精品乱码8久久久久久日本| 中文字幕国产91|