版權聲明:本文由文智原創文章,轉載請註明出處:
文章原文連接:https://www.qcloud.com/community/article/91html
來源:騰雲閣 https://www.qcloud.com/community正則表達式
隨着大數據時代的到來,一個大規模生成、分享、處理以及應用數據的時代正在開啓。若是能將互聯網上異源異構的非結構化或半結構化數據轉換爲更易處理的結構化數據,能夠極大的下降獲取數據的門檻,爲信息檢索和數據挖掘提供基礎,更好的挖掘數據中蘊藏的價值。api
單純考慮網頁這種半結構化數據的抽取:對於搜索引擎通常須要抽取出頁面的標題、實際標題、時間、正文等關鍵信息;而對於去哪兒、攜程這種酒店預約網站則須要進行更精細化的信息抽取,須要抽取出酒店名稱、地址、電話、價格、評分、簡介等具體屬性。瀏覽器
能夠看到,大量互聯網產品都依賴抽取功能,所以迫切須要一個方便、便捷、高效且準確的網頁抽取平臺。架構
目前針對html這種半結構化的頁面,業界比較流行的抽取方法大體就兩類:dom樹分塊以及模版抽取。框架
該方法的基本思想就是對html頁面建dom樹後,對dom樹進行遍歷,同時根據事先訓練好的分類模型判斷遍歷到的容器節點的語義塊類別,本質上就是分類問題。好比對新聞網頁,通常定義的語義塊類別有標題、實際標題、時間、正文、相關推薦、相關閱讀、版權、廣告等。若是用分類模型進行語義塊判斷,須要用事先標註好的樣本進行訓練。採用的特徵集合包括該節點下的文本長度、特定關鍵詞命中狀況、標點符號個數、圖片個數、標籤寬度、各類html標籤的分佈狀況等等。dom
經過模型預測節點的語義塊類別會有幾個候選,總體上會獲得若干語義塊組合序列,最後能夠再用語言模型的思路獲得一個最優序列。異步
該方法的優勢是通用性強,主要工做包括定義新類別頁面的語義塊類別、樣本標註、訓練模型、抽取程序,通常用於大規模網頁的處理;缺點是通常抽取到的語義塊比較粗,精度不高。另外樣本標註也須要大量的人力成本和時間成本。工具
針對下面這個頁面
圖2.1 豆瓣電影詳情頁學習
咱們但願抽取導演、編劇、主演、類型、語言、上映日期等字段的信息, dom樹分塊的方法就不太適用了。由於這塊區域總體上屬於一個容器節點,子節點的特徵方面區分度也不大。
所以有了第二類抽取方法:模版類抽取。該方法的基本思想很簡單:事先配置好須要抽取內容的模版,模版能夠是正則表達式或XPATH, 而後基於html進行精確的模版匹配,將匹配結果輸出。該方法的優勢是能夠實現精細化抽取,缺點是模版的配置和維護成本較高。如正則抽取比較依賴頁面中的wording,把wording做爲樁,提取出樁周圍的有用信息,所以對配置人員的正則能力要求比較高。
精細化抽取如今業界採用比較多的是XPATH,XPATH做爲XML文檔路徑標準語言,經過路徑表達式來定位與查找XML文檔中的節點。使用XPATH進行精細化抽取的優勢有:
(1)不少主流的瀏覽器都提供獲取指定節點XPATH路徑的功能,或者能夠經過嵌入的JavaScript代碼從DOM中獲取XPATH路徑,所以易於實現可視化配置,下降配置門檻。
(2)XPATH依賴頁面DOM結構。而實際上一個網站或者一個子域下的頁面結構確實大致同樣,或者基本能夠窮舉,所以配置一組XPATH每每能夠覆蓋一個子域甚至一個站點下的頁面。
(3)做爲XML標準集下的一個重要標準,XPATH被廣大廠商接受並推廣,已經有不少開源且成熟的實現,所以更易獲得社區的普遍支持。
本篇重點介紹咱們在XPATH模版抽取方面作的工做,包括如何使配置簡單化、如何對抽取的結果進行去噪、如何維護模版的更新、如何快速接入抽取等等;
在開始介紹抽取平臺以前,先看看剛纔那個豆瓣頁面咱們的抽取效果:
圖2.2 豆瓣電影詳情頁抽取結果
系統分爲配置管理、XPATH抽取以及去噪處理三個主要模塊:
(1) 配置管理:負責配置的管理、更新與分發。
(2) XPATH抽取:根據配置的XPATH抽取頁面中指定的屬性。
(3)去噪處理:對抽取的結果作去噪處理。
圖3.1 抽取平臺總體框圖
爲了下降配置門檻,作到人人可配、人人會配,所以在設計和實現模板配置的UI和交互的過程儘可能作到簡潔明瞭、輕量級、引導式交互、及時響應等原則。
圖3.2 XPATH配置頁面
整個抽取過程比較簡單,所以直接使用流程圖來講明抽取過程。
圖3.3 XPATH抽取流程
雖然XPATH的抽取能精確到元素粒度,但不少時候仍然有大量的噪音存在。爲此,咱們提供了四個方面的噪音過濾規則:
(1)文本規則:經過配置正則表達式將屬性值中的噪音去除。
(2)URL規則:針對連接元素,經過配置URL規則,將href屬性不知足URL規則的節點過濾掉。
(3)元素屬性規則:經過配置標籤的屬性規則進行噪音過濾。
(4)html規則:經過配置起始串與結束串,將html中以起始串開始,以結束串終止的子串過濾掉。
圖3.4 噪音過濾規則配置頁面
在實現的過程當中,發現有一類屬性的屬性值是一個List,List內元素之間是並列的。好比專輯《吻別》頁面中,名稱、歌手、發行時間等字段屬於普通屬性,但專輯下的曲目則屬於List類型的屬性。
圖3.5 百度音樂專輯頁
List元素XPATH有如下特色:擁有一個相同的祖先節點,從該祖先節點開始節點名稱、層次以及深度都徹底相同,而且在某個或某幾個層級上是平行關係(偏移不同)。上述專輯頁中任意兩首歌曲的XPATH即知足該特色:
《戀愛的人都同樣》:/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[8]/div/span[5]/a
《擁抱陽光》:/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[9]/div/span[5]/a
根據這一特徵,爲了更好的表達和抽取這類屬性值,咱們將上面歌曲屬性的XPATH虛化爲:
/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[%d]/div/span[5]/a
其中%d做爲佔位符,抽取匹配的時候會具體化爲實際的數字。
List屬性的抽取流程爲:
圖3.6 List屬性抽取流程
平臺通過近一年的持續迭代和運營,各項指標趨於穩定;平臺的穩定性和可靠性獲得驗證;運營工具趨於完備,監控告警也基本作到全方位無死角。下面從三個方面來講明:
(1)運營指標:各項指標都在穩步上升,數據質量也在持續提升。數據在Qzone資訊推薦、QQ音樂搜索以及部門內數據挖掘類需求中獲得應用,數據質量經受住了業務的考驗。
最近兩週系統主要運營指標以下,能夠看到各項指標穩中有升,系統的運營情況良好。
日期 | 站點數 | URL模板數 | XPATH模板數 | 網頁數 | 抽取成功數 | 成功率 |
---|---|---|---|---|---|---|
2014-10-23 | 179 | 1159 | 2914 | 57,345,499 | 52,545,262 | 91.63% |
2014-10-27 | 183 | 1168 | 293158,736,758 | 53,096,224 | 90.40% | |
2014-11-03 | 203 | 1295 | 3069 | 68,272,962 | 62,444,849 | 91.46% |
表3.1 平臺運營指標
(2)運營工具:提供了下載診斷與查詢、快照查詢、抽取檢查、標準集驗證、模板評測、抽樣驗證、抽取診斷等一系列的運營診斷工具。從配置、下載、快照、抽取到最終數據等環節都力爭作到可運營。
(3)監控告警:結合一年以來暴露的運營問題,不斷豐富對抽取各項指標的監控,提升系統的可用性和可靠性。目前主要告警有總體抽取失敗報警以及模板抽取成功率跌幅超過閾值報警。
經過上面的XPATH抽取平臺,咱們已經具有將互聯網上大部分網頁轉換爲結構化數據的能力。可是對於互聯網上存在的「暗網」數據,因爲其自身的特殊性,須要專門設計和優化咱們的下載和抽取系統,下面主要介紹咱們在這方面的思考和解決方案。
WEB2.0時代,隨着用戶對WEB應用的體驗要求愈來愈高,大量相關技術應運而生,特別是AJAX技術的興起,使得WEB應用的用戶體驗接近客戶端類的體驗,所以被業界普遍採用。這類應用的架構大致是這樣的:
圖4.1 AJAX請求流程
這類富WEB應用對於用戶來講比較友好,卻對信息檢索提出了考驗。現今的搜索引擎爬蟲大部分仍是基於頁面之間的連接關係,但對於這種沒法經過超連接擴散以及抓取的動態網頁,則沒法被搜索引擎收錄, 所以造成所謂的「暗網」。
另外,隨着移動互聯網的興起,信息出現了多元化、異構化及碎片化的趨勢。大量數據從WEB端向移動端轉移,甚至有不少數據就是爲移動端而生的。這類數據的典型特色是,經過常規的頁面連接沒法獲取,造成一個一個的信息孤島。爲了解決數據獲取問題,業界主要從下面兩個方面入手:
(1)開發更強大的爬蟲系統,以應對信息的孤島化。從相關新聞能夠看到:百度針對搜索引擎的升級和更新中,很大一部分與解決「暗網」問題有關。
(2)與「暗網」網站合做,數據廠商經過平臺方開發的API提交結構化的數據,來達到信息的互聯互通。像google前不久推出的應用內搜索,就是經過這種方式試圖打破信息壁壘。
經過大量的案例分析,發現存在兩個方面的問題:
(1)下載擴散
對於常見的網頁,咱們能夠經過頁面之間天然的連接關係被爬蟲抓取,可是這類暗網頁面每每沒法經過正常的連接關係獲取,接口之間是獨立的。所以要擴散到這類動態接口,必須經過特殊的規則生成它們。這裏咱們概括並抽象了一類特殊的模板類型:連接工廠模板,該模板是專門用來生產URL的。根據URL中可變的參數,在類型下咱們會預約義n個屬性參數。而後經過定義一個URL拼接規則,將連接工廠類頁面中抽取出來的屬性填充到URL拼接規則中,生成最終的數據接口URL。整個URL生成流程以下:
圖4.2 URL生成與擴散流程
(2)抽取
咱們的抽取平臺是基於XPATH的, 所以對於接口數據格式爲XML的異步HTTP請求,咱們只要經過上面的方法生成並下載便能進行抽取。但在富WEB應用中JSON已經成爲普遍採用的數據格式,爲了接入上面的抽取框架, 這裏咱們採用的是將JSON數據轉換成XML格式的方法,而後使用XPATH進行抽取。
圖4.3 JSON數據抽取
能夠看到,上述對暗網頁面的下載與抽取比較好的適配在原有框架裏,僅僅增長了一種連接工廠模板用於連接擴散,以及在抽取環節增長了一個數據類型轉換的適配器模塊。
在Qzone資訊推薦項目開發及運營的的過程當中,發現今日頭條新聞列表頁都是採用AJAX的方式加載的,經過抓包以及分析源碼發現,今日頭條推薦頻道的數據接口地址爲:
http://www.toutiao.com/api/article/recent/?category=__all__&count=100&max_behot_time=(time_stamp).00&offset=0&utm_source=toutiao
圖4.4 今日頭條推薦頻道異步HTTP請求
圖4.5 今日頭條發起異步HTTP請求的JS代碼
該接口是JSON格式的接口,而新聞詳情頁的URL爲JSON中的一個字段,如圖所示:
圖4.6 今日頭條JSON數據字段詳情
咱們將JSON轉換爲XML文檔,轉換後的結果爲:
圖4.7 轉換爲XML的今日頭條接口數據
標紅的部分即爲新聞詳情頁的URL,能夠經過正常的XPATH抽取出來,而後將該URL推給下載系統下載。經過這種特殊的擴散方法,今日頭條的新聞才得以被下載系統下載,進而經過XPATH進行抽取。
將來但願在如下幾個方面進行改進和優化,使得結構化抽取平臺愈來愈完善。
同時歡迎有需求的團隊聯繫咱們,使用騰訊文智天然語言處理。