LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【C#】.NET 開源爬蟲框架 DotnetSpider 快速實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)抓取

admin
2024年5月23日 15:42 本文熱度 1739

前言

今天我們來(lái)講講如何使用.NET開源(MIT License)的輕量、靈活、高性能、跨平臺(tái)的分布式網(wǎng)絡(luò)爬蟲框架DotnetSpider來(lái)快速實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)抓取功能。

注意:為了自身安全請(qǐng)?jiān)趪?guó)家法律允許范圍內(nèi)開發(fā)網(wǎng)頁(yè)爬蟲功能。

網(wǎng)頁(yè)數(shù)據(jù)抓取需求

本文我們以抓取博客園10天推薦排行榜第一頁(yè)的文章標(biāo)題、文章簡(jiǎn)介和文章地址為示例,并把抓取下來(lái)的數(shù)據(jù)保存到對(duì)應(yīng)的txt文本中。

  • 請(qǐng)求地址:https://www.cnblogs.com/aggsite/topdiggs

創(chuàng)建控制臺(tái)應(yīng)用

創(chuàng)建名為DotnetSpiderExercise的控制臺(tái)應(yīng)用。

安裝DotnetSpider NuGet包

NuGet包管理器搜索:DotnetSpider

添加Serilog日志組件

NuGet包管理器搜索:Serilog.AspNetCore

添加RecommendedRankingModel

namespace DotnetSpiderExercise
{
    public class RecommendedRankingModel
    {
        /// <summary>
        /// 文章標(biāo)題
        /// </summary>
        public string ArticleTitle { get; set; }

        /// <summary>
        /// 文章簡(jiǎn)介
        /// </summary>
        public string ArticleSummary { get; set; }

        /// <summary>
        /// 文章地址
        /// </summary>
        public string ArticleUrl { get; set; }
    }
}

添加RecommendedRankingSpider

網(wǎng)頁(yè)數(shù)據(jù)抓取的業(yè)務(wù)邏輯都在這里面。

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());
            //使用控制臺(tái)存儲(chǔ)器
            AddDataFlow(new ConsoleStorage());
            //添加采集請(qǐng)求:博客園10天推薦排行榜
            await AddRequestsAsync(new Request("https://www.cnblogs.com/aggsite/topdiggs")
            {
                //請(qǐng)求超時(shí)10秒
                Timeout = 10000
            });
        }

        class Parser : DataParser
        {
            public override Task InitializeAsync()
            {
                return Task.CompletedTask;
            }

            protected override Task ParseAsync(DataFlowContext context)
            {
                var recommendedRankingList = new List<RecommendedRankingModel>();
                // 網(wǎng)頁(yè)數(shù)據(jù)解析
                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}篇文章 標(biāo)題:{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 = $"文章標(biāo)題:{model.ArticleTitle}\r\n文章簡(jiǎn)介:{model.ArticleSummary}\r\n文章地址:{model.ArticleUrl}";
                        sw.WriteLine(line + "\r\n ========================================================================================== \r\n");
                    }
                }
                return Task.CompletedTask;
            }
        }
    }
}

Program執(zhí)行數(shù)據(jù)抓取

namespace DotnetSpiderExercise
{
    public class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("網(wǎng)頁(yè)數(shù)據(jù)抓取開始...");

            await RecommendedRankingSpider.RunAsync();

            Console.WriteLine("網(wǎng)頁(yè)數(shù)據(jù)抓取完成...");
        }
    }
}

抓取數(shù)據(jù)和頁(yè)面數(shù)據(jù)對(duì)比

抓取數(shù)據(jù)

頁(yè)面數(shù)據(jù)

項(xiàng)目源碼地址


該文章在 2024/5/23 15:42:11 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲乱码AV乱码国产精品 | 曰韩国产欧美另类视频 | 日韩中文字幕在线 | 亚洲色欧美色国产综合色 | 五月天AV电影在线播放 | 在线国产视频不卡 |