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