AngleSharp簡單介紹
- AngleSharp 是一個
.NET 庫
- 使您能夠解析基於尖括號的超文字,如
HTML、SVG、MathML、XML
- AngleSharp的一個重要方面是
CSS也可以解析
。 - 同時還是開源,免費的
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
使用場景案例
- 獲取部落格園排行榜的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分析出一些意想不到的圖表
效果圖
- 時間段觀看人數最多?
看來部落格園一般檢視人數最多的是9點->10點,說明哈哈哈,果然大家早上都是喜歡關注程式設計的大事呀
- 時間段點贊人數最多?
果然早起的鳥兒有蟲吃,如果想要部落格點贊高,那就必須早上九點 -> 10點 抓住閱讀高峰期,菜鳥收穫高贊,得到很多人的認可
- 星期幾發文章最多?
看來星期一到星期五中發部落格最多的星期一和星期二,最不想上班的兩天最適合用來靈感創作寫文字
- 哪個大佬發文章比較多?
目測近期京東雲開發者對部落格園貢獻很大,看了一下,質量都是很高的文章,極力推薦
原文地址:https://blog.baibaomen.com/用anglesharp-linqpad抓取分析部落格園排行榜/