我在上一篇文章中介紹了使用ScrapySharp快速從網頁中采集數據,這種方式是通過直接發送的Http請求來獲取的原始頁面信息,對于靜態網頁非常有效,但還有許多網站中的頁面內容并非全部存放在原始的頁面中,很多內容是通過javascript來動態生成的,這些數據用前面的方式就抓取不到了。本文這里就簡單的介紹一下動態網頁的采集方案。
對于這樣的網頁數據的采集,往往是利用一個瀏覽器引擎來實現整個頁面的加載,輸出加載完后的完整頁面,然后就可以利用ScrapySharp等工具解析了。常用有如下幾種方式:
?
使用WebBrowser控件
這種方式相信大多數.Net開發者都用到過,由于WebBrowser直接使用的是操作系統集成的IE,無需下載第三方控件,比較簡單快捷。但它本身只是一個呈現用的控件,并沒有提供多少接口,要集成一些擴展進去比較麻煩。
?
使用WebBrowser
PhantomJS是一個Webkit內核的無界面瀏覽器,它的一個特點是可以非常方便的集成javascript腳本,因此進行擴展開發是比較方便的,也能非常方便的在服務器端不能使用UI控件的地方使用。目前網上也大部分都是這種方案,我這里轉錄一下看過的幾篇文章,并不做詳細的介紹:
- 使用PhantomJS測試JavaScript
- NodeJS + PhantomJS 抓取頁面信息以及截圖
- 用phantomjs 進行網頁整頁截屏
- WebKit 的服務器端 API?PhantomJS
本身這個程序還是比較方便而強大的,但是在試用過程中還是存在一些問題,例如有的網頁不是很規范,不能正確的解析,或者存在亂碼等。
?
使用CEF控件
CEF是google提供的Chrome集成方案Chromium Embedded Framework,相對提供了更為底層的API,我們可以進行更為強大的定制(當然也需要更多的工作量),例如,不采集圖片以加快內容的解析。
?
直接解析Javascript模擬渲染
以上的方案雖然都能簡單正確的獲取解析后的完整頁面,但卻存在性能問題:很慢。雖然開發瀏覽器的都是頂尖高手,但由于頁面的渲染本身是一個非常復雜的過程,用上述工具完整渲染一個頁面仍需幾秒鐘的時間,并且資源開銷不小,無法支撐大規模的數據采集。
大多數情況下,這個并不是什么太大的問題,但如果對性能問題比較關注,有一個比較原始的方式可以解決,那就是具體分析網頁的JS工作原理,模擬瀏覽器執行只是內容相關JS,手動獲取輸出的內容。
這種方式下,主要需要一個javascript引擎,目前已經有大量的js引擎提供,基本上不是什么問題。它主要的問題在于需要對網頁定制分析,而這些網頁的JS大多數采取了一定的混淆策略,并不容易分析,往往需要大量時間來調試它。