.NET快速实现网页数据抓取

.NET快速实现网页数据抓取

码农世界 2024-05-27 前端 71 次浏览 0个评论

网页数据抓取需求

本文我们以抓取博客园10天推荐排行榜第一页的文章标题、文章简介和文章地址为示例,并把抓取下来的数据保存到对应的txt文本中。

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

    创建控制台应用

    创建名为DotnetSpiderExercise的控制台应用。

    安装DotnetSpider NuGet包

    NuGet包管理器搜索:DotnetSpider

    添加Serilog日志组件

    NuGet包管理器搜索:Serilog.AspNetCore

    添加RecommendedRankingModel

    namespace DotnetSpiderExercise
    {
        public class RecommendedRankingModel
        {
            /// 
            /// 文章标题
            /// 
            public string ArticleTitle { get; set; }
            /// 
            /// 文章简介
            /// 
            public string ArticleSummary { get; set; }
            /// 
            /// 文章地址
            /// 
            public string ArticleUrl { get; set; }
        }
    }

    添加RecommendedRankingSpider

    网页数据抓取的业务逻辑都在这里面。

    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 options,
                DependenceServices services,
                ILogger logger) : base(options, services, logger)
            {
            }
            public static async Task RunAsync()
            {
                var builder = Builder.CreateDefaultBuilder();
                builder.UseSerilog();
                builder.UseDownloader();
                builder.UseQueueDistinctBfsScheduler();
                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();
                    // 网页数据解析
                    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("网页数据抓取完成...");
            }
        }
    }

    抓取数据和页面数据对比

    抓取数据

    页面数据

    文章转载自:追逐时光者

    原文链接:https://www.cnblogs.com/Can-daydayup/p/18208192

    体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

转载请注明来自码农世界,本文标题:《.NET快速实现网页数据抓取》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,71人围观)参与讨论

还没有评论,来说两句吧...

Top