准备工作:

  从github上download工程。

  安装VS2017。

  安装 .net core 2.0。

  编译通过。

基础架构:

  调度器 Scheduler 从根site开始,向 Downloader 分配请求任务。

  Downloader 根据分配到的请求任务,向目标site 下载 page,并交由 PageProcessor 进行页面处理。

  PageProcessor 将处理的结果推入 Pipeline,将解析出的新的链接,推入 Scheduler。

  循环直至 Scheduler 没有新的请求可以处理。

Spider.Create:

  设定根访问节点、唯一身份标识、请求调度器 Scheduler,页面处理器 PageProcessor。

  以给出的 Sample 样例中,遍历 cnblog 站点为例进行解析:

    Scheduler 是 QueueDuplicateRemovedScheduler。就是一个存放 Request 的队列。

    PageProcessor 是默认的 DefaultPageProcessor。

    这里涉及到 XPath 的知识,需要快速了解。

  XPath:XPath 使用路径表达式在 XML 文档中进行导航,选取 XML 文档中的节点或者节点集。

  主要知识点见:http://www.runoob.com/xpath/xpath-syntax.html

页面处理流程 BasePageProcessor.Process:

        public void Process(Page page)
{
bool isTarget = true; if (_targetUrlPatterns.Count > 0 && !_targetUrlPatterns.Contains(null))
{
foreach (var regex in _targetUrlPatterns)
{
isTarget = regex.IsMatch(page.Url);
if (isTarget)
{
break;
}
}
} if (!isTarget)
{
return;
} Handle(page); page.ResultItems.IsSkip = page.ResultItems.Results.Count == 0; if (!page.SkipExtractTargetUrls)
{
ExtractUrls(page);
}
}

  在 Sample 中,调用的是 DefaultPageProcessor 提供的 hanlde:

            page.AddResultItem("title", page.Selectable.XPath("//title").GetValue());
page.AddResultItem("html", page.Content);

  默认的页面处理,是找出 “title” 元素,以及整个 html 内容。

  接着在下载好的页面内容中,查找更多的 url。

dotNetSpider 手记的更多相关文章

  1. Linux.NET实战手记—自己动手改泥鳅(上)

    各位读者大家好,不知各位读者有否阅读在下的前一个系列<Linux.NET 学习手记>,在前一个系列中,我们从Linux中Mono的编译安装开始,到Jexus服务器的介绍,以及如何在Linu ...

  2. Linux.NET学习手记(7)

    前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...

  3. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  4. 关于《Linux.NET学习手记(8)》的补充说明

    早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...

  5. U3D DrawCall优化手记

    在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题在最后,恐怕只能通过一次彻底的重构来解决 现在的游戏跑起来会有接近130-170个左右的Dra ...

  6. 信息系统实践手记5-CACHE设计一例

    说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...

  7. 信息系统实践手记6-JS调用Flex的性能问题一例

    说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...

  8. SQL Server 2016 CTP2.2 安装手记

    SQL Server 2016 CTP2.2 安装手记 下载一个iso文件,解压出来(大约2.8G左右),在该路径下双击Setup.exe即可开始安装. 安装之前请先安装.NET 3.5 SP1,在服 ...

  9. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [二] 基本使用

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 使用环境 Visual Studio 2015 or later .NET 4 ...

随机推荐

  1. rap 部署

    Rap 安装 war包下载地址 https://github.com/thx/RAP/releases 创建数据库,并创建权限用户 mysql> create database rap_db c ...

  2. tar压缩文件排除文件夹【原创】

    例如压缩redis-3.2.0目录,但是不想压缩redis-3.2.0下面的src目录 -. --exclude=redis-/src 注意--exclude=redis-3.2.0/src后面一定不 ...

  3. .NET下获取应用程序目录的一些方法

    今天在Console Application下搞了一个小功能,期间需要获取当前应用程序的根目录,试了很多方式,都不能直接获取到,没有像Server.MapPath()这类的方法来方便地使用. 下面列举 ...

  4. Win7系统Chrome浏览器缓存查看技巧介绍(转)

    1.Chrome下提供了一个命令chrome://cache,可以查看到保留下来的缓存; 2.但是,当你点击缓存文件,Chrome却并非打开缓存源文件,而是如图所示的二进制编码文件; 3.在Win7系 ...

  5. ExpressMapper- The New .NET Mapper!

    推荐,据测试比手工映射的效率还高. https://www.codeproject.com/Tips/1009198/Expressmapper-The-New-NET-Mapper

  6. 自定义yum源

    1.创建rpm包的存放目录 mkdir  -p   /yum/yum-sum/package 2.准备rpm包,可以通过自带yum只下载不安装工具下载 yum install --downloadon ...

  7. 【AtCoder】ARC087

    C - Good Sequence 题解 用个map愉悦一下就好了 代码 #include <bits/stdc++.h> #define fi first #define se seco ...

  8. Stable Match

    稳定婚姻问题 主要就是处理两个数组 boy[i][j]    存放第i个男的第j喜欢的女的   存的是女的编号!! girl[i][j]   存放 第i个女的对第j个男的的好感度  存的是值 然后只要 ...

  9. myBatsi调用存储过程

    1.结构 2.准备数据 建表和插入数据 CREATE TABLE p_user( id INT PRIMARY KEY AUTO_INCREMENT, name ), sex ) ); INSERT ...

  10. Java 获取并计算程序执行时间

    一般输出日期时间经常会用到Date这个类: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// ...