1. 程式人生 > >三種獲取ajax載入的動態內容的方法

三種獲取ajax載入的動態內容的方法

有些網站的比較重要的內容可能會採用javascript動態載入內容,防止採集,獲取其中的資訊,但是我們在採集的時候還需要獲取到這些內容,

下面就介紹三種可以獲取到javascript內容的方法,三種方式的原理其實是一樣的,就是通過瀏覽器引擎來解析javascript。

1)、利用WebBrowser控制元件

這個方式大家也都知道,也就不多說了,說幾個比較重要的地方。首先,我要在DocumentCompleted事件裡面完成內容獲取的工作,因為該控制元件

是在文件載入完成後觸發的。其次,這個事件有個問題,就是說如果在頁面中有iframe框架之類的,如果這個iframe載入完成也會觸發這個事件,所以我們要做個判斷


if (wb.ReadyState == WebBrowserReadyState.Complete && e.Url.ToString() == wb.Url.ToString())
 

 這個判斷就是說在控制元件所有內容載入完並且是本頁面載入完,而不是某個iframe載入完。然後就可以通過


wb.Document.Body.InnerHtml;
 

 來獲取內容啦!



2)利用phantomjs這個開源專案

這個專案的地址:http://phantomjs.org/ 。這個專案說的通俗點就是一個無介面的基於webkit核心的瀏覽器,既然是瀏覽器當然就能獲取

javascript載入的內容。至於這個開源專案更多的細節還需要大家自己來閱讀這個文件,裡面寫的很全面,也很易懂!

我先簡單的介紹下在win7下怎麼用這個專案

1、下載windows版本,地址http://phantomjs.org/download.html,現在的版本是1.9.1

2、下載完,解壓縮,放到某個資料夾下

3、配置環境變數,把這個資料夾的根目錄配置到環境變數中。

下面我們看怎麼用C#來呼叫,這裡用到Process類,具體看程式碼:
Process p = new Process();
            //啟用命令列
            p.StartInfo.FileName = @"cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            //輸入各種命令
            p.StandardInput.WriteLine(@"cd D:\Program Files\phantomjs\examples");
            p.StandardInput.WriteLine(@"d:");
            p.StandardInput.WriteLine("phantomjs --output-encoding=gbk test.js www.xxxx.com");
            p.StandardInput.Close();
            p.StandardInput.Dispose();
            //獲取結果
            string strRst = p.StandardOutput.ReadToEnd();
            p.Close();
            Console.WriteLine(strRst);
 

 上面程式碼中用到了一個test.js的檔案,這個檔案的寫法需要參考一下phantomjs的api或者它自帶的例子,很簡單,比較好理解。

ttest。js的程式碼

 
var page = require('webpage').create(),
            system = require('system'),
            url;
url = system.args[1];
page.open(url, function (status) {
    var title = page.evaluate(function () {
        return document.getElementById('contact').innerHTML;
        //return document.title;
    });
    console.log('Page title is ' + title);
    //必須要退出,否則在c#呼叫的時候會卡死
    phantom.exit();
});
 

 

3)利用phantomjs的一個包裝類庫

這個類庫很全面,有基於各種瀏覽的驅動,當然也包括phantomjs,我們就用PhantomJSDriver類來操作。當然這個類庫資訊很多,還需要大家

自己來看,我也是看了一點點,沒有看的太詳細!當然需要先下載類庫,地址:http://docs.seleniumhq.org/download/,下載完新增引用,

(發現貌似只用3.5和4.0版本的,老的版本中是否支援2.0),api文件地址:
http://selenium.googlecode.com/git/docs/api/dotnet/index.html
,下面看呼叫,很簡單,幾行程式碼就可以搞定! PhantomJSDriver driver = driver = new PhantomJSDriver(); driver.Url = "url"; string pagesource = driver.PageSource; driver.Quit(); driver.Dispose();