在编写爬虫爬取一些页面时,存在部分内容是服务端渲染,部分内容是ajax请求数据后js渲染。为方便操作可以使用PuppeteerSharp模拟浏览器执行js代码,最后从渲染好的页面上获取自己需要的数据
首先在nuget安装PuppeteerSharp和HtmlAgilityPack
在startup里面加下面这段代码,项目启动的时候会下载chrome.exe
//如果项目目录.local-chromium下没有chrome.exe则下载 用于爬取数据 执行网页js
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);
使用方法如下
using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions()
{
//无头模式启动,如果设置为false则会启动一个浏览器图形界面
Headless = true,
}))
{
using (var page = await browser.NewPageAsync())
{
await page.SetJavaScriptEnabledAsync(true);
url = $"{_bookSpiderSetting.Url}{book.SkuId}.html";
await page.GoToAsync(url);
//得到html
var htmlText = await page.GetContentAsync();
}
}
使用HtmlAgilityPack来获取html上的内容
HtmlDocument detailDoc = new HtmlDocument();
detailDoc.OptionOutputAsXml = true;
//加载html的字符串
detailDoc.LoadHtml(htmlText);
//获取class包含item selected的div下的i标签的内容
var bookName = detailDoc.DocumentNode.SelectSingleNode("//div[contains(@class,'item selected')]//i")?.InnerText
HtmlAgilityPack使用方法参考xpath教程