(点击上方蓝字,可快速关注我们)
来源:ModestMT.Zou
cnblogs.com/modestmt/p/5480773.html
为什么要造轮子
同学们可以去各大招聘网站查看一下爬虫工程师的要求,大多是招JAVA、PYTHON,甚至于还有NODEJS,C ;再或者去开源中国查询C#的爬虫项目,仅有几个非常简单或是几年没有更新的项目。
而单纯性能上.NET对比JAVA,PYTHON并没有处于弱势,反而有开发上的优势(得益于世界上最强大的IDE)。爬虫性能瓶颈大多是在并发下载(网速)、IP池,那么为什么.NET没有一个强大的爬虫框架呢?说真的我不知道,可能爬虫框架核心上比较简单,也可能.NET的开发人员没有别的语言的开发人员勤奋,或是.NET的开源氛围没有别的语言高。
直到.NET要出开源版的消息传来,我觉得是时候开发一个跨平台,跨语言的爬虫框架了。但一开始是比较忐忑的,觉得自己水平不够去完全重新设计一个新的框架出来,因此参考了JAVA的一个轻量级爬虫框架webmagic,并加入了我自己的理解和改进。如果设计或写得不好请大家指正海涵
框架设计
由于我是参考的webmagic,所以整体架构上没有什么大的变化,设计图如下(图片是直接从webmagic上拿的)
-
Scheduler:负责URL的调度、去重,可以实现如Queue, PriorityQueueScheduler, RedisScheduler(可用于分布式)等等
-
**: 负责下载HTML,可以实现如Http**, 浏览器的**(WebDriver), Fiddler**,本地文件**等等
-
PageProcesser: 负责HTML解析、目标URL的选择
Pipeline: 负责数据的存储, 已实现文件存储, MySql存储, MySqlFile存储(脚本),MSSQL存储,MongoDb存储, 更多存储期待您的贡献
优点
-
数据对象是通过Json结构来解析的:可以实现类中属性是类的情况(较少此种情况, 而且数据Pipeline仅限MongoDB时才能存储此种类型数据)
-
支持Json文件定义爬虫:最终实现跨语言调用
-
自动创建数据库、数据表
-
支持 .NET CORE,可以跨平台
-
支持ADSL拨号换IP:如果所有爬虫统一部署, 可以实现单台机器同时运行多个任务拨号互不影响、或者一个路由下面多个电脑下多个任务拨号互不影响
支持自定义代理池
基本使用
基本使用只需要引用DotnetSpider2.Core(Nuget中获取)
DotnetSpider实现一个完整爬虫是需要4个模块的:Scheduler、**、PageProcessor、Pipeline。由于**和Scheduler都是有基本实现的,因此只需要实现PageProcessor和Pipeline就可以实现一个基本爬虫了,这种方式也是最自由的方式。
完全自定义的例子如下:
public static void Main(string[] args)
{
// Custmize processor and pipeline 完全自定义页面解析和数据管道
BaseUsage.CustmizeProcessorAndPipeline();
Console.WriteLine("Press any key to continue...");
Console.Read();
}
public static void CustmizeProcessorAndPipeline()
{
// Config encoding, header, cookie, proxy etc... 定义采集的 Site 对象, 设置 Header、Cookie、代理等
var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true };
for (int i = 1; i |