前言
前段時間有同學在微信群里提問,要使用.NET開發一個簡單的爬蟲功能但是沒有做過無從下手。今天給大家推薦一個輕量、靈活、高性能、跨平臺的分布式網絡爬蟲框架(可以幫助 .NET 工程師快速的完成爬蟲的開發):DotnetSpider。
注意:為了自身安全請在國家法律允許范圍內開發網絡爬蟲功能。
框架設計圖
整個爬蟲設計是純異步的,利用消息隊列進行各個組件的解耦,若是只需要單機爬蟲則不需要做任何額外的配置,默認使用了一個內存型的消息隊列;若是想要實現一個純分布式爬蟲,則需要引入一個消息隊列即可,后面會詳細介紹如何實現一個分布式爬蟲。
框架源碼
開發爬蟲需求
爬取博客園10天推薦排行第一頁的文章標題、文章簡介和文章地址,并將其保存到對應的txt文本中。
請求地址:https://www.cnblogs.com/aggsite/topdiggs
快速開始
創建SpiderSample控制臺
安裝DotnetSpider Nuget包
搜索:DotnetSpider
添加Serilog日志組件
搜索:Serilog.AspNetCore
RecommendedRankingModel
????public?class?RecommendedRankingModel{///?<summary>///?文章標題///?</summary>public?string?ArticleTitle?{?get;?set;?}///?<summary>///?文章簡介///?</summary>public?string?ArticleSummary?{?get;?set;?}///?<summary>///?文章地址///?</summary>public?string?ArticleUrl?{?get;?set;?}}
RecommendedRankingSpider
????public?class?RecommendedRankingSpider?:?Spider{public?RecommendedRankingSpider(IOptions<SpiderOptions>?options,DependenceServices?services,ILogger<Spider>?logger)?:?base(options,?services,?logger){}public?static?async?Task?RunAsync(){var?builder?=?Builder.CreateDefaultBuilder<RecommendedRankingSpider>();builder.UseSerilog();builder.UseDownloader<HttpClientDownloader>();builder.UseQueueDistinctBfsScheduler<HashSetDuplicateRemover>();await?builder.Build().RunAsync();}protected?override?async?Task?InitializeAsync(CancellationToken?stoppingToken?=?default){//?添加自定義解析AddDataFlow(new?Parser());//?使用控制臺存儲器AddDataFlow(new?ConsoleStorage());//?添加采集請求await?AddRequestsAsync(new?Request("https://www.cnblogs.com/aggsite/topdiggs"){//?請求超時10秒Timeout?=?10000});}class?Parser?:?DataParser{public?override?Task?InitializeAsync(){return?Task.CompletedTask;}protected?override?Task?ParseAsync(DataFlowContext?context){var?recommendedRankingList?=?new?List<RecommendedRankingModel>();//?網頁數據解析var?recommendedList?=?context.Selectable.SelectList(Selectors.XPath(".//article[@class='post-item']"));foreach?(var?news?in?recommendedList){var?articleTitle?=?news.Select(Selectors.XPath(".//a[@class='post-item-title']"))?.Value;var?articleSummary?=?news.Select(Selectors.XPath(".//p[@class='post-item-summary']"))?.Value?.Replace("\n",?"").Replace("?",?"");var?articleUrl?=?news.Select(Selectors.XPath(".//a[@class='post-item-title']/@href"))?.Value;recommendedRankingList.Add(new?RecommendedRankingModel{ArticleTitle?=?articleTitle,ArticleSummary?=?articleSummary,ArticleUrl?=?articleUrl});}using?(StreamWriter?sw?=?new?StreamWriter("recommendedRanking.txt")){foreach?(RecommendedRankingModel?model?in?recommendedRankingList){string?line?=?$"文章標題:{model.ArticleTitle}\r\n文章簡介:{model.ArticleSummary}\r\n文章地址:{model.ArticleUrl}";sw.WriteLine(line+?"\r\n?==========================================================================================");}}return?Task.CompletedTask;}}}
Program調用
???internal?class?Program{static?async?Task?Main(string[]?args){Console.WriteLine("Hello,?World!");await?RecommendedRankingSpider.RunAsync();Console.WriteLine("數據抓取完成");}}
抓取數據和頁面數據對比
抓取數據:
頁面數據:
項目源碼地址
更多項目實用功能和特性歡迎前往項目開源地址查看👀,別忘了給項目一個Star支持💖。
GitHub源碼地址:GitHub - dotnetcore/DotnetSpider: DotnetSpider, a .NET standard web crawling library. It is lightweight, efficient and fast high-level web crawling & scraping framework
GitHub?wiki:Home · dotnetcore/DotnetSpider Wiki · GitHub
優秀項目和框架精選
該項目已收錄到C#/.NET/.NET Core優秀項目和框架精選中,關注優秀項目和框架精選能讓你及時了解C#、.NET和.NET Core領域的最新動態和最佳實踐,提高開發工作效率和質量。坑已挖,歡迎大家踴躍提交PR推薦或自薦(讓優秀的項目和框架不被埋沒🤞
)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
文章轉載自:追逐時光者
原文鏈接:https://www.cnblogs.com/Can-daydayup/p/17884311.html