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

举报
追逐时光者 发表于 2024/06/29 18:40:17 2024/06/29
【摘要】 前言今天我们来讲讲如何使用.NET开源(MIT License)的轻量、灵活、高性能、跨平台的分布式网络爬虫框架DotnetSpider来快速实现网页数据抓取功能。“注意:为了自身安全请在国家法律允许范围内开发网页爬虫功能。网页数据抓取需求本文我们以抓取博客园10天推荐排行榜第一页的文章标题、文章简介和文章地址为示例,并把抓取下来的数据保存到对应的txt文本中。请求地址:https://ww...

前言

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

注意:为了自身安全请在国家法律允许范围内开发网页爬虫功能。

网页数据抓取需求

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

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

创建控制台应用

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

安装DotnetSpider NuGet包

NuGet包管理器搜索:DotnetSpider

添加Serilog日志组件

NuGet包管理器搜索:Serilog.AspNetCore

添加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

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

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("网页数据抓取完成...");
        }
    }
}

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

  • GitHub源码地址:https://github.com/dotnetcore/DotnetSpider
  • GitHub wiki:https://github.com/dotnetcore/DotnetSpider/wiki
  • 本文示例源码:https://github.com/YSGStudyHards/DotNetExercises/tree/master/DotnetSpiderExercise

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

  • https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。