C#使用PuppeteerSharp庫的示例代碼
寫在前面
類庫介紹:PuppeteerSharp 是一個(gè)用于在 .NET 平臺(tái)上控制無頭(Headless) Chrome 瀏覽器的庫。它允許開發(fā)者通過編程方式模擬瀏覽器行為,執(zhí)行網(wǎng)頁操作,截取網(wǎng)頁截圖,獲取網(wǎng)頁內(nèi)容,可以把網(wǎng)頁轉(zhuǎn)換成PDF等等。PuppeteerSharp 是 Puppeteer 在 .NET 環(huán)境中的等效實(shí)現(xiàn),Puppeteer 是由 Google 提供的一個(gè)用于控制無界面瀏覽器 Chrome 的工具。
老規(guī)矩通過NuGet進(jìn)行安裝

代碼實(shí)現(xiàn)
public static async void DoScreenshot(string url)
{
using var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
await using var page = await browser.NewPageAsync();
await page.SetViewportAsync(new ViewPortOptions
{
Width = 1920,
Height = 1080
});
await page.GoToAsync(url);
var picPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.jpg");
await page.ScreenshotAsync(picPath);
await browser.CloseAsync();
}
public static async void ExportAsPdf(string url)
{
using var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
await using var page = await browser.NewPageAsync();
await page.GoToAsync(url);
//等待字體加載完畢
await page.EvaluateExpressionHandleAsync("document.fonts.ready");
var pdfPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.pdf");
await page.PdfAsync(pdfPath);
await browser.CloseAsync();
}
public static async void FetchUrls(string url)
{
//瀏覽器配置
var options = new LaunchOptions { Headless = true };
await new BrowserFetcher().DownloadAsync();
//打開瀏覽器
using (var browser = await Puppeteer.LaunchAsync(options))
using (var page = await browser.NewPageAsync())
{
//加載頁面
await page.GoToAsync(url);
var urlList = new List<string>();
//獲取所有超鏈接
var jsSelectAllAnchors = @"Array.from(document.querySelectorAll('a')).map(a => a.href);";
var urls = await page.EvaluateExpressionAsync<string[]>(jsSelectAllAnchors);
foreach (string u in urls)
{
urlList.Add($"Url: {u}");
}
var urlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "urls.txt");
File.WriteAllLines(urlPath, urlList);
await browser.CloseAsync();
}
}
public static async void SearchTest(string url)
{
using var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
await using var page = await browser.NewPageAsync();
await page.SetViewportAsync(new ViewPortOptions
{
Width = 1920,
Height = 1080,
//Devtools = true // 啟用 Chrome DevTools,無頭配置將自動(dòng)禁用
});
//load: window.onload事件被觸發(fā)時(shí)候完成導(dǎo)航,某些情況下它根本不會(huì)發(fā)生。
//domcontentloaded: Domcontentloaded事件觸發(fā)時(shí)候認(rèn)為導(dǎo)航成功
//networkidle0: 在 500ms 內(nèi)沒有網(wǎng)絡(luò)連接時(shí)就算成功(全部的request結(jié)束),才認(rèn)為導(dǎo)航結(jié)束
//networkidle2: 500ms 內(nèi)有不超過 2 個(gè)網(wǎng)絡(luò)連接時(shí)就算成功(還有兩個(gè)以下的request),就認(rèn)為導(dǎo)航完成
//加載時(shí)長 networkidle0 > networkidle2 > load > domcontentloaded
//await page.GoToAsync(url, new NavigationOptions() { WaitUntil = new WaitUntilNavigation[] { WaitUntilNavigation.Networkidle0 } });
// 跟蹤日志
//await page.Tracing.StartAsync(new TracingOptions { Path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"race.json") });
//await page.Tracing.StopAsync();
await page.GoToAsync(url);
await page.WaitForSelectorAsync(".searchbox input");
await page.FocusAsync(".searchbox input"); // 聚焦
await page.Keyboard.TypeAsync("CN Tower, Toronto, Ontario, Canada"); // 鍵盤輸入
await page.ClickAsync(".searchIcon"); // 點(diǎn)擊
await page.WaitForNavigationAsync();
var content = await page.GetContentAsync();
// 下載配置
//var cdp = await page.Target.CreateCDPSessionAsync();
//await cdp.SendAsync("Page.setDownloadBehavior", new
//{
// behavior = "allow",
// downloadPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "testing_downloads")
//});
//await cdp.DetachAsync();
}調(diào)用示例
PuppeteerHelper.DoScreenshot("https://www.baidu.com/");
PuppeteerHelper.ExportAsPdf("https://www.baidu.com/");
PuppeteerHelper.FetchUrls("https://www.baidu.com/");執(zhí)行結(jié)果如下:

需要注意的是運(yùn)行時(shí)記得科學(xué)上網(wǎng),不然還是手動(dòng)將chrome包下載好后,下載后內(nèi)容是這樣的

官網(wǎng)源碼: https://github.com/hardkoded/puppeteer-sharp
到此這篇關(guān)于C#使用PuppeteerSharp庫的示例代碼的文章就介紹到這了,更多相關(guān)C# PuppeteerSharp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#調(diào)用打印機(jī)實(shí)現(xiàn)打印
這篇文章介紹了C#調(diào)用打印機(jī)實(shí)現(xiàn)打印的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
.NET實(shí)現(xiàn)父窗體關(guān)閉而不影響子窗體的方法
這篇文章主要介紹了.NET實(shí)現(xiàn)父窗體關(guān)閉而不影響子窗體的方法,很實(shí)用的功能,需要的朋友可以參考下2014-08-08
C#提示:“在證書存儲(chǔ)區(qū)中找不到清單簽名證書”的解決方法
這篇文章主要介紹了C#提示:“在證書存儲(chǔ)區(qū)中找不到清單簽名證書”的解決方法,分析了幾種常見的解決方案供大家選擇使用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01

