.NET使用分布式网络爬虫框架DotnetSpider快速开发爬虫功能

news/2025/2/18 11:06:36/

前言

前段时间有同学在微信群里提问,要使用.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

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
  • 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪


http://www.ppmy.cn/news/1262438.html

相关文章

pip的常用命令

安装、卸载、更新包&#xff1a;pip install [package-name]&#xff0c;pip uninstall [package-name]&#xff0c;pip install --upgrade [package-name]。升级pip&#xff1a;pip install --upgrade pip。查看已安装的包&#xff1a;pip list&#xff0c;pip list --outdate…

Axure原型图表组件库,数据可视化元件(Axure9大屏组件)

针对Axure制作的大屏图表元件库&#xff0c;帮助产品经理更高效地制作高保真图表原型&#xff0c;是产品经理必备元件工具。现分享完整的组件库&#xff0c;大家一起学习。 本组件库的图表模块&#xff0c;已包含所有常用的图表&#xff0c;以下为部分组件截图示意。文末可下载…

高性能服务器框架

服务器同时监听多个客户请求是通过 select 系统调用实现的&#xff1b; 1.1 服务器编程框架 请求队列是各单元之间通信方式的抽象&#xff1b; 1.2 IO 模型 &#xff08;1&#xff09;阻塞 IO&#xff1a;阻塞的文件描述符 非阻塞 IO&#xff1a;非阻塞的文件描述符 &#…

rust入门(rust教程、rust安装方法)

文章目录 Rust开发入门Rust的特性Rust的应用场景Rust安装——环境配置1. 安装rustup具体执行步骤 2. 验证安装 Rust的卸载基本语法变量与数据类型控制流函数 Rust的所有权系统错误处理实战&#xff1a;构建一个小项目创建新项目编写代码运行项目安装相关链接器运行 删除项目 Ru…

【华为OD题库-081】最长的元音子串长度-Java

题目 题目描述: 定义当一个字符串只有元音字母一(a,e,i,o,u,A,E,l,O,U)组成&#xff0c; 称为元音字符串&#xff0c;现给定一个字符串&#xff0c;请找出其中最长的元音字符串&#xff0c;并返回其长度&#xff0c;如果找不到请返回0&#xff0c; 字符串中任意一个连续字符组成…

Linux安全学习路标

1. 操作系统基础知识 首先&#xff0c;你需要建立坚实的操作系统基础知识&#xff0c;包括Linux文件系统和目录结构、Linux进程管理、权限管理等基本概念。 2. 网络和通信安全 学习关于网络和通信安全的基础知识&#xff0c;包括TCP/IP协议栈、网络攻击类型、防火墙配置、网…

Mysql日志binlog、redolog、undolog

Mysql有多种日志&#xff0c;承担着不同的功能。 BinLog高可用的基石 Binlog是Mysql的server层记录的日志&#xff0c;包含表结构和数据的变更。Binlog有两个常用的作用&#xff0c;一个是用作数据库恢复&#xff0c;通过数据库快照和binlog&#xff0c;我们可以把数据库恢复…

React中使用TypeScript代替prop-types

原文链接 公众号-React中使用TypeScript代替prop-types 个人公众号&#xff0c;呜呜呜&#xff0c;求各位大佬们关注下&#xff0c;本人的公众号主要写React 跟NodeJs的 ​关于prop-types 对于部分的同学&#xff0c;不大了解为什么我们的代码里面要用到prop-types这个库&a…