使用CEFSharp獲取動態網頁源碼


CEF 全稱是Chromium Embedded Framework(Chromium嵌入式框架),是個基於Google Chromium項目的開源Web browser控件,支持Windows, Linux, Mac平台。CEFSharp就是CEF的C#移植版本。

訪問以下鏈接可以獲取CEF的詳細介紹

https://bitbucket.org/chromiumembedded/cef/wiki/Home

CEFSharp是開源的,地址https://github.com/cefsharp/CefSharp,CEFSharp支持Winform和WPF,這里我以WPF來進行演示。

1、新建WPF工程,Nuget引入CEFSharp

2、將解決方案平台更改為x64

3、在Xaml中完成界面設計

需要先引入命名空間前綴

xmlns:cefsharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
 1 <Window x:Class="使用CEFSharp獲取動態網頁源碼.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:使用CEFSharp獲取動態網頁源碼"
 7         xmlns:cefsharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
 8         mc:Ignorable="d"
 9         Title="MainWindow" Height="450" Width="800">
10     <Grid>
11         <Grid.RowDefinitions>
12             <RowDefinition Height="35"/>
13             <RowDefinition/>
14         </Grid.RowDefinitions>
15 
16         <Grid>
17             <Label Content="請輸入網址" VerticalAlignment="Center" HorizontalAlignment="Left"></Label>
18             <TextBox  VerticalAlignment="Center" Margin="80,0,120,0"></TextBox>
19             <Button Content="訪問" HorizontalAlignment="Right" Width="100" VerticalAlignment="Center"/>
20         </Grid>
21 
22         <Grid Grid.Row="1">
23             <cefsharp:ChromiumWebBrowser Name="chrome"></cefsharp:ChromiumWebBrowser>
24         </Grid>
25     </Grid>
26 </Window>

4、使用cef獲取網頁源碼

只需要設置ChromiumWebBrowser.Address屬性就可以打開網站。

1 chrome.Address = this.tbox_url.Text;

 

5、處理獲取到的網頁源碼

ChromiumWebBrowser.FrameLoadEnd事件實現里可以獲取到網頁的動態源碼。這里需要注意的是,當你打開一個動態頁面,這個事件可能 會觸發多次,比如你打開weibo.com,這個事件就會觸發多次。

1 private async void Chrome_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
2         {
3             string source = await chrome.GetSourceAsync();
4         }

使用CEF無法確定一個網站是否已經完全加載完成,我們只能在它每一次加載完成時,處理它的頁面源碼。(如果需要主動等待網站加載完成,可以試試使用Selenium https://www.cnblogs.com/zhaotianff/p/11330810.html)

比如打開weibo.com時,會獲取到多次頁面源碼,結果如下(這里只貼出前面兩次的結果):

獲取到源碼以后可以使用HtmlAgilityPackAngleSharp等解析庫來解析HTML,也可以使用CEF執行js實現同樣的功能

調用ChromiumWebBrowser.EvaluateScriptAsync函數就可以執行js,函數返回值可以獲取到js執行的結果。

示例代碼

如果想了解C#爬蟲相關的知識,可以訪問我的github


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM