.NET使用分布式網絡爬蟲框架DotnetSpider快速開發爬蟲功能

前言

前段時間有同學在微信群里提問,要使用.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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207605.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3組件使用問題

Vue3組件學習 文章目錄 Vue3組件學習一、Message 全局提示組件返回數據換行問題二、DatePicker 日期選擇框組件限制選定年份問題 一、Message 全局提示組件返回數據換行問題 問題&#xff1a;使用中發現僅僅通過寫入\n或<br/>&#xff0c;無法實現回車顯示的結果。 解決…

java中synchronized關鍵字的用法

在java編程中&#xff0c;經常需要用到同步&#xff0c;而用得最多的也許是synchronized關鍵字了&#xff0c;下面看看這個關鍵字的用法。因為synchronized關鍵字涉及到鎖的概念&#xff0c;所以先來了解一些相關的鎖知識。java的內置鎖&#xff1a;每個java對象都可以用做一個…

在Pytorch中使用Tensorboard可視化訓練過程

這篇是我對嗶哩嗶哩up主 霹靂吧啦Wz 的視頻的文字版學習筆記 感謝他對知識的分享 本節課我們來講一下如何在pytouch當中去使用我們的tensorboard 對我們的訓練過程進行一個可視化 左邊有一個visualizing models data and training with tensorboard 主要是這么一個教程 那么這里…

Flutter一直 Running Gradle task ‘assembleDebug‘

Flutter升級到3.13.7之后&#xff0c;一直Running Gradle task ‘assembleDebug’&#xff0c;之前運行還沒問題。 試了各種方法&#xff0c;比如添加阿里云鏡像&#xff0c;flutter\packages\flutter_tools\gradle目錄下修改build.gradle.kts文件&#xff0c;都不行。 參考大佬…

Termux+Hexo結合內網穿透輕松實現安卓手機搭建博客網站發布公網訪問

文章目錄 前言 1.安裝 Hexo2.安裝cpolar3.遠程訪問4.固定公網地址 前言 Hexo 是一個用 Nodejs 編寫的快速、簡潔且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在幾秒內&#xff0c;即可利用靚麗的主題生成靜態網頁。 下面介紹在Termux中安裝個人hexo博客并結合…

ArkTS語言難嗎?鴻蒙指南

HarmonyOS的開發語言是ArkTS、JS(JavaScript)。 ArkTS簡介 ArkTS是HarmonyOS優選的主力應用開發語言。ArkTS圍繞應用開發在TypeScript&#xff08;簡稱TS&#xff09;生態基礎上做了進一步擴展&#xff0c;繼承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在學習…

骨傳導耳機品牌排行榜哪家強?盤點2024年骨傳導耳機排行榜前十

隨著科技的發展&#xff0c;耳機已經從單純的音樂播放工具&#xff0c;演變為我們生活中不可或缺的伴侶。其中&#xff0c;骨傳導耳機憑借其獨特的傳聲方式&#xff0c;逐漸受到越來越多消費者的青睞。骨傳導耳機通過骨頭直接傳遞聲音&#xff0c;避免了外耳道感染和中耳疾病&a…

Java中不同轉換符實現不同數據類型到字符串的轉換

String類的format()方法用于創建格式化的字符串以及連接多個字符串對象。熟悉C語言的同學應該記得C語言的sprintf()方法&#xff0c;兩者有類似之處。format()方法有兩種重載形式。 format(String format, Object... args) 新字符串使用本地語言環境&#xff0c;制定字符串格式…

(企業項目)SpringBoot實現雪花算法id注冊功能

