爬取網站數據(騰訊輕量級可視化數據爬取工具)

| 作者: 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,打造一個更強大的數據爬取工具!


本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.xiaosb.com/beian/51682/