dotNetSpider 手记
准备工作:
从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 手记的更多相关文章
- Linux.NET实战手记—自己动手改泥鳅(上)
		
各位读者大家好,不知各位读者有否阅读在下的前一个系列<Linux.NET 学习手记>,在前一个系列中,我们从Linux中Mono的编译安装开始,到Jexus服务器的介绍,以及如何在Linu ...
 - Linux.NET学习手记(7)
		
前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...
 - Linux.NET学习手记(8)
		
上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...
 - 关于《Linux.NET学习手记(8)》的补充说明
		
早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...
 - U3D DrawCall优化手记
		
在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题在最后,恐怕只能通过一次彻底的重构来解决 现在的游戏跑起来会有接近130-170个左右的Dra ...
 - 信息系统实践手记5-CACHE设计一例
		
说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...
 - 信息系统实践手记6-JS调用Flex的性能问题一例
		
说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...
 - SQL Server 2016 CTP2.2 安装手记
		
SQL Server 2016 CTP2.2 安装手记 下载一个iso文件,解压出来(大约2.8G左右),在该路径下双击Setup.exe即可开始安装. 安装之前请先安装.NET 3.5 SP1,在服 ...
 - [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [二] 基本使用
		
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 使用环境 Visual Studio 2015 or later .NET 4 ...
 
随机推荐
- json转化数组
			
//json格式数据 $data = '[{ "F_ModuleId": "1", "F_ParentId": "0", ...
 - 开放通用Api,总有你喜欢的
			
接口文档 目录 通用 更新记录 接口列表 一.福彩-双色球接口 指定期号中奖号码 最新中奖号码信息 获取双色球中奖信息列表 二.节假日及万年历 指定日期的节假日及万年历信息 指定多个日期的节假日及万年 ...
 - Chrome插件笔记之content_scripts
			
一.概论 说这个之前先看一个段子,讲的是甲方有一奇葩客户,这客户看一网站某些样式很别扭不得劲,非要让乙方修改,乍一听没毛病,但关键是这网站不是乙方家的,根本没有修改权限,怎么办,客户就是上帝,上帝的要 ...
 - casperjs批量执行多个url
			
var fs=require("fs"); ////-------sample.js-------// //casperオブジェクトを生成var casper = require( ...
 - Flask页面模板化代码片段
			
文中展示了Flask官网的Tutorial示例中用到的模板化代码片段,以备查阅. base.html: {% block title %}{% endblock %} {% if g.user %} ...
 - [原创]Python/Django使用富文本编辑器XHeditor上传本地图片
			
前言 为了在Django框架下使用Xheditor上传图片,居然折腾了我一个晚上.期间也遇到种种问题,网上相关资料极少.现在把经验分享给大家. 正文 xheditor篇 1.下载http://xhed ...
 - 字符串前面加u、r、b的含义
			
u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. 一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u:但是中文, ...
 - darknet
			
darknet第二作者:https://github.com//AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects yolov3实现 ...
 - Linux 基础——权限管理命令chmod
			
一.Linux中的文件权限与目录权限 Linux中定义了3种访问权限,分别是r.w.x.其中r表示对象是可读的,w表示对象是可写的,x表示对象是可执行的,这3种权限组成一组rwx分别对应对象的3个安全 ...
 - ****timeago.js插件:jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例
			
前端 时间个性化 插件 jquery.timeago.js 关键词 : 时间格式化 刚刚 N分钟前 N小时前 N天前 N月前 N年前 MM-dd hh:mm 或者 yyyy-MM-dd 前端: & ...