[开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [二] 基本使用
2017-04-14 10:22
891 查看
[DotnetSpider 系列目录]
一、初衷与架构设计二、基本使用
三、配置式爬虫
四、JSON数据解析与配置系统
五、如何做全站采集
使用环境
Visual Studio 2015 or later.NET 4.5 or later
如果想使用 .NET CORE 请按照官方说明安装 .NET CORE 开发环境: https://www.microsoft.com/net/core#windows
概述
在上一篇也讲到过,实现一个完整的爬虫需要4大模块:下载器(已有实现),URL调度(已有实现),数据抽取(需要自己实现),数据存储(需要自己实现),因此,只需要实现数据抽取、数据存储这两个模块就可以完成一个爬虫了。新建一个Console 项目
右键项目的Manage NuGet Packages(管理NuGet包)搜索DotnetSpider2, 从结果列表中选中DotnetSpider2.Core并安装到控制台项目中
定义数据对象
public class YoukuVideo { public string Name { get; set; } }
定义数据抽取(实现 IPageProcessor 接口)
public class YoukuPageProcessor : BasePageProcessor { protected override void Handle(Page page) { // 利用 Selectable 查询并构造自己想要的数据对象 var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes(); List<YoukuVideo> results = new List<YoukuVideo>(); foreach (var videoElement in totalVideoElements) { var video = new YoukuVideo(); video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue(); results.Add(video); } // Save data object by key. 以自定义KEY存入page对象中供Pipeline调用 page.AddResultItem("VideoResult", results); } }
需要注意的是
Page 对象中Selectable属性是由下载的HTML构造的选择器容器,调用Seletable的接口就可以进行Xpath,Css, JsonPath,Regex的查询
Selectable的GetValue传入true时会把结果去HTML标签
把组装好的对象,如上面的 YoukuVideo List, 保存到page的ResultItem中,并指定一个唯一的Key
定义数据管道(继承BasePipeline这个抽象类)
数据管道可以通过在PageProcessor中指定的唯一Key,取出需要处理的数据存入想要的数据库或文件中public class YoukuPipeline : BasePipeline { private static long count = 0; public override void Process(ResultItems resultItems) { StringBuilder builder = new StringBuilder(); foreach (YoukuVideo entry in resultItems.Results["VideoResult"]) { count++; builder.Append($" [YoukuVideo {count}] {entry.Name}"); } Console.WriteLine(builder); // Other actions like save data to DB. 可以自由实现插入数据库或保存到文件 } }
初始化起始链接并运行
通过AddStartUrl可以添加爬虫的起始链接后,调用Run方法运行爬虫
static void Main(string[] args) { // Config encoding, header, cookie, proxy etc... 定义采集的 Site 对象, 设置 Header、Cookie、代理等 var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true }; for (int i = 1; i < 5; ++i) { // Add start/feed urls. 添加初始采集链接 site.AddStartUrl("http://" + $"www.youku.com/v_olist/c_97_g__a__sg__mt__lg__q__s_1_r_0_u_0_pt_0_av_0_ag_0_sg__pr__h__d_1_p_{i}.html"); } Spider spider = Spider.Create(site, // use memoery queue scheduler. 使用内存调度 new QueueDuplicateRemovedScheduler(), // use custmize processor for youku 为优酷自定义的 Processor new YoukuPageProcessor()) // use custmize pipeline for youku 为优酷自定义的 Pipeline .AddPipeline(new YoukuPipeline()) // dowload html by http client .SetDownloader(new HttpClientDownloader()) // 1 thread .SetThreadNum(1); spider.EmptySleepTime = 3000; // Start crawler 启动爬虫 spider.Run(); }
运行结果
设置目标页抽取
以上只是采集了初始的一个链接,如何达到翻页(遍历)效果继续采集直的最后一页呢?只需要在PageProccessor中解析出符合规则的目标页,并加入到Page对象的TargetRequests这个List中即可。我们做如下改动:public class YoukuPageProcessor : BasePageProcessor { protected override void Handle(Page page) { // 利用 Selectable 查询并构造自己想要的数据对象 var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes(); List<YoukuVideo> results = new List<YoukuVideo>(); foreach (var videoElement in totalVideoElements) { var video = new YoukuVideo(); video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue(); results.Add(video); } // Save data object by key. 以自定义KEY存入page对象中供Pipeline调用 page.AddResultItem("VideoResult", results); // Add target requests to scheduler. 解析需要采集的URL foreach (var url in page.Selectable.SelectList(Selectors.XPath("//ul[@class='yk-pages']")).Links().Nodes()) { page.AddTargetRequest(new Request(url.GetValue(), null)); } } }
重新运行爬虫后,可以看到已经实现的翻页
相关文章推荐
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [二] 最基本,最自由的使用方式
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [五] 如何做全站采集?
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [五] 如何做全站采集?
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析与配置系统
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计 - ModestMT.Zou - 博客园
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 模型配置方式实现爬虫
- [初探爬虫框架: DotnetSpider] 一 采集博客园
- 使用nodejs 爬虫框架 Crawler爬取全国省市区的数据
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- 【转载】使用Json比用string返回数据更友好,也更面向对象一些 |Asp.net MVC 2.0 + Unity 2.0(IoC) + EF4.0 实例:RoRoWoBlog 开源项目框架代码
- 搜索引擎–Python下开源爬虫(spider)框架scrapy的使用
- 基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速开发框架设计NBear V3.3.9 Stable [开源]
- .net 2.0下的asp.net ajax基本使用方法
- 转载--.net使用DotNetCharting控件生成报表统计图总结