用AngleSharp & LINQPad抓取分析部落格園排行榜

2023-02-13 12:00:53

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抓取分析部落格園排行榜/