張萌

摘? 要:對于網絡爬蟲來說,頁面都是“靜態”的。在實際的HTML頁面中,靜態的數據很少,并且很多數據通常通過異步刷新的方式填充到頁面中。如何在靜態頁面中捕獲異步刷新填充的數據是網絡爬蟲研究的關鍵。為了解決異步刷新獲取的問題,多個相互關聯的HTTP請求被合并,并加以解析。此外,進一步提出了頁面集的概念,即對需要抓取的數據進行歸類,將同一被抓取的鏈接中所有的請求鏈接歸在同一個集合中進行處理,使得數據的層次更清晰。
關鍵詞:網絡爬蟲? 靜態頁面? 請求? 異步刷新? 頁面集
中圖分類號:TP393? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻標識碼: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
網絡爬蟲[1]是一種計算機程序或自動腳本,可根據人們設置的規則自動獲取或下載網絡信息。使用網絡爬蟲來采集信息,對數據進行一定的過濾后,利用大數據分析,能夠總結經驗、發現規律、預測趨勢、輔助決策。它不僅可以充分利用和釋放海量數據資源所包含的巨大價值,而且可以促進新一代信息技術與各行各業之間的深度耦合和交叉創新[2]。
傳統的網絡爬蟲存在著一定的局限性,本文在開源網絡爬蟲框架WebMagic的基礎上,對異步刷新頁面內容的抓取進行研究,擬提出頁面集的概念,使得網絡爬蟲可以高效、平穩地運行,從而提高網絡爬蟲的采集效率,降低運維成本。
1? 異步刷新頁面的研究
1.1 目前爬蟲存在的問題
當前,網頁中大多數有用的數據都是通過Ajax來動態獲取的,還有一些Ajax的請求參數是依賴于JavaScript動態生成的。JavaScript可以執行的某些操作,是爬蟲程序很難甚至不能模仿的[3]。實際上,這些弊端是由搜尋器不是瀏覽器并且沒有JavaScript解析引擎引起的。為了解決這個問題,主要的應對策略是將JavaScript引擎引入網絡爬蟲。但是,這樣做有明顯的缺點。例如,當服務器同時執行多個爬取任務時,將會浪費太多的資源。另外,這些無窗口的JavaScript引擎通常不用作瀏覽器環境。當頁面內有跳轉時,將使過程難以控制[3]。
1.2 頁面集
傳統獲取異步刷新頁面的方案是:爬蟲取得URL之后,交給無頭瀏覽器渲染。這種方法處理起來比較簡單,但是也存在性能的問題。頁面集是本文提出的一個新的概念,即對需要抓取的數據進行歸類,將同一被抓取的鏈接中所有的請求鏈接歸在同一個集合中進行處理[4],使得數據的層次更清晰。
當種子URL中存在接口異步刷新的數據,且需要建立多層級聯任務時,解決方案如下:
(1)通過網頁調試工具postman向系統發送前端請求。
(2)當構建級聯任務時,對新的待下載URL進行分析。當系統判斷出待下載URL中包含特定的標簽時,表示該URL包含接口異步刷新的數據。從待下載URL中提取對應接口參數的值,作為下一層級聯任務的起始請求參數[5]。
(3)在下一層級聯任務中,根據baseUrl和步驟(2)中系統解析出的接口參數,可以獲得第二層級聯任務的接口異步刷新數據。更多層的級聯任務,均以此類推。
(4)將來自同一個父任務的鏈接,通過for循環批量獲取接口參數。并且,批量構造任務提交到待下載隊列中。
(5)采用rootJobId、parentJobId和jobId這三個參數,記錄鏈接之間的級聯關系以及構造頁面集。算法流程見圖1所示。
當請求傳遞到持久化模塊時,對任務的執行采取的是責任鏈模式。對本系統來說,將不同類型的接口定義為不同的處理節點,使用parallelStream()遍歷責任節點,并發地執行每個責任節點。
2? 對比實驗
為了對比頁面集的抓取效率和無頭瀏覽器的抓取效率,現將級聯深度分別定為3和4,對同一個URL進行抓取。
當級聯深度為3時,無頭瀏覽器的抓取時間是4min3s,而頁面集的抓取時間僅需2s。當級聯深度為4時,采用無頭瀏覽器進行抓取時,內存幾乎被占滿而導致無法繼續執行下去,需要通過限制最大同時打開窗口數來解決此問題。這種方式的弊端是限制了無頭瀏覽器的并發量。
無頭瀏覽器最大的弊端,就是依賴于瀏覽器,且非常耗資源,嚴重影響了整體的并行抓取能力。而頁面集是純服務接口級抓取,吞吐量極高,不會隨級聯深度的增加導致服務性能下降。
3? 結語
本系統僅以京東的商品鏈接為例,進行接口異步刷新數據的抓取。因為不同的網站HTML的參數不盡相同,無法用統一成一種相同的格式。針對不同的網站,進行接口異步刷新數據的抓取時,需要根據用戶的需求進行定制化修改。而且,一個京東商品鏈接中,縱向的相關商品鏈接與橫向的相關商品鏈接的接口都不相同。也就是說,當我們對京東商品鏈接進行數據抓取時,首先要分析一個HTML頁中,有哪些數據是由接口異步刷新填充的。其次,要分析這些接口是不是同一種接口。如果不是同一種接口,該如何獲取每一個接口異步刷新的數據。本系統針對不同的接口采取了不同的抓取數據的方式,是否能將不同的接口采用更簡化的方式進行數據的抓取,仍是今后需要討論研究的問題。
本系統的優勢在于,遇到不同的網站,只需要分析該網站的異步接口請求參數,擴充處理節點即可[6]。這種方式的好處在于程序的延展性好,避免了針對不同風格的網站開發相應爬蟲的繁瑣工作,節約了資源的同時使系統易于維護。
參考文獻
[1] Kevin.網絡爬蟲技術原理[J].計算機與網絡,2018,578(10):41-43.
[2] 張鵬.工信部解讀《大數據綱要》:推動信息技術與傳統產業深度耦合、交叉創新[J].通信世界,2015(25):5.
[3] 沈春澤,李加慶.“放下你手里的代碼”:爬蟲技術的善與惡、罪與罰[EB/OL].(2019-10-29).https://www.chinaz.com/news/2019/1029/1058770.shtml.
[4] 歐陽春.支持動態網頁解析的分布式網絡爬蟲系統的設計與實現[D].南京:東南大學,2017.
[5] 馬蕾.分布式爬蟲技術研究與實現[D].撫順:遼寧石油化工大學,2019.
[6] 樊宇豪.基于Scrapy的分布式網絡爬蟲系統設計與實現[D].成都:電子科技大學,2018.