[DotnetSpider 系列目录]

使用环境

  • Visual Studio 2017

  • .NET 4.5 or later or .NET Core

概述

在上一篇也讲到过,实现一个完整的爬虫需要4大模块:下载器(已有实现),URL调度(已有实现),数据抽取(需要自己实现),数据存储(需要自己实现),因此,只需要实现数据抽取、数据存储这两个模块就可以完成一个爬虫了。

新建一个Console 项目

  • 右键项目的Manage NuGet Packages(管理NuGet包)

    

  • 搜索DotnetSpider2, 从结果列表中选中DotnetSpider2.Core并安装到控制台项目中

    

定义数据对象

  1. public class YoukuVideo
  2. {
  3. public string Name { get; set; }
  4. }

定义数据抽取(实现 IPageProcessor 接口)

  1. public class YoukuPageProcessor : BasePageProcessor
  2. {
  3. protected override void Handle(Page page)
  4. {
  5. // 利用 Selectable 查询并构造自己想要的数据对象
  6. var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes();
  7. List<YoukuVideo> results = new List<YoukuVideo>();
  8. foreach (var videoElement in totalVideoElements)
  9. {
  10. var video = new YoukuVideo();
  11. video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue();
  12. results.Add(video);
  13. }
  14.  
  15. // Save data object by key. 以自定义KEY存入page对象中供Pipeline调用
  16. page.AddResultItem("VideoResult", results);
  17. }
  18. }

需要注意的是

  1. Page 对象中Selectable属性是由下载的HTML构造的选择器容器,调用Seletable的接口就可以进行Xpath,Css, JsonPath,Regex的查询
  2. Selectable的GetValue传入true时会把结果去HTML标签化
  3. 把组装好的对象,如上面的 YoukuVideo List, 保存到page的ResultItem中,并指定一个唯一的Key

定义数据管道(继承BasePipeline这个抽象类)

数据管道可以通过在PageProcessor中指定的唯一Key,取出需要处理的数据存入想要的数据库或文件中

  1. public class YoukuPipeline : BasePipeline
  2. {
  3. private static long count = ;
  4.  
  5. public override void Process(ResultItems resultItems)
  6. {
  7. StringBuilder builder = new StringBuilder();
  8. foreach (YoukuVideo entry in resultItems.Results["VideoResult"])
  9. {
  10. count++;
  11. builder.Append($" [YoukuVideo {count}] {entry.Name}");
  12. }
  13. Console.WriteLine(builder);
  14.  
  15. // Other actions like save data to DB. 可以自由实现插入数据库或保存到文件
  16. }
  17. }

初始化起始链接并运行

通过AddStartUrl可以添加爬虫的起始链接后,调用Run方法运行爬虫

  1. // Config encoding, header, cookie, proxy etc... 定义采集的 Site 对象, 设置 Header、Cookie、代理等
  2. var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true };
  3. for (int i = ; i < ; ++i)
  4. {
  5. // Add start/feed urls. 添加初始采集链接
  6. site.AddStartUrl($"http://list.youku.com/category/show/c_96_s_1_d_1_p_{i}.html");
  7. }
  8. Spider spider = Spider.Create(site,
  9. // use memoery queue scheduler. 使用内存调度
  10. new QueueDuplicateRemovedScheduler(),
  11. // use custmize processor for youku 为优酷自定义的 Processor
  12. new YoukuPageProcessor())
  13. // use custmize pipeline for youku 为优酷自定义的 Pipeline
  14. .AddPipeline(new YoukuPipeline());
  15. spider.Downloader = new HttpClientDownloader();
  16. spider.ThreadNum = ;
  17. spider.EmptySleepTime = ;
  18.  
  19. // Start crawler 启动爬虫
  20. spider.Run(); 

运行结果

设置目标页抽取