以下是使用 Spring Boot 實現雪花算法的完整代碼。 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class SnowflakeGeneratorApplication {public static void mai…

Java 簡易版 TCP(一對一)聊天

客戶端 import java.io.*; import java.net.Socket; import java.util.Date; import javax.swing.*;public class MyClient {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;p…

刪除有序數組中的重復元素-練習雙指針編程最好的一道題-費元星

這是練習編成雙指針最好的一道題&#xff0c;邏輯簡單&#xff0c;優化簡單。 簡單理解&#xff1a;采用雙指針&#xff0c;總左邊進行開始&#xff0c;如果有新元素則將前面移動到后面。然后加一個剪枝操作&#xff0c;如果前后元素大于1&#xff0c;再移動。 給你一個 非嚴格…

檢驗科LIS系統源碼,臨床檢驗數據的采集、存貯、處理、提取、傳輸、匯總

檢驗科LIS系統源碼 臨床檢驗信息管理系統是醫院信息管理系統的重要組成部分&#xff0c;實現對LIS系統所涉及的人流、物流、財流進行綜合管理&#xff0c;對在臨床檢驗活動各階段中產生的數據進行采集、存貯、處理、提取、傳輸、匯總、加工生成各種信息&#xff0c;從而為醫院的…

freeswitch編譯mod_av支持webrtc MCU通話

系統環境 一、FS相關網站 二、第三方庫安裝 1.apt安裝 2.指定版本sofia-sip安裝 3.指定版本spandsp安裝 4.指定版本libks安裝 5.指定版本openssl安裝 三、指定版本FS安裝 1.CPPFLAGS配置 2.編譯器版本 3.FS配置編譯 四、FS&#xff0c;fs_cli運行&#xff0c;模塊加載 附錄 1.安…

word一鍵接受所有修訂并保留修訂痕跡

目的&#xff1a;讓word修訂插入的內容在接受修訂后保留痕跡。 文章目錄 目的&#xff1a;讓word修訂插入的內容在接受修訂后保留痕跡。1. 打開批注的word文件2. 同時按住&#xff1a;*AltF11*&#xff0c;然后右鍵&#xff1a;Normal -->插入--> 模塊3. 在出現的代碼框中…

代碼隨想錄算法訓練營第五十九天【單調棧part2】 | 503.下一個更大元素II、42. 接雨水

503.下一個更大元素II 題目鏈接 力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 求解思路 重點在如何處理循環數組。 方案一&#xff1a; 直接將兩個數組拼接在一起&#xff0c;然后使用單調棧求下一個最大值。 方案二&#xff1a; 在遍歷的過…

elementUI中的 “this.$confirm“ 基本用法,“this.$confirm“ 調換 “確認“、“取消“ 按鈕的位置

文章目錄 前言具體操作總結 前言 elementUI中的 "this.$confirm" 基本用法&#xff0c;"this.$confirm" 調換 "確認"、"取消" 按鈕的位置 具體操作 基本用法 <script> this.$confirm(這是數據&#xff08;res.data&#xff0…

使用ASIRequest庫進行Objective-C網絡爬蟲示例

在Objective-C中&#xff0c;ASIHTTPRequest是一個非常受歡迎的庫&#xff0c;用于處理HTTP請求。它可用于下載網頁內容&#xff0c;處理API請求&#xff0c;甚至進行復雜的網絡交互。下面是一個簡單的示例&#xff0c;展示了如何使用ASIHTTPRequest庫來爬取網頁代碼。 首先&a…

使用項目管理工具進行新媒體運營管理的策略與方法

使用Zoho Projects項目管理工具&#xff0c;新媒體運營可輕松駕馭從策劃選題、撰寫到排期發布的全流程。運用項目管理工具對新媒體運營進行精細化管理&#xff0c;助力團隊更高效地規劃、執行和追蹤各項任務與活動。 以下是運用項目管理工具管理新媒體運營的妙招&#xff1a; 1…

oracle 下載java之前版本

登錄oracle官網&#xff1a;Oracle | Cloud Applications and Cloud Platform 點擊resource 進入該頁面 點擊這個 出現之前版本

初識Linux:權限(2)

目錄 權限 用戶&#xff08;角色&#xff09; 文件權限屬性 文件的權限屬性&#xff1a; 有無權限的區別&#xff1a; 身份匹配&#xff1a; 擁有者、所屬組的修改&#xff1a; 八進制的轉化&#xff1a; 文件的類型&#xff1a; x可執行權限為什么不能執行&#xf…