在现代Web开发和自动化测试中, PuppeteerSharp 是一个强大的库,它允许我们在没有图形界面的情况下运行浏览器,从而实现网页自动化操作、数据抓取、截图和生成PDF等功能。

特性

  1. 功能强大:PuppeteerSharp 提供了丰富的API,可以实现网页导航、元素选择、截图、生成PDF、模拟用户操作等功能。
  2. 跨平台兼容:它支持.NET Core和.NET Framework,可以在Windows、Linux和macOS上运行。
  3. 与.NET生态无缝集成:对于熟悉C#的我们来说,PuppeteerSharp 提供了直观的API,易于上手。
  4. 社区支持:PuppeteerSharp 拥有一个活跃的开源社区,我们可以轻松找到支持和解决方案。

安装 PuppeteerSharp

Install-Package PuppeteerSharp

此外,还需要下载Chromium浏览器的二进制文件。PuppeteerSharp 提供了一个工具类 BrowserFetcher 来完成

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

PuppeteerSharp 的用法

初始化浏览器

var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
var page = await browser.NewPageAsync();
//在这里,`Headless = true` 表示浏览器以后台模式运行。如果你希望看到浏览器界面,可以将其设置为 `false`。

打开网页

await page.GoToAsync("https://www.dotnetshare.com/");

截图

await page.ScreenshotAsync("example.png", new ScreenshotOptions { FullPage = true });

FullPage = true 表示截取整个页面,而不仅仅是当前视口。

生成PDF

await page.PdfAsync("example.pdf", new PdfOptions { Format = PaperFormat.A4 });

可以通过 PdfOptions 设置纸张大小、方向等参数。

模拟用户操作

点击按钮

await page.ClickAsync("#buttonId");

填写表单

await page.TypeAsync("#inputId", "输入的文本");

提交表单

await page.SubmitAsync("#formId");

提取页面数据

提取文本内容

var textContent = await page.EvaluateExpressionAsync<string>("document.querySelector('#elementId').textContent");

提取属性值

var attributeValue = await page.EvaluateExpressionAsync<string>("document.querySelector('#elementId').getAttribute('attributeName')");

关闭浏览器

完成操作后,记得关闭浏览器

await browser.CloseAsync();

高级用法

设置代理

需要使用代理服务器,可以在启动浏览器时配置

var proxy = new ProxyOptions
{
    Server = "proxy.xxx.com",
    Port = 8080,
    Username = "username",
    Password = "password"
};

var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
    Headless = true,
    Args = new[] { $"proxy-server=http://{proxy.Server}:{proxy.Port}" }
});

等待页面加载

对于动态加载的页面,可以使用 WaitForSelectorAsyncWaitForFunctionAsync 等方法:

await page.WaitForSelectorAsync("div.main-content");

实际案例:抓取LinkedIn页面

我们需要抓取某个用户的公开信息:

using PuppeteerSharp;
using System;
using System.Threading.Tasks;

class Program
{
    public static async Task Main()
    {
        // 下载浏览器组件
        await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);

        // 启动浏览器
        var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = false });

        // 打开新页面
        var page = await browser.NewPageAsync();

        // 导航到LinkedIn页面
        await page.GoToAsync("https://www.linkedin.com/in/username");

        // 等待页面加载完成
        await page.WaitForSelectorAsync("div.profile");

        // 提取用户信息
        var name = await page.EvaluateExpressionAsync<string>("document.querySelector('.text-heading-xlarge').textContent");
        var headline = await page.EvaluateExpressionAsync<string>("document.querySelector('.text-body-medium').textContent");

        Console.WriteLine($"Name: {name}");
        Console.WriteLine($"Headline: {headline}");

        // 关闭浏览器
        await browser.CloseAsync();
    }
}

总结

PuppeteerSharp 是一个功能强大的工具,为我们提供了一个简单而强大的接口,用于控制浏览器。无论是自动化测试、数据抓取还是生成网页快照,PuppeteerSharp 都能够满足你的需求。

Logo

微软开发者社区,邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。

更多推荐