以上只是采集了初始的一个链接,如何达到翻页(遍历)效果继续采集直的最后一页呢?只需要在PageProccessor中解析出符合规则的目标页,并加入到Page对象的TargetRequests这个List中即可。我们做如下改动:

  1. public class YoukuPageProcessor : BasePageProcessor
  2. {
  3. protected override void Handle(Page page)
  4. {
  5. // 利用 Selectable 查询并构造自己想要的数据对象
  6. var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes();
  7. List<YoukuVideo> results = new List<YoukuVideo>();
  8. foreach (var videoElement in totalVideoElements)
  9. {
  10. var video = new YoukuVideo();
  11. video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue();
  12. results.Add(video);
  13. }
  14.  
  15. // Save data object by key. 以自定义KEY存入page对象中供Pipeline调用
  16. page.AddResultItem("VideoResult", results);
  17.  
  18. // Add target requests to scheduler. 解析需要采集的URL
  19. foreach (var url in page.Selectable.SelectList(Selectors.XPath("//ul[@class='yk-pages']")).Links().Nodes())
  20. {
  21. page.AddTargetRequest(new Request(url.GetValue(), null));
  22. }
  23. }
  24. }

重新运行爬虫后,可以看到已经实现的翻页

代码地址

https://github.com/zlzforever/DotnetSpider 望各位大佬加星 

参与开发或有疑问

博文写得比较早, 框架修改有时会来不及更新博文中的代码, 请查看DotnetSpider.Sample项目中的样例爬虫

QQ群: 477731655

邮箱: zlzforever@163.com

[开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [二] 基本使用的更多相关文章

  1. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...

  2. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [五] 如何做全站采集?

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 如何做全站采集? 很多同学加群都在问, 如何使用Dotne ...

  3. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 场景模拟 接上一篇, JD SKU对应的店铺信息是异步加载 ...

  4. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 上一篇介绍的基本的使用方式,自由度很高,但是编写的代码相对 ...

  5. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] 学习

    http://www.cnblogs.com/jjg0519/p/6707513.html

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

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

  7. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师的要求,大多是招JA ...

  8. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 上一篇介绍的基本的使用方式,虽然自由度很高,但是编写的代码相对还是挺多.于是框 ...

  9. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 场景模拟 假设由于漏存JD SKU对应的店铺信息.这时我们需要重新完全采集所有 ...

随机推荐

  1. python2 与 python3 如何实现共存

    1.现在我本机系统已内置python2.6 2.下载进行源码安装 复制链接下载到 /root/mypackage,解压 接着 mkdir /usr/local/python3 然后在解压后的文件夹内执 ...

  2. javascript中的异步编程

    正常情况下js都是顺序执行的,但是也有很多场景下实际上是异步操作: 1.定时器都是异步操作 2.事件绑定都是异步操作 3.AJAX中一般我们都采取异步操作(也可以同步) 4.回调函数可以理解为异步(不 ...

  3. 简单整理关于C#和Java的区别

    相信每个程序猿都有自己最喜欢的编程语言,然而对于编程语言似乎形成一条独特的鄙视链,就如Java和C#常常两边的开发者都是相互鄙视,然后他们一起共同鄙视全世界最好的编程语言——PHP 哈哈,但是其实我想 ...

  4. centos6.5下oracle11g开机自动启动方法一

    转裁于 方法一 https://blog.csdn.net/wx5040257/article/details/77875690 方法二  https://blog.csdn.net/wx504025 ...

  5. win10无法删除文件夹(其中的文件或者文件夹已在另一个程序中打开)怎么办?

    1. 右键点击任务管理器 2.打开资源监视器 3.搜索任务,结束任务(可能会死机)

  6. 阿里八八β阶段Scrum(4/5)

    今日进度 黄梅玲: 图表绘制与实时更新的完成 刘晓: 数据分析表格部分生成完成 张岳: 初步完成简易的桌面控件 陈裕鹏: 事件添加TAG标签的功能完成,此外信息抽取算法也基本完成并PULL,但与项目产 ...

  7. <table>标签总结(colspan跨列 ,rowspan跨行)

    table标签有些内置属性要设置: <table cellpadding="0" cellspacing="0" border="0" ...

  8. 2个Excel表格核对技巧

    技巧1.利用Spreadsheet Camprare一秒钟识别差异数据 如下图所示,我们如何快速比对我们自己做的表格和上司修改后的表格的差异呢?这里首先来介绍一个非常棒的工具:Spreadsheet ...

  9. Problem UVA12657-Boxes in a Line(数组模拟双链表)

    Problem UVA12657-Boxes in a Line Accept: 725  Submit: 9255 Time Limit: 1000 mSec Problem Description ...

  10. JQuery获取touchstart,touchmove,touchend坐标

    $('#id').on('touchstart',function(e) { ].pageX; }); JQuery如上. document.getElementById("id" ...