一些页面的数据会通过js解密后才显示在html,若直接通过http请求是无法获取到需要解密的数据,使用该工具可在页面加载完后,该工具可获取页面加载完后的html。
/// <summary>
/// 单例
/// </summary>
public static class ChromeFactory
{
internal static Browser browser { get; set; } = Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
Args = new[] {"--no-sandbox"},
}).Result;
private readonly static object lockObj = new object();
public static async Task<Browser> GetBrowser()
{
if (browser == null)
{
lock (lockObj)
{
if (browser ==null)
{
browser = Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
Args = new[] { "--no-sandbox" },
}).Result;
}
}
}
return browser;
}
/// <summary>
/// 获取新页面
/// </summary>
/// <returns></returns>
public static async Task<Page> GetBrowserPage()
{
return await browser.NewPageAsync();
}
使用Puppeteer.LaunchAsync后将会打开一个chrome程序,占用内存资源,Browser和Page类使用完后需要使用Close方法关闭chrome程序。
最好使用单例模式,.netcore 可通过IHostApplicationLifetime.ApplicationStopped注册方法,在程序结束时关闭chrome
使用PuppeteerSharp测试爬取数据时,发现服务器卡死,负载和内存达到100%,用ps aux命令查看发现是chrome程序打开了几十个,一直占用内存资源。可多次用命令关闭chrome
ps -aux | grep ‘chrome’ | awk ‘{{print $2}}’ | xargs kill