当前位置: 首页 > 工具软件 > NCrawler > 使用案例 >

Ncrawler源码阅读

匡安宜
2023-12-01

Ncrawler是一个在codeplex上的.NET爬虫项目,项目是.net4.0的。里面充满了linq、lambda表达式。。。而我则习惯在.net2.0,所以代码阅读起来,真的是有点痛苦。没办法,一句话,死撑吧。另外发现一个linqbrige这个库,可以在.net2.0下实现linq to object的语法,支持lambda表达式,而且这个库的大小也只有几十kb,对于在2.0平台 的开发同胞们,对于一部分3.5,4.0的项目可以直接转换过来,改一个库引用就可以了,命名空间都一样,不过只是对于linq to obect的项目,而to sql ,to xml则不行。

言归正传,回到Ncrawler项目吧!

我准备按照爬虫的功能模块来分析,这样我觉得方面理解和记忆。(摸着石头过河吧,可能许多地方理解有误)

组件?扩展?服务?这3种概念有时候比较难以区分,我也不怎么明白。。。

就用作者的service[服务]吧。

Ncrawler用autofac这个ioc容器 的管理这些服务(aotufac这个中文资料很少,我也不理解,不做详细讨论)

程序里面的使用时如下:

注册模块:

using Autofac;
using Autofac.Core.Lifetime;
public static void Setup(params Module[] modules)
{
        ContainerBuilder builder = new ContainerBuilder();
        modules.ForEach(module => builder.RegisterModule(module));
        Container = builder.Build();
}
取出:
m_CrawlerQueue = m_LifetimeScope.Resolve<ICrawlerQueue>(parameters);
哎,扩展方法这玩意还真有点不适应~上面的代码就是从容器中取出插件的实例。。。没怎么看明白

现在大概的介绍一下Module的主要继承者吧,作者给他们都加了个service后缀.
1 .CrawlerRulesService:ICrawlerRules
    这个是规则模块,也就是用来过滤URI的
 2.InMemoryCrawlerHistoryService : HistoryServiceBase
   用来保存历史uri,用来判断是否已经访问
3.InMemoryCrawlerQueueService : CrawlerQueueServiceBase
   这个很奇怪,从字面意思看,这个应该是个队列,可是内部却使用stack栈~用来存储CrawlerQueueEntry,有  CrawlStep(当前的链接),referrer(来源url)
而CrawlStep这个类,url,depth等
4.NativeTaskRunnerService : ITaskRunner
  里面还是用 的扩展方法,猜测功能是用task,异步执行委托
5.RobotService : IRobot
   读取robots.txt里面 的一些信息
6.WebDownloaderV2 : IWebDownloader
  下载页面的类,包括异步和同步方法,将相关信息,以及下载内容存在PropertyBag
。。。

Ncrawler一个设计PipelineStep管道非常好,
Crawler crawler, PropertyBag propertyBag);同理linux的管道,可以将上个step的结果作为下个step的源,而实现传递的介质则是(Crawler crawler, PropertyBag propertyBag)
这样我们就可以非常方便的进行扩展。

只是我第一次写源码阅读类,感觉写的不是很好,而且代码看的也是迷迷糊糊。还是理解力,悟性太差。多多指教,未完待续。以后着重对一些细节代码进行分析!

 类似资料: