首页 > 其他分享 >用AngleSharp & LINQPad抓取分析博客园排行榜

用AngleSharp & LINQPad抓取分析博客园排行榜

时间:2023-09-17 14:34:51浏览次数:64  
标签:AngleSharp LINQPad 博客园 TextContent Util new public

用AngleSharp & LINQPad抓取分析博客园排行榜

 

AngleSharp简单介绍

  1. AngleSharp 是一个 .NET 库
  2. 使您能够解析基于尖括号的超文本,如HTML、SVG、MathML、XML
  3. AngleSharp的一个重要方面是CSS也可以解析
  4. 同时还是开源,免费的

Github: https://github.com/AngleSharp/AngleSharp
使用文档: https://anglesharp.github.io/

开发工具的推荐LINQPad

介绍:一个小巧,打开秒速,随时能写C#,不至于灵感快速流失的小工具
下载地址:https://www.linqpad.net/
有免费版,基本功能已经够用。我们公司买了它的Premium版。

AngleSharp 代码实操

实操前一些分享一些C#的知识点

如何快速发送网络请求获取到数据呢?

可以用如下:
1、HttpWebRequest
2、WebClient
3、HttpClient
4、RestSharp
5、Flurl

本期重点用HttpClient来实现

起手式

引用NuGet包: Install-Package AngleSharp

使用场景案例

  1. 获取博客园排行榜的Html并且解析
IConfiguration config = Configuration.Default.WithDefaultLoader();
string address = "https://www.cnblogs.com/aggsite/SideRight";
IBrowsingContext context = BrowsingContext.New(config);
IDocument document = await context.OpenAsync(address);
IHtmlCollection<IElement> side_right = document.QuerySelectorAll("div");

side_right.Select(m => new { 
        title = m.QuerySelector(".card-title a")?.TextContent,
        url = m.QuerySelectorAll("ul li").Select(x => x.TextContent)
       })
       .Where(x => x.title != null)
       .Dump();

通过上面代码快速就能分析且快速抓取博客园的排行榜,简单,快速,高效 代码少,有没有觉得Linq语法糖配合请求一些框架的强大呢,朋友们

效果图

既然都能抓取数据了,接下来就是爬虫最重要的分析啦

2.分析博客园每天什么时候发博客看的人数最多,点赞的人数最多,星期几发文章多,哪个大佬发文章多

获取数据的方法

通过HttpClient加上Linq加上AngleSharp实现请求获取Hmtl => 保存Json => 分析Json 生成有价值的图表

public void GetData()
{
 var http = new HttpClient();
 var parser = new HtmlParser();

 File.WriteAllText(@"C:\Users\QYM\Desktop\OfficFile\BlogData.json", JsonConvert.SerializeObject(Enumerable.Range(1, 200)
     .AsParallel()
     .AsOrdered()
     .SelectMany(page =>
     {
      var content = new StringContent(JsonConvert.SerializeObject(new
      {
       CategoryId = "808",
       CategoryType = "SiteHome",
       ItemListActionName = "AggSitePostList",
       PageIndex = $"{page}",
       ParentCategoryId = "0",
       TotalPostCount = "4000"
      }), Encoding.UTF8, "application/json");

      var resp = http.PostAsync("https://www.cnblogs.com/AggSite/AggSitePostList", content).Result;

      var document = parser.ParseDocument(resp.Content.ReadAsStringAsync().GetAwaiter().GetResult());


      return document?.QuerySelectorAll("article").Select(pageContext =>
      {
       return new
       {
        Url = pageContext.QuerySelector(".post-item-text a").GetAttribute("href").Trim(),
        Title = pageContext.QuerySelector(".post-item-text a").TextContent.Trim(),
        Context = pageContext.QuerySelector(".post-item-text p").TextContent.Trim(),
        Name = pageContext.QuerySelector("footer a").TextContent.Trim(),
        DateTime = DateTime.Parse(pageContext.QuerySelector("footer .post-meta-item").TextContent),
        LookOK = pageContext.QuerySelector("footer .post-meta-item+a span").TextContent.Trim(),
        LookPerson = pageContext.QuerySelector("footer .post-meta-item+a+a+a span").TextContent.Trim()
       };
      });
     }), Newtonsoft.Json.Formatting.Indented));
}

效果图

获取博客园200页数据

读取数据并且调用LinqPad 自带的Chart图表方法进行分析

public void ReadData()
{
 var data = JsonConvert.DeserializeObject<List<BlogJsonData>>(File.ReadAllText(@"C:\Users\QYM\Desktop\OfficFile\BlogData.json"));

 Util.Chart(data
 .GroupBy(x => x.DateTime.Hour)
 .Select(x => new { Hour = x.Key, ViewCount = 1.0 * x.Sum(v => v.LookPerson) })
 .OrderByDescending(x => x.Hour),
 x => x.Hour,
 y => y.ViewCount, Util.SeriesType.Bar).Dump("时间段观看人数最多");

 Util.Chart(data
 .GroupBy(x => x.DateTime.Hour)
 .Select(x => new { Hour = x.Key, ViewCount = 1.0 * x.Sum(v => v.LookOk) })
 .OrderByDescending(x => x.Hour),
 x => x.Hour,
 y => y.ViewCount, Util.SeriesType.Bar).Dump("时间段点赞人数最多");

 Util.Chart(data
  .GroupBy(x => x.DateTime.DayOfWeek)
  .Select(x => new { WeekDay = x.Key, ArticleCount = x.Count() })
  .OrderBy(x => x.WeekDay),
 x => x.WeekDay.ToString(),
 y => y.ArticleCount, Util.SeriesType.Bar).Dump("星期几发文章最多");

 Util.Chart(data
  .GroupBy(x => x.Name)
  .Select(x => new { UserName = x.Key, ArticleCount = x.Count() })
  .OrderByDescending(x => x.ArticleCount)
  .Take(9),
 x => x.UserName,
 y => y.ArticleCount,  Util.SeriesType.Bar).Dump("哪个大佬发文章比较多");

}

效果图

源文件Json

分析数据的实体

public class BlogJsonData
{
 public string Url { get; set; }
 public string Title { get; set; }
 public string Context { get; set; }
 public string Name { get; set; }
 public DateTime DateTime { get; set; }
 public int LookOk { get; set; }
 public int LookPerson {get;set;}
}

接下来就是见证奇迹的时候,通过分析抓取到html,保存成Json分析出一些意想不到的图表

效果图

  1. 时间段观看人数最多?

看来博客园一般查看人数最多的是9点->10点,说明哈哈哈,果然大家早上都是喜欢关注编程的大事呀

  1. 时间段点赞人数最多?

果然早起的鸟儿有虫吃,如果想要博客点赞高,那就必须早上九点 -> 10点 抓住阅读高峰期,菜鸟收获高赞,得到很多人的认可

  1. 星期几发文章最多?

看来星期一到星期五中发博客最多的星期一和星期二,最不想上班的两天最适合用来灵感创作写文字

  1. 哪个大佬发文章比较多?

目测近期京东云开发者对博客园贡献很大,看了一下,质量都是很高的文章,极力推荐

作者 => 百宝门瞿佑明

原文地址:https://blog.baibaomen.com/用anglesharp-linqpad抓取分析博客园排行榜/

标签:AngleSharp,LINQPad,博客园,TextContent,Util,new,public
From: https://www.cnblogs.com/sexintercourse/p/17708720.html

相关文章

  • 博客园命令行工具 cnb 。
    下载解压添加到系统目录给权限之后基本就能用了wget-chttps://download.cnblogs.com/cli/cnblogs-cli-0.0.2@x86_64-linux-gnu.zipunzipcnblogs-cli-0.0.2@x86_64-linux-gnu.zipcpcnb/usr/binchmod+x/usr/bin/cnb创建令牌通过命令将令牌设置进去:https://account.c......
  • 返璞归真:命令行下逛园子,发布博客园 CLI 预览版
    一边在会员救园,一边我们在码不停蹄地加快园子的建设。为了让大家体验命令行中逛园子的味道,今天发布一个小工具的预览版——博客园命令行工具cnb。该工具用Rust开发,代码开源在github上:https://github.com/cnblogs/cli,帮助文档见readme。预览版0.0.2的CDN下载地址......
  • 我的博客搬家啦!从博客园到CSDN
    大家好!今天我特地给大家发个通知,我决定将我的博客搬迁至CSDN平台。为什么选择搬家至CSDN?作为一个技术爱好者和写作爱好者,我一直在博客园上记录自己学习和工作的点滴。博客园是一个非常好的平台,它提供了良好的用户体验和丰富的社区资源。但是,随着时间的推移,我开始意识到将我的博......
  • 关于博客园最近情况的一些思考
    今天回到家,我在犇犇中偶然得知博客园要倒了,原因是资金不足。博客园作为一个没有广告的网址,我觉得很赞,但是这也直接导致了博客园的收益很小。博客园能走到现在都是一个奇迹,它能不能接续走下去,取决于大家的支持,所以,充会员吧!这是对博客园的唯一支持。博客园的唯一收入来源好像就是......
  • 博客园美化
    目录前言1.前期准备示例博客geek主题Cnblogs-Theme-SimpleMemory-BNDongcute-cnblogs主题2.以上教程步骤总结3.实操配置主题3.1geek主题3.2Cnblogs-Theme-SimpleMemory-BNDong主题前言一直很羡慕别人酷炫,有特色的博客主页,很想自己动手设置但未实施。今天趁着苏拉台风在家,学......
  • 博客园如何设置自定义主题?
    作者:西瓜程序猿主页传送门:https://blog.51cto.com/kimiliucn前言写博客也有一个月了,发现博客园自带的主题都不太好看,然后搜索了一下发现这款主题【Cnblogs-Theme-SimpleMemory】界面还挺好看的,也是开源的。那[西瓜程序猿]就以这个主题来介绍一下如何在博客园中进行配置,跟着一起来操......
  • 关于DDD中聚合设计的思考(以博客园为例)
    前言聚合作为领域模型中重要的业务功能单元,它的设计是领域建模过程中非常重要的工作。其中聚合根的判断并非一件易事,往往给人一种似是而非的感觉,让人难以捉摸,陷入两难的境地。今天笔者就想以博客园为例来探讨下:博客(Blog)和评论(Comment)究竟是不是一个聚合?问题探讨众所周......
  • 博客园美化的一些心得和走过的坑
    申请权限申请js权限是一切的开始,不用多说了吧。套用模板对于前端小白来说,最省时间的美化方法就是套用BNDong大神的模板github链接:https://github.com/BNDong/Cnblogs-Theme-SimpleMemory教程官网:https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2.1/dist/只要跟着快......
  • CSDN转到博客园,主题美化,经验分享
    1引言之前我也因为百度全是csdn,选择在csdn写博客。写博客的原因就是为了学习,输出倒逼输入。最近正好学习了django,自己从头到尾写了一个django-blog网站,感觉很爽。然后开始想着建站,想有一个好看的博客。一直觉得csdn不好看,没有逼格,没有足够的定制化,而且csdn感觉很乱,很多文章乱......
  • 在博客园中美化博客,并使用自定义的主题
    一、开通博客园JS权限这部分不再赘述,可以点击下方链接,查看如何申请博客园JS权限申请二、在博客园中设置相关内容打开你的博客首页->管理->设置设置博客皮肤为“Custom”勾选禁用默认CSS样式三、在博客园设置中粘贴相应代码此部分代码粘贴到【页面定制......