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嵌入到界面中,来进行了动态页面的抓取
使用CEFSharp获取动态网页源码
使用Puppeteer也可以达到同样的效果,但Puppeteer 用起来会更加方便, 因为它能以headless方式运行,不用显示在界面上。而且它封装了很多方便开发人员使用的函数。
本质 上来说,Puppeteer是通过Chrome DevTools Protocol来控制Chromium浏览器,而CEF提供了Chromium浏览器本身,它是一个Web Browser控件。
抓取动态页面
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.baidu.com");
var html = await page.GetContentAsync();
网页截图
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.baidu.com");
ScreenshotOptions screenshotOptions = new ScreenshotOptions();
screenshotOptions.FullPage = true;
screenshotOptions.OmitBackground = false;
screenshotOptions.Quality = 100;
screenshotOptions.Type = ScreenshotType.Jpeg;
await page.ScreenshotAsync("D:\\a.jpg",screenshotOptions);
截图效果如下:
保存网页为PDF
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.baidu.com");
PdfOptions pdfOptions = new PdfOptions();
pdfOptions.DisplayHeaderFooter = false;
pdfOptions.FooterTemplate = "";
pdfOptions.Format = new PuppeteerSharp.Media.PaperFormat(8.27m,11.69m);
pdfOptions.HeaderTemplate = "";
pdfOptions.Landscape = false;
pdfOptions.MarginOptions = new PuppeteerSharp.Media.MarginOptions() { Bottom = "0px", Left = "0px", Right = "0px", Top = "0px" };
pdfOptions.Scale = 1m;
await page.PdfAsync(path, pdfOptions);
保存出来的PDF效果并不怎么好,应该是文档宽高没控制好的原因。
重要说明:
Puppeteer需要先下载Chromium浏览器的相关文件,也就是下面这句代码执行的操作
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
可能会出现下载失败的情况(因为需要能访问https://storage.googleapis.com),如下图:
可以将上面那一行代码替换为以下代码,配置为从华为云镜像下载
1
2 BrowserFetcherOptions browserFetcherOptions = new BrowserFetcherOptions();
3 browserFetcherOptions.Host = "https://repo.huaweicloud.com";
4 await new BrowserFetcher(browserFetcherOptions).DownloadAsync(BrowserFetcher.DefaultRevision);
也可以通过以下方式(需要能访问https://storage.googleapis.com):
访问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
11 options.ExecutablePath = chromePath;
12
13 browser = await Puppeteer.LaunchAsync(options);
本文示例代码
https://github.com/zhaotianff/PuppeteerDemo
如果在使用过程中,遇到了问题,可以在评论区留言也可以在github提个issue给我。
更加详细的Puppeteer使用教程以及爬虫相关知识,可以访问我的github
阅读原文:原文链接
该文章在 2025/6/26 21:48:57 编辑过