打造轻量级可视化数据爬取工具-菩提
作者:jiaqiangwang,騰訊 IEG 后臺開發工程師
背景
在大數據及機器學習日益火爆的今天,數據作為基石發揮了至關重要的作用。網頁內容爬取作為數據的一個重要補充來源,數據爬取開發成了一個必不可少的工作。
在業界,普遍的做法是采用 scrapy 等框架不斷進行 case by case 的爬取代碼編寫,這種做法在需求量逐漸增大后會出現大量重復工作、大量針對某個網站或需求開發的特殊邏輯等,導致技術不能持續積累沉淀、開發耗時長、維護壓力越來越大。
我們在調研了業界最新動態后,決定開發一款輕量級的可視化定向數據爬取工具來解決上述問題。我們將它命名 bodhi,中文名:菩提,寓意在“菩提本無數(據)”。
本文只是提供一種思路、一種工具,使用者自身需要合規使用。
同類工具一覽
在數據爬取領域,可供選擇的工具非常多,比如以 scrapy 為代表的開源工具包、以 portia、八爪魚為代表的可視化數據爬取工具;
下面我們從是否需要使用者有技術背景、是否支持動態網頁、是否免費、是否開源、是否能夠靈活支持需求、是否輕量級應用幾個方面對上面列舉的工具進行對比。
注:以上對比基于當前最新版本,其中,scrapy 1.74, portia 2.08, 八爪魚 8.0。
scrapy 是一個非常優秀的開源框架,但是需要編碼,使用技術門檻較高,跟我們的初衷不符;
portia 是應該是第一個開源的可視化 web 數據爬取工具,想法非常好,但是僅支持靜態網頁,沒有對動態網頁提供支持,在幾乎全是動態網頁的今天明顯不能完成大多數頁面的提取;
八爪魚是國內使用量最大的商業數據爬取工具之一,提供客戶端,其免費版無法做到大規模、7*24 小時的持續爬取,無法滿足工業化應用;
為了更快更好的支撐業務上不斷增長的需求,我們期望有一個適配性很廣,能夠大規模不間斷爬取數據的工具幫我們解決工作中遇到的問題。2018 年底,在公司內外沒有找到一個可以充分滿足需求的數據爬取工具的情況下,我們在充分調研了 portia 和八爪魚后,期望能夠自研一款可以支持瀏覽器即開即用的、低技術門檻、能夠支持絕大多數需求、成熟后能夠開源的可視化網頁數據爬取工具。
技術選型
我們明確了目標:輕量、低門檻、通用性強的網頁數據爬取工具。
輕量:我們拋棄客戶端,采用網頁來實現即開即用;將功能邊界限定到只做網頁文字的下載功能,放棄不必要的周邊功能使其更加簡潔;
低門檻:盡量模擬人們在瀏覽網頁時的使用習慣完成配置,做到產品同學可以自行完成需求開發;
通用性強:采用無頭瀏覽器模擬 web 瀏覽器,整體上比 http 請求更通用。
bodhi 工具簡介
bodhi(菩提)是一款可視化的數據爬取工具,力求讓用戶通過模擬日常瀏覽網頁習慣就可以在網頁上提取自己所需要的數據。
人類在上網時主要通過鼠標的點擊、滾動以及鍵盤的輸入來完成頁面瀏覽,大家已經習慣這種使用方式,我們在這基礎上進行抽象總結,除了提供基礎的點擊、滾動、輸入動作,還提供了更高級的選擇相似元素、提取內容、翻頁等操作方便用戶更加便捷的完成任務配置;
bodhi 采用流程圖模式,大多數情況下,用戶不需要對流程圖進行直接操作,流程圖更多的是作為一個可視化的配置,用戶可以通過可視化的點選網頁上的元素來完成后續操作,完全符合人工瀏覽網頁的思維習慣。
這里通過一些關鍵詞介紹一下 bodhi,具體的技術細節由于篇幅有限這里不會展開。
嵌入式頁面
我們采用 B/S 架構,需要在我們的頁面內嵌欲爬取的頁面,這里我們并沒有采用 iframe 直接嵌入頁面,因為這樣做,一方面有些網站不能直接通過 iframe 打開,另一方面如果使用 iframe,用戶在 iframe 中進行點擊(比如打開另一個網頁)、輸入會產生不可控的行為。
我們采用在后臺通過無頭瀏覽器模擬用戶打開的瀏覽器,可以把它理解為一個“傀儡”,這個“傀儡”根據用戶發送的 URL 打開網頁,并監聽網頁變化,將二次加工后的網頁內容實時增量同步到前端進行展示。用戶后續仍然可以繼續發送點擊、輸入等動作指令,操控“傀儡”所打開的網頁。
下圖紅框部分為采用上述方式打開的一個網頁。
靈活選取
例如我想要選擇下圖中的所有具體游戲,而非游戲類型(單機游戲)或具體站點(愛玩),就可以得到下圖所示的圖例,其中紅色及藍色代表已經選中的內容。
bodhi可以通過讓用戶不斷的選擇、反選操作來最終確認需要爬取的內容。
智能提取
大多數網頁都是一篇文章,而這些文章的排版又不盡相同,如果通過適配不同的文章模板來提取內容,必將導致工作量大增,所以有必要提供一個相對智能的網頁內容提取組件完成這個工作。
下圖紅框部分,bodhi 通過一個“文章識別”組件可以快速提取文章內容。
循環翻頁
一般網頁都存在翻頁的 case,對于存在“下一頁”的情況,我們可以通過不斷點擊“下一頁”完成所有內容的遍歷,但是對于沒有“下一頁”按鈕的情況就會比較復雜,所以我們做了一個循環翻頁功能,可以應對所有翻頁的情況。
比如下圖的情況,只提供了“最后一頁”按鈕,在翻頁過程中,會不斷有新的頁碼出現,如果沒有智能翻頁功能將會非常痛苦。
調試
為了保證用戶在配置及后續維護過程中知道到底做了什么,存在什么問題,我們也做了一個簡版的調試功能,幫助用戶方便調試。下圖紅框部分為調試界面。
分布式部署
采用無頭瀏覽器的一個弊端就是爬取效率相對低下,為了保障爬取效率,bodhi 一方面進行了基于騰訊云的分布式部署,同時在單機上也對單爬取任務進行并行切分來實現加速。
robots 協議支持
robots 協議作為網站與爬蟲之間的君子協議,用于保證網站的隱私等信息。我們也支持在后臺做數據爬取時遵守 robots 協議,讓 bodhi 成為一個文明、君子的工具。
存在問題及后續規劃
當然,我們的 bodhi 并非完美,最多算是一個剛剛及格的工具,有很多待完善的地方,比如我們天然不支持頁面嵌入 iframe 內容的爬取、操作流暢度上有很大提升空間等,這些都是我們后續需要繼續努力完善的。
我們也希望更多的人能夠使用它提高工作效率,更多對數據爬取技術感興趣的人可以一起開發、完善 bodhi,打造一個更強大的數據爬取工具!
總結
以上是生活随笔為你收集整理的打造轻量级可视化数据爬取工具-菩提的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯云TStack获“下一代云计算技术创
- 下一篇: 由STGW下载慢问题引发的网络传输学习之