爬虫,是一种按照一定的规则,自动地抓取网站的程序或者脚本。`.NET`写爬虫非常简单,并能轻松优化性能。今天我将分享一段简短的代码,爬出博客园前200页精华内容,然后通过微小的改动,将代码升级为多线程爬虫,让爬虫速度提升数倍;最后将对爬到了内容进行一些有趣的分析。
本文演示的代码,可以从这里下载:https://github.com/sdcb/blog-data/tree/master/2019/20190826-cnblogs-crawler-home
我的演示代码通过LINQPad运行,可以在这里找到最新的LINQPad下载链接:https://www.linqpad.net/Download.aspx
这些代码同样可以运行在Visual Studio中。其中.Dump()方法可以在Visual Studio中搜索并安装NuGet包即可兼容:
Install-Package LINQPad
爬虫的三要素
经过我“多年”的爬虫骚操作的经验,我认为爬虫无非就是:
下载网站数据;
解析/保存网站数据;
分析数据与下个页面之间的关系,以便继续下载下个页面数据;
下面我将通过代码演示这三点。
下载网站数据
换作以前,有WebRequest/WebClient/RestSharp之类的选择,但如今已经都被HttpClient取代了,HttpClient同时内置于.NET Framework 4.5/netstandard 1.1及以后的版本,不用安装第三方包。
代码使用也非常简单:
var client = new HttpClient();string response = await client.DownloadStringAsync("https://www.cnblogs.com");
其中response就是从博客园下载的html字符串。
解析网站数据
.NET解析html有多个包可供选择,如HtmlAgilityPack、CsQuery等。但AngleSharp由于其简单好用、功能强大,已经也成为解析html的不错之选。
AngleSharp是开源项目,Github地址是:https://github.com/AngleSharp/AngleSharp。
近期还加入了.NET Foundation(.NET基金会),官网地址是:https://anglesharp.github.io 。
使用AngleSharp解析html过程(在`INQPad`,按Ctrl+Shift+P快速安装NuGet包):
Install-Package AngleSharpInstall-Package Newtonsoft.Json
使用代码如下:
var parser = new HtmlParser();IHtmlDocument dom = parser.ParseDocument(@" ">博客园 ">百度 ">谷歌