LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# Puppeteer 实战:实现动态网页数据爬取

admin
2025年6月26日 8:22 本文热度 26

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.Clip = new PuppeteerSharp.Media.Clip() { Height = 0, Width = 0, X = 0, Y = 0 };//设置截剪区域 screenshotOptions.FullPage = true//是否截取整个页面 screenshotOptions.OmitBackground = false;//是否使用透明背景,而不是默认白色背景 screenshotOptions.Quality = 100//截图质量 0-100(png不可用) 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"); //访问页面
//设置PDF选项PdfOptions pdfOptions = new PdfOptions();pdfOptions.DisplayHeaderFooter = false//是否显示页眉页脚pdfOptions.FooterTemplate = "";   //页脚文本pdfOptions.Format = new PuppeteerSharp.Media.PaperFormat(8.27m,11.69m);  //pdf纸张格式 英寸为单位pdfOptions.HeaderTemplate = "";   //页眉文本pdfOptions.Landscape = false;     //纸张方向 false-垂直 true-水平pdfOptions.MarginOptions = new PuppeteerSharp.Media.MarginOptions() { Bottom = "0px"Left = "0px"Right = "0px"Top = "0px" }; //纸张边距,需要设置带单位的值,默认值是NonepdfOptions.Scale = 1m;            //PDF缩放,从0-1await 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 //chromePath就是下载的Chromium浏览器解压的位置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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved