网页数据抓取需求
本文我们以抓取博客园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("网页数据抓取完成...");}}
}
抓取数据和页面数据对比
抓取数据
页面数据
文章转载自:追逐时光者
原文链接:https://www.cnblogs.com/Can-daydayup/p/18208192
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构