文/諸葛ioCEO
關於爬蟲內容的分享,我會分成兩篇,六個部分來分享,分別是:
- 我們的目的是什麼
- 內容從何而來
- 瞭解網路請求
- 一些常見的限制方式
- 嘗試解決問題的思路
- 效率問題的取捨
本文先聊聊前三個部分。
一、我們的目的是什麼
一般來講對我們而言需要抓取的是某個網站或者某個應用的內容,提取有用的價值,內容一般分為兩部分,非結構化的文字,或者結構化的文字。
關於非結構化的資料
1.1 HTML文字(包含java程式碼)
HTML文字基本上是傳統爬蟲過程中最常見的,也就是大多數時候會遇到的情況,例如抓取一個網頁,得到的是HTML,然後需要解析一些常見的元素,提取一些關鍵的資訊。HTML其實理應屬於結構化的文字組織,但是又因為一般我們需要的關鍵資訊並非直接可以得到,需要進行對HTML的解析查詢,甚至一些字串操作才能得到,所以還是歸類於非結構化的資料處理中。
常見解析方式如下:
CSS選擇器
現在的網頁樣式比較多,所以一般的網頁都會有一些CSS的定位,例如class,id等等,或者我們根據常見的節點路徑進行定位,例如騰訊首頁的財經部分:
這裡id就為finance,我們用css選擇器,就是"#finance"就得到了財經這一塊區域的html,同理,可以根據特定的css選擇器可以獲取其他的內容。
XPATH
XPATH是一種頁面元素的路徑選擇方法,利用chrome可以快速得到,如:
copy XPATH 就能得到——//*[@id="finance"]
正規表示式
正規表示式,用標準正則解析,一般會把HTML當做普通文字,用指定格式匹配當相關文字,適合小片段文字,或者某一串字元,或者HTML包含java的程式碼,無法用CSS選擇器或者XPATH。
字串分隔
同正規表示式,更為偷懶的方法,不建議使用。
1.2 一段文字
例如一篇文章,或者一句話,我們的初衷是提取有效資訊,所以如果是滯後處理,可以直接儲存,如果是需要實時提取有用資訊,常見的處理方式如下:
分詞
根據抓取的網站型別,使用不同詞庫,進行基本的分詞,然後變成詞頻統計,類似於向量的表示,詞為方向,詞頻為長度。
NLP
自然語言處理,進行語義分析,用結果表示,例如正負面等。
關於結構化的資料結構化的資料是最好處理,一般都是類似JSON格式的字串,直接解析JSON資料就可以了,提取JSON的關鍵欄位即可
二、內容從何而來
過去我們常需要獲取的內容主要來源於網頁,一般來講,我們決定進行抓取的時候,都是網頁上可看到的內容,但是隨著這幾年移動網際網路的發展,我們也發現越來越多的內容會來源於移動app,所以爬蟲就不止侷限於一定要抓取解析網頁,還有就是模擬移動app的網路請求進行抓取,所以這一部分我會分兩部分進行說明。
1 網頁內容
網頁內容一般就是指我們最終在網頁上看到的內容,但是這個過程其實並不是網頁的程式碼裡面直接包含內容這麼簡單,所以對於很多新人而言,會遇到很多問題,比如:
明明在頁面用Chrome或者Firefox進行審查元素時能看到某個HTML標籤下包含內容,但是抓取的時候為空。
很多內容一定要在頁面上點選某個按鈕或者進行某個互動操作才能顯示出來。
所以對於很多新人的做法是用某個語言別人模擬瀏覽器操作的庫,其實就是呼叫本地瀏覽器或者是包含了一些執行java的引擎來進行模擬操作抓取資料,但是這種做法顯然對於想要大量抓取資料的情況下是效率非常低下,並且對於技術人員本身而言也相當於在用一個盒子,那麼對於這些內容到底是怎麼顯示在網頁上的呢?主要分為以下幾種情況: