上一篇(https://www.cnblogs.com/meowv/p/12974439.html)完成了全网各大平台的热点新闻数据的抓取,本篇继续围绕抓取完成后的操作做一个提醒。当每次抓取完数据后,自动发送邮件进行提醒。
在开始正题之前还是先玩一玩之前的说到却没有用到的一个库PuppeteerSharp。
PuppeteerSharp:Headless Chrome .NET API ,它运用最多的应该是自动化测试和抓取异步加载的网页数据,更多介绍可以看GitHub:https://github.com/hardkoded/puppeteer-sharp 。
我这里主要来试试它的异步抓取功能,同时它还能帮我们生成网页截图或者PDF。
如果没有安装可以先安装一下,在.BackgroundJobs层安装PuppeteerSharp:Install-Package PuppeteerSharp
在Jobs文件夹下新建一个PuppeteerTestJob.cs,继承IBackgroundJob,同样是在ExecuteAsync()方法中执行操作。
//PuppeteerTestJob.cs using System; using System.Threading.Tasks; namespace Meowv.Blog.BackgroundJobs.Jobs.PuppeteerTest { public class PuppeteerTestJob : IBackgroundJob { public async Task ExecuteAsync() { throw new NotImplementedException(); } } }使用 await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); 第一次检测到没有浏览器文件会默认帮我们下载 chromium 浏览器。
DownloadAsync(...)可以指定 Chromium 版本,BrowserFetcher.DefaultRevision 下载当前默认最稳定的版本。
然后配置浏览器启动的方式。
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true, Args = new string[] { "--no-sandbox" } });感兴趣的可以自己看看LaunchOptions有哪些参数,我这里指定了Headless = true 以无头模式运行浏览器,然后加了一个启动参数 "--no-sandbox"。针对Linux环境下,如果是运行在 root 权限下,在启动 Puppeteer 时要添加 "--no-sandbox" 参数,否则 Chromium 会启动失败。
我们打开一个异步加载的网页,然后获取到页面加载完后的HTML,以我个人博客中的某个单页为例:https://meowv.com/wallpaper 。
//PuppeteerTestJob.cs using PuppeteerSharp; using System.Threading.Tasks; namespace Meowv.Blog.BackgroundJobs.Jobs.PuppeteerTest { public class PuppeteerTestJob : IBackgroundJob { public async Task ExecuteAsync() { await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true, Args = new string[] { "--no-sandbox" } }); using var page = await browser.NewPageAsync(); await page.SetViewportAsync(new ViewPortOptions { Width = 1920, Height = 1080 }); var url = "http://meowv.com/wallpaper"; await page.GoToAsync(url, WaitUntilNavigation.Networkidle0); var content = await page.GetContentAsync(); } } }page.SetViewportAsync()设置网页预览大小,page.GoToAsync()语法打开网页,WaitUntilNavigation.Networkidle0等待网页加载完毕,使用page.GetContentAsync()获取到HTML。
新建扩展方法,调用这个PuppeteerTestJob的ExecuteAsync()方法,调试看看效果。
HTML已经出来了,此时该干嘛就干嘛就可以了。
第一次运行可能会很慢,因为如果你本地不存在 Chromium 是会去帮我们下载的,因为网络原因可能会下载的很慢,所以推荐大家手动下载。
可以使用淘宝的源:https://npm.taobao.org/mirrors/chromium-browser-snapshots/ 。
要注意的是,下载完成后的解压的路径不能出错,默认下载地址是在启动目录下面。
Windows:..\.local-chromium\Win64-706915\chrome-win 、 Linux:../.local-chromium/Linux-706915/chrome-linux
接下来试试生成PDF和保存图片功能,使用方式也很简单。
await page.PdfAsync("meowv.pdf",new PdfOptions { }); await page.ScreenshotAsync("meowv.png", new ScreenshotOptions { FullPage = true, Type = ScreenshotType.Png });这里只做简单的展示,page.PdfAsync()直接生成PDF文件,同时还有很多方法可以自己调用page.试试,PdfOptions选项中可以设置各种参数。
page.ScreenshotAsync()保存图片,ScreenshotOptions中FullPage可以设置保存图片为全屏模式,图片格式为Png类型。
可以看到项目根目录已经生成了图片和PDF,感觉去试试吧。
接下里来实现发送邮件的功能。
我这里发邮件的账号是用的腾讯企业邮箱,也可以用普通邮箱开通SMTP服务即可。
在appsettings.json配置收发邮件的账号等信息。
//appsettings.json "Email": { "Host": "smtp.exmail.qq.com", "Port": 465, "UseSsl": true, "From": { "Username": "123@meowv.com", "Password": "[Password]", "Name": "MEOWV.COM", "Address": "123@meowv.com" }, "To": [ { "Name": "test1", "Address": "test1@meowv.com" }, { "Name": "test2", "Address": "test2@meowv.com" } ] }