C#使用Puppeteer


Puppeteer

Puppeteer是一個Node.js庫,它提供了高級API來通過DevTools協議(Chrome DevTools Protocol https://devtools.chrome.com)控制Chrome或Chromium。 Puppeteer默認情況下無頭運行(headless)。

可以配置為運行完整的Chrome或Chromium,運行效果如下

 

 

Puppeteer具備以下功能:

1、頁面截圖和生成PDF

2、抓取動態網頁內容

3、自動化表單提交,UI測試,鍵盤輸入等

4、測試Chrome擴展程序

 

Puppeteer項目地址:

https://github.com/puppeteer/puppeteer

在C#中調用,是使用了Puppeteer的移植版本,puppeteer-sharp,項目地址:

https://github.com/hardkoded/puppeteer-sharp

 

Puppeteer-sharp是基於.Net Standard 2.0開發,所以可以運行於NET Framework 4.6.1+、 .NET Core 2.0+的版本上.

操作系統的要求是Windows 8+或Windows Server2012+。如果需要在Windows 7上運行Puppeteer-Sharp,則可以通過設置LaunchOptions.WebSocketFactory屬性的值為System.Net.WebSockets.Client.Managed來實現。

 

對於前端開發人員來說,Puppeteer最大的用處應該就是自動化測試,而對於爬蟲開發人員,Puppeteer最大的用處是可以很方便的抓取動態網頁。Puppeteer就等於是一個人為操作的瀏覽器,你可以控制它抓取任何動態網頁內容。

 

對比CEF

在前面的文章中,我使用了CEFSharp嵌入到界面中,來進行了動態頁面的抓取(https://www.cnblogs.com/zhaotianff/p/9556270.html),

使用Puppeteer也可以達到同樣的效果,但它用起來會更加方便, 因為它能以headless方式運行,不用顯示在界面上。而且它封裝了很多方便開發人員使用的函數。

本質 上來說,Puppeteer是通過Chrome DevTools Protocol來控制Chromium瀏覽器,而CEF提供了Chromium瀏覽器本身,它是一個Web Browser控件。

 

抓取動態頁面

 

1 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
2 var browser = await Puppeteer.LaunchAsync(new LaunchOptions
3             {
4                 Headless = true
5             });
6 var page = await browser.NewPageAsync();
7 await page.GoToAsync("https://www.baidu.com");
8 var html = await page.GetContentAsync();

 

 

網頁截圖

 

 1   await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
 2   browser = await Puppeteer.LaunchAsync(new LaunchOptions
 3   {
 4                  Headless = true
 5   });
 6   var page = await browser.NewPageAsync();  //打開一個新標簽
 7   await page.GoToAsync("https://www.baidu.com"); //訪問頁面
 8  
 9   
10  //設置截圖選項
11  ScreenshotOptions screenshotOptions = new ScreenshotOptions();
12  //screenshotOptions.Clip = new PuppeteerSharp.Media.Clip() { Height = 0, Width = 0, X = 0, Y = 0 };//設置截剪區域
13  screenshotOptions.FullPage = true; //是否截取整個頁面
14  screenshotOptions.OmitBackground = false;//是否使用透明背景,而不是默認白色背景
15  screenshotOptions.Quality = 100; //截圖質量 0-100(png不可用)
16  screenshotOptions.Type = ScreenshotType.Jpeg; //截圖格式
17 
18  await page.ScreenshotAsync("D:\\a.jpg",screenshotOptions);

 

截圖效果如下:

 

 

 

保存網頁為PDF

 1 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
 2  browser = await Puppeteer.LaunchAsync(new LaunchOptions
 3  {
 4                   Headless = true
 5  });
 6 var page = await browser.NewPageAsync();  //打開一個新標簽
 7 await page.GoToAsync("https://www.baidu.com"); //訪問頁面
 8 
 9 //設置PDF選項
10 PdfOptions pdfOptions = new PdfOptions();
11 pdfOptions.DisplayHeaderFooter = false; //是否顯示頁眉頁腳
12 pdfOptions.FooterTemplate = "";   //頁腳文本
13 pdfOptions.Format = new PuppeteerSharp.Media.PaperFormat(8.27m,11.69m);  //pdf紙張格式 英寸為單位 
14 pdfOptions.HeaderTemplate = "";   //頁眉文本
15 pdfOptions.Landscape = false;     //紙張方向 false-垂直 true-水平 
16 pdfOptions.MarginOptions = new PuppeteerSharp.Media.MarginOptions() { Bottom = "0px", Left = "0px", Right = "0px", Top = "0px" }; //紙張邊距,需要設置帶單位的值,默認值是None
17 pdfOptions.Scale = 1m;            //PDF縮放,從0-1
18 await page.PdfAsync(path, pdfOptions);

保存出來的PDF效果並不怎么好,應該是文檔寬高沒控制好的原因。

 

重要說明:

Puppeteer需要先下載Chromium瀏覽器的相關文件,也就是下面這句代碼執行的操作

1 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);

可能會出現下載失敗的情況,如下圖:

 

 可以從這里下載 ,並解壓到程序運行目錄。(推薦這種方式,因為出現了上面的異常,第二種方式中的鏈接你也訪問不了

 

也可以通過以下方式:

訪問google chromium開源鏡像網站,下載Chromium瀏覽器

https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win_x64/

下載后解壓到相應位置,然后通過指定Chromium路徑來進行初始化

 1 LaunchOptions options = new LaunchOptions();
 2 options.Headless = true;
 3 options.DefaultViewport = null;
 4 //忽略證書錯誤
 5 options.IgnoreHTTPSErrors = true;
 6 
 7 //chromePath就是下載的Chromium瀏覽器解壓的位置
11 options.ExecutablePath = chromePath;
12 
13 browser = await Puppeteer.LaunchAsync(options);

 

本文示例代碼

https://github.com/zhaotianff/PuppeteerDemo

如果在使用過程中,遇到了問題,可以提個issue給我。

更加詳細的Puppeteer使用教程以及爬蟲相關知識,可以訪問我的github


免責聲明!

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



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