.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.mzph.cn/news/207605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3组件使用问题

Vue3组件学习 文章目录 Vue3组件学习一、Message 全局提示组件返回数据换行问题二、DatePicker 日期选择框组件限制选定年份问题 一、Message 全局提示组件返回数据换行问题 问题&#xff1a;使用中发现仅仅通过写入\n或<br/>&#xff0c;无法实现回车显示的结果。 解决…

在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 简易版 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…

检验科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…

03DockerFile

03DockerFile 1.DockerFile的概念 用来构建docker​镜像的构建文件,由一系列参数和命令构成的脚本 大体总览: ​​ ‍ 1.构建过程 要遵循的规则: ​​ 2.执行流程 ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍

Docker安装postgres最新版

1. postgres数据库 PostgreSQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是关于PostgreSQL的一些介绍&#xff1a; 开源性&#xff1a;PostgreSQL是一个开源项目&#xff0c;可以…

如何检查代理和防火墙设置

这样的错误可能会突然出现在个人计算机屏幕上&#xff0c;当访问您喜爱的网站时。这是什么原因&#xff0c;如何快速解决这个问题&#xff1f;我们将弄清楚如何检查。 关于访问问题 对网站的访问受阻实际上是一个非常常见的错误&#xff0c;它既可能是由于物理原因&#xff08…

Linux高级管理-搭建网站服务

在Ihternet 网络环境中&#xff0c;Web 服务无疑是最为流行的应用系统。有了Web站点&#xff0c;企业可以充分 展示自己的产品&#xff0c;宣传企业形象。Web站点还为企业提供了与客户交流、电子商务交易平台等丰富 的网络应用。部署与维护Web 服务是运维工程师必须掌握的一个技…