張萌
摘? 要:對于網(wǎng)絡(luò)爬蟲來說,頁面都是“靜態(tài)”的。在實際的HTML頁面中,靜態(tài)的數(shù)據(jù)很少,并且很多數(shù)據(jù)通常通過異步刷新的方式填充到頁面中。如何在靜態(tài)頁面中捕獲異步刷新填充的數(shù)據(jù)是網(wǎng)絡(luò)爬蟲研究的關(guān)鍵。為了解決異步刷新獲取的問題,多個相互關(guān)聯(lián)的HTTP請求被合并,并加以解析。此外,進一步提出了頁面集的概念,即對需要抓取的數(shù)據(jù)進行歸類,將同一被抓取的鏈接中所有的請求鏈接歸在同一個集合中進行處理,使得數(shù)據(jù)的層次更清晰。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲? 靜態(tài)頁面? 請求? 異步刷新? 頁面集
中圖分類號:TP393? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻標(biāo)識碼:A? ? ? ? ? ? ? ? ? ? ? 文章編號:1674-098X(2020)08(c)-0127-03
Abstract: For web crawlers, the pages are all "static". In actual HTML pages, there is very little static data, and a lot of data is usually filled into the page by asynchronous refresh. How to capture asynchronously refreshed and filled data in static pages is the key to web crawler research. In order to solve the problem of asynchronous refresh acquisition, multiple interrelated HTTP requests are merged and parsed. In addition, the concept of page set is further proposed, that is, to classify the data that needs to be crawled, and to process all the requested links in the same crawled link in the same set for processing, so that the data hierarchy is clearer.
Key Words: Web crawler; Static page; Request;Asynchronous refresh; Page set
網(wǎng)絡(luò)爬蟲[1]是一種計算機程序或自動腳本,可根據(jù)人們設(shè)置的規(guī)則自動獲取或下載網(wǎng)絡(luò)信息。使用網(wǎng)絡(luò)爬蟲來采集信息,對數(shù)據(jù)進行一定的過濾后,利用大數(shù)據(jù)分析,能夠總結(jié)經(jīng)驗、發(fā)現(xiàn)規(guī)律、預(yù)測趨勢、輔助決策。它不僅可以充分利用和釋放海量數(shù)據(jù)資源所包含的巨大價值,而且可以促進新一代信息技術(shù)與各行各業(yè)之間的深度耦合和交叉創(chuàng)新[2]。
傳統(tǒng)的網(wǎng)絡(luò)爬蟲存在著一定的局限性,本文在開源網(wǎng)絡(luò)爬蟲框架WebMagic的基礎(chǔ)上,對異步刷新頁面內(nèi)容的抓取進行研究,擬提出頁面集的概念,使得網(wǎng)絡(luò)爬蟲可以高效、平穩(wěn)地運行,從而提高網(wǎng)絡(luò)爬蟲的采集效率,降低運維成本。
1? 異步刷新頁面的研究
1.1 目前爬蟲存在的問題
當(dāng)前,網(wǎng)頁中大多數(shù)有用的數(shù)據(jù)都是通過Ajax來動態(tài)獲取的,還有一些Ajax的請求參數(shù)是依賴于JavaScript動態(tài)生成的。JavaScript可以執(zhí)行的某些操作,是爬蟲程序很難甚至不能模仿的[3]。實際上,這些弊端是由搜尋器不是瀏覽器并且沒有JavaScript解析引擎引起的。為了解決這個問題,主要的應(yīng)對策略是將JavaScript引擎引入網(wǎng)絡(luò)爬蟲。但是,這樣做有明顯的缺點。例如,當(dāng)服務(wù)器同時執(zhí)行多個爬取任務(wù)時,將會浪費太多的資源。另外,這些無窗口的JavaScript引擎通常不用作瀏覽器環(huán)境。當(dāng)頁面內(nèi)有跳轉(zhuǎn)時,將使過程難以控制[3]。
1.2 頁面集
傳統(tǒng)獲取異步刷新頁面的方案是:爬蟲取得URL之后,交給無頭瀏覽器渲染。這種方法處理起來比較簡單,但是也存在性能的問題。頁面集是本文提出的一個新的概念,即對需要抓取的數(shù)據(jù)進行歸類,將同一被抓取的鏈接中所有的請求鏈接歸在同一個集合中進行處理[4],使得數(shù)據(jù)的層次更清晰。
當(dāng)種子URL中存在接口異步刷新的數(shù)據(jù),且需要建立多層級聯(lián)任務(wù)時,解決方案如下:
(1)通過網(wǎng)頁調(diào)試工具postman向系統(tǒng)發(fā)送前端請求。
(2)當(dāng)構(gòu)建級聯(lián)任務(wù)時,對新的待下載URL進行分析。當(dāng)系統(tǒng)判斷出待下載URL中包含特定的標(biāo)簽時,表示該URL包含接口異步刷新的數(shù)據(jù)。從待下載URL中提取對應(yīng)接口參數(shù)的值,作為下一層級聯(lián)任務(wù)的起始請求參數(shù)[5]。
(3)在下一層級聯(lián)任務(wù)中,根據(jù)baseUrl和步驟(2)中系統(tǒng)解析出的接口參數(shù),可以獲得第二層級聯(lián)任務(wù)的接口異步刷新數(shù)據(jù)。更多層的級聯(lián)任務(wù),均以此類推。
(4)將來自同一個父任務(wù)的鏈接,通過for循環(huán)批量獲取接口參數(shù)。并且,批量構(gòu)造任務(wù)提交到待下載隊列中。
(5)采用rootJobId、parentJobId和jobId這三個參數(shù),記錄鏈接之間的級聯(lián)關(guān)系以及構(gòu)造頁面集。算法流程見圖1所示。
當(dāng)請求傳遞到持久化模塊時,對任務(wù)的執(zhí)行采取的是責(zé)任鏈模式。對本系統(tǒng)來說,將不同類型的接口定義為不同的處理節(jié)點,使用parallelStream()遍歷責(zé)任節(jié)點,并發(fā)地執(zhí)行每個責(zé)任節(jié)點。
2? 對比實驗
為了對比頁面集的抓取效率和無頭瀏覽器的抓取效率,現(xiàn)將級聯(lián)深度分別定為3和4,對同一個URL進行抓取。
當(dāng)級聯(lián)深度為3時,無頭瀏覽器的抓取時間是4min3s,而頁面集的抓取時間僅需2s。當(dāng)級聯(lián)深度為4時,采用無頭瀏覽器進行抓取時,內(nèi)存幾乎被占滿而導(dǎo)致無法繼續(xù)執(zhí)行下去,需要通過限制最大同時打開窗口數(shù)來解決此問題。這種方式的弊端是限制了無頭瀏覽器的并發(fā)量。
無頭瀏覽器最大的弊端,就是依賴于瀏覽器,且非常耗資源,嚴(yán)重影響了整體的并行抓取能力。而頁面集是純服務(wù)接口級抓取,吞吐量極高,不會隨級聯(lián)深度的增加導(dǎo)致服務(wù)性能下降。
3? 結(jié)語
本系統(tǒng)僅以京東的商品鏈接為例,進行接口異步刷新數(shù)據(jù)的抓取。因為不同的網(wǎng)站HTML的參數(shù)不盡相同,無法用統(tǒng)一成一種相同的格式。針對不同的網(wǎng)站,進行接口異步刷新數(shù)據(jù)的抓取時,需要根據(jù)用戶的需求進行定制化修改。而且,一個京東商品鏈接中,縱向的相關(guān)商品鏈接與橫向的相關(guān)商品鏈接的接口都不相同。也就是說,當(dāng)我們對京東商品鏈接進行數(shù)據(jù)抓取時,首先要分析一個HTML頁中,有哪些數(shù)據(jù)是由接口異步刷新填充的。其次,要分析這些接口是不是同一種接口。如果不是同一種接口,該如何獲取每一個接口異步刷新的數(shù)據(jù)。本系統(tǒng)針對不同的接口采取了不同的抓取數(shù)據(jù)的方式,是否能將不同的接口采用更簡化的方式進行數(shù)據(jù)的抓取,仍是今后需要討論研究的問題。
本系統(tǒng)的優(yōu)勢在于,遇到不同的網(wǎng)站,只需要分析該網(wǎng)站的異步接口請求參數(shù),擴充處理節(jié)點即可[6]。這種方式的好處在于程序的延展性好,避免了針對不同風(fēng)格的網(wǎng)站開發(fā)相應(yīng)爬蟲的繁瑣工作,節(jié)約了資源的同時使系統(tǒng)易于維護。
參考文獻
[1] Kevin.網(wǎng)絡(luò)爬蟲技術(shù)原理[J].計算機與網(wǎng)絡(luò),2018,578(10):41-43.
[2] 張鵬.工信部解讀《大數(shù)據(jù)綱要》:推動信息技術(shù)與傳統(tǒng)產(chǎn)業(yè)深度耦合、交叉創(chuàng)新[J].通信世界,2015(25):5.
[3] 沈春澤,李加慶.“放下你手里的代碼”:爬蟲技術(shù)的善與惡、罪與罰[EB/OL].(2019-10-29).https://www.chinaz.com/news/2019/1029/1058770.shtml.
[4] 歐陽春.支持動態(tài)網(wǎng)頁解析的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計與實現(xiàn)[D].南京:東南大學(xué),2017.
[5] 馬蕾.分布式爬蟲技術(shù)研究與實現(xiàn)[D].撫順:遼寧石油化工大學(xué),2019.
[6] 樊宇豪.基于Scrapy的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)設(shè)計與實現(xiàn)[D].成都:電子科技大學(xué),2018.