当前位置:首页 > 科技  > 软件

我们一起聊聊.NET快速实现网页数据抓取

来源: 责编: 时间:2024-05-23 08:32:08 286观看
导读前言今天我们来讲讲如何使用.NET开源(MIT License)的轻量、灵活、高性能、跨平台的分布式网络爬虫框架DotnetSpider来快速实现网页数据抓取功能。注意:为了自身安全请在国家法律允许范围内开发网页爬虫功能。网页数据抓

前言

今天我们来讲讲如何使用.NET开源(MIT License)的轻量、灵活、高性能、跨平台的分布式网络爬虫框架DotnetSpider来快速实现网页数据抓取功能。YNZ28资讯网——每日最新资讯28at.com

注意:为了自身安全请在国家法律允许范围内开发网页爬虫功能。YNZ28资讯网——每日最新资讯28at.com

网页数据抓取需求

本文我们以抓取博客园10天推荐排行榜第一页的文章标题、文章简介和文章地址为示例,并把抓取下来的数据保存到对应的txt文本中。YNZ28资讯网——每日最新资讯28at.com

  • 请求地址:https://www.cnblogs.com/aggsite/topdiggs

图片图片YNZ28资讯网——每日最新资讯28at.com

创建控制台应用

创建名为DotnetSpiderExercise的控制台应用。YNZ28资讯网——每日最新资讯28at.com

图片图片YNZ28资讯网——每日最新资讯28at.com

图片图片YNZ28资讯网——每日最新资讯28at.com

图片图片YNZ28资讯网——每日最新资讯28at.com

安装DotnetSpider NuGet包

NuGet包管理器搜索:DotnetSpiderYNZ28资讯网——每日最新资讯28at.com

图片图片YNZ28资讯网——每日最新资讯28at.com

添加Serilog日志组件

NuGet包管理器搜索:Serilog.AspNetCoreYNZ28资讯网——每日最新资讯28at.com

图片图片YNZ28资讯网——每日最新资讯28at.com

添加RecommendedRankingModel

namespace DotnetSpiderExercise{    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

网页数据抓取的业务逻辑都在这里面。YNZ28资讯网——每日最新资讯28at.com

using DotnetSpider.DataFlow.Parser;using DotnetSpider.DataFlow;using DotnetSpider.Downloader;using DotnetSpider.Http;using DotnetSpider.Scheduler.Component;using DotnetSpider.Selector;using DotnetSpider;using Microsoft.Extensions.Logging;using Microsoft.Extensions.Options;using Serilog;using DotnetSpider.Scheduler;using Microsoft.Extensions.Hosting;using System.Reflection;namespace DotnetSpiderExercise{    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());            //添加采集请求:博客园10天推荐排行榜            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 number = 1;                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;                    Console.WriteLine($"第{number}篇文章 标题:{articleTitle}");                    recommendedRankingList.Add(new RecommendedRankingModel                    {                        ArticleTitle = articleTitle,                        ArticleSummary = articleSummary,                        ArticleUrl = articleUrl                    });                    number++;                }                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 ========================================================================================== /r/n");                    }                }                return Task.CompletedTask;            }        }    }}

Program执行数据抓取

namespace DotnetSpiderExercise{    public class Program    {        static async Task Main(string[] args)        {            Console.WriteLine("网页数据抓取开始...");            await RecommendedRankingSpider.RunAsync();            Console.WriteLine("网页数据抓取完成...");        }    }}

图片图片YNZ28资讯网——每日最新资讯28at.com

抓取数据和页面数据对比

抓取数据

图片图片YNZ28资讯网——每日最新资讯28at.com

页面数据

图片图片YNZ28资讯网——每日最新资讯28at.com

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看

本文链接:http://www.28at.com/showinfo-26-90186-0.html我们一起聊聊.NET快速实现网页数据抓取

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 快手一季度营收 294 亿元同比增长 16.6%,平均日活跃用户达 3.94 亿

下一篇: Rust 上手很难?搞懂这些知识,前端开发能快速成为 Rust 高手

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
Top