Visual Studio 2017html
.NET 4.5 or later or .NET Coregit
在上一篇也讲到过,实现一个完整的爬虫须要4大模块:下载器(已有实现),URL调度(已有实现),数据抽取(须要本身实现),数据存储(须要本身实现),所以,只须要实现数据抽取、数据存储这两个模块就能够完成一个爬虫了。github
搜索DotnetSpider2, 从结果列表中选中DotnetSpider2.Core并安装到控制台项目中数据库
public class YoukuVideo { public string Name { get; set; } }
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); } }
须要注意的是cookie
数据管道能够经过在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方法运行爬虫ide
// 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://list.youku.com/category/show/c_96_s_1_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()); spider.Downloader = new HttpClientDownloader(); spider.ThreadNum = 1; spider.EmptySleepTime = 3000; // Start crawler 启动爬虫 spider.Run();
设置目标页抽取ui
以上只是采集了初始的一个连接,如何达到翻页(遍历)效果继续采集直的最后一页呢?只须要在PageProccessor中解析出符合规则的目标页,并加入到Page对象的TargetRequests这个List中便可。咱们作以下改动:url
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)); } } }
从新运行爬虫后,能够看到已经实现的翻页
https://github.com/zlzforever/DotnetSpider 望各位大佬加星
博文写得比较早, 框架修改有时会来不及更新博文中的代码, 请查看DotnetSpider.Sample项目中的样例爬虫
QQ群: 477731655