偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

我們一起聊聊.NET快速實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)抓取

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

前言

今天我們來講講如何使用.NET開源(MIT License)的輕量、靈活、高性能、跨平臺(tái)的分布式網(wǎng)絡(luò)爬蟲框架DotnetSpider來快速實(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)介和文章地址為示例,并把抓取下來的數(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)目源碼地址

更多項(xiàng)目實(shí)用功能和特性歡迎前往項(xiàng)目開源地址查看??,別忘了給項(xiàng)目一個(gè)Star支持??。

  • GitHub源碼地址:https://github.com/dotnetcore/DotnetSpider
  • GitHub wiki:https://github.com/dotnetcore/DotnetSpider/wiki
  • 本文示例源碼:https://github.com/YSGStudyHards/DotNetExercises/tree/master/DotnetSpiderExercise
責(zé)任編輯:武曉燕 來源: 追逐時(shí)光者
相關(guān)推薦

2023-09-15 06:56:01

RC.NET 6Release

2024-11-27 16:07:45

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開發(fā)模式

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-09-10 21:42:31

2024-02-20 21:34:16

循環(huán)GolangGo

2021-08-27 07:06:10

IOJava抽象

2024-06-19 09:40:21

.NET人臉識(shí)別框架

2023-03-26 23:47:32

Go內(nèi)存模型

2024-07-26 09:47:28

2022-10-08 00:00:05

SQL機(jī)制結(jié)構(gòu)

2022-02-23 08:41:58

NATIPv4IPv6

2022-09-22 08:06:29

計(jì)算機(jī)平板微信

2024-11-28 09:57:50

C#事件發(fā)布器

2021-08-12 07:49:24

mysql

2023-07-24 09:41:08

自動(dòng)駕駛技術(shù)交通

2024-06-12 09:52:00

2022-12-05 09:10:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)