爬蟲的工作流程大致如下茴肥,
下載html --> 提取內(nèi)容與url --> 調(diào)度 --> 繼續(xù)下載...
今日打算談談我對于提取內(nèi)容與url的看法。
傳統(tǒng)方案
xpath,××soup,××query之類的庫荡灾,實現(xiàn)簡單瓤狐,而且可以直接從瀏覽器中拷貝路徑。其實就是默認html中的元素都有嚴格規(guī)范的標簽批幌。(不過很多html都寫得很隨意础锐,拷貝的xpath是經(jīng)過瀏覽器容錯修改后的,到手后常常需要繼續(xù)調(diào)試)
這種做法和瀏覽器解析網(wǎng)頁十分類似荧缘,稱之為“精準定位”皆警。瀏覽器對于元素的呈現(xiàn)規(guī)則十分嚴格,并不會在意href是內(nèi)鏈還是外鏈截粗,也不會遺漏html中的次要元素信姓,甚至并不會區(qū)分元素的“重要性”。顯然嚴格遵循這套規(guī)則去解析網(wǎng)頁绸罗,對轉(zhuǎn)移信息到數(shù)據(jù)庫中并沒有啥幫助意推,例如數(shù)據(jù)源來自1000個站點,或許就需要寫1000套提取方案珊蟀,并作出后期維護菊值。
提取url
可以總結(jié)站點對于信息呈現(xiàn)的規(guī)律,以常見的類似書籍的“目錄-內(nèi)容”結(jié)構為例育灸。
- 目錄下腻窒,一定包含內(nèi)容的鏈接,以及指向下一頁或者前一頁的鏈接
- 目錄的url與其他目錄url相似磅崭,內(nèi)容頁url與其他內(nèi)容u頁url相似儿子。
相信這兩點對于大部分網(wǎng)站都適用,難點在于大型網(wǎng)站url的深度更深砸喻,結(jié)構可能更加復雜柔逼。但是,以此為立足點去看待原有的問題恩够,就會非常簡單--僅僅需要計算url的相似度卒落。我希望的方案是盡量符合人的判斷標準羡铲,將url進行拆分蜂桶。python3中urllib.parse.urlparse 將url解析成好幾個片段,基于這些片段可以做出統(tǒng)計也切,然后給定一個閾值就可以做一個簡單的分類扑媚。
提取正文
為了更好的表達腰湾,我對于常見文本類html內(nèi)容作出一下劃分
- 定義: 主體,背景疆股,分支费坊,噪音
- 主體,html主要信息呈現(xiàn)
- 背景旬痹,區(qū)分不同站點附井,網(wǎng)站基本介紹-內(nèi)鏈-js腳本,和主體在一個量級
- 分支两残,主體的不同段落永毅,呈現(xiàn)主體的結(jié)構
- 噪音,夾在在分支之間的無關信息人弓,比如會員登錄提示沼死,和分支一個量級
以百度搜索的結(jié)果頁為例,頂部的搜索欄與右邊的推薦我認為是背景崔赌,整個搜索結(jié)果我認為是主體意蛀,各個相關搜索結(jié)果是分支,其中的“商業(yè)推廣”我認為是噪音健芭。
同一站點內(nèi)
- 假設
- 背景與主體的位置一致
- 背景相似县钥,甚至相同
- 相似主題的html噪音相似
對于相同的背景可以對比兩個html的將其去除,甚至js腳本可以根據(jù)在dom樹里的tag直接去除吟榴。通常到這一步已經(jīng)可以獲取比較干凈的內(nèi)容魁蒜,比如想離線瀏覽小說的宅友們。后面難點在于對于噪音的清洗吩翻,如果噪音與背景一樣都是完全相同或者說是js腳本兜看,或者有類似“推廣”的標簽,那就很容易狭瞎。目前還在探索中细移。
總結(jié)
基于html標簽的做法,“假設每個元素都有唯一的標簽”熊锭,足夠通用(本來就是標記語言)但不細致弧轧。那么想作出通用爬蟲,就必須作出通用并且細致的假設碗殷。