猜猜博客园最热门的标签
每天翻开技术博客,映入眼帘的是各种技术的关键字,五花八门,今天突然想知道最近比较热门的技术,谷歌搜了半天,得不出所以然。干脆自己用C#写了个小程序,用来统计博客园排名前1000的园主最爱的tag,从某方面也能反映出当下(最近几年)热议的话题吧。
本文利用了HtmlAgilityPack库,这是一个将Html转换为Xml,并可使用XPath语法来查询的HTML解析库。小程序运行大概5分钟左右(公司网速最近太慢,不然还会更快一点)就将排名前1000名博客的tag统计出来了,解析起来相对于Winista.Htmlparser.Net而言还是比较快速高效的。
一、获取博客园排名前1000的博客地址
首页有一个按积分排行页面链接,上面列出了博客园前3000名:
http://www.cnblogs.com/AllBloggers.aspx
其中博客路径与rss的Xpath应该是:".//a[@href]" ,同时rss的链接后面都带有rss.aspx,于是我把它过滤了,剩下的即是排名前3000的博客地址
int Max = 1000; HtmlWeb webClient = new HtmlWeb(); HtmlDocument doc = webClient.Load("http://www.cnblogs.com/AllBloggers.aspx"); HtmlNodeCollection hrefList = doc.DocumentNode.SelectNodes(".//a[@href]"); List<string> urllist=new List<string>(); if (hrefList != null) { foreach (HtmlNode href in hrefList) { HtmlAttribute att = href.Attributes["href"]; if(!att.Value.Contains("rss.aspx")) { urllist.Add(att.Value); } if (urllist.Count >= Max) break; } }
另外,我们需要一个存储tag关键字以及文章数量的数据结构
Dictionary<string,int> dic=new Dictionary<string, int>();
二、获取博客的tag标签列表与其对应的文章数量
循环这1000个博客,并获取博客的tag列表,tag列表是在博客地址的后面加上/tag,其中tag名称的xpath是.//table[@id='MyTag1_dtTagList']/tr/td/a
文章个数的xpath是.//table[@id='MyTag1_dtTagList']/tr/td/span,将它解析出来放入dic,当然如果存在则在文章数上累加,如果不存在此tag则插入到dic中,在这里我把tag全都转换为大写,以便更好地合并相同的tag
foreach (var url in urllist) { doc = webClient.Load(url + "tag"); hrefList = doc.DocumentNode.SelectNodes(".//table[@id='MyTag1_dtTagList']/tr/td/a"); HtmlNodeCollection spanlist = doc.DocumentNode.SelectNodes(".//table[@id='MyTag1_dtTagList']/tr/td/span"); if(hrefList!=null) { if(spanlist.Count!=hrefList.Count) { throw new Exception("出错"); } int j = 0; foreach (var span in spanlist) { string str=span.InnerText; int count = Int32.Parse(str.Replace("(", "").Replace(")", "")); string tag = hrefList[j].InnerText.ToUpper().Trim(); if(dic.Keys.Contains(tag)) { dic[tag] += count; } else { dic.Add(tag,count); } Console.WriteLine("{0}:\t\t{1}\r\n", tag, count); j++; } } }
三、Linq排序
我们使用linq来对字典按文章数倒序排列
var q = from d in dic orderby d.Value descending select d;
四、输出到文件
FileStream fs = new FileStream("output.txt", FileMode.Create); StreamWriter sw = new StreamWriter(fs); foreach (var i in q) { string content=string.Format("{0}:\t{1}",i.Key,i.Value); sw.WriteLine(content); } //清空缓冲区 sw.Flush(); //关闭流 sw.Close(); fs.Close(); Console.ReadLine();
运行起来,结果出来了,看起来博客园是微软的天下啊
========================博客积分前1000名tag统计==================
C#: 1635
JAVASCRIPT: 1579
ASP.NET: 1334
.NET: 1226
SILVERLIGHT: 1205
JQUERY: 717
SQL: 640
CSS: 616
WCF: 569
WPF: 469
LINUX: 446
DOWNMOON: 435
ORACLE: 418
JS: 403
WINDOWS MOBILE: 374
ASP.NET MVC: 345
ANDROID: 340
SQL SERVER: 302
MVC: 293
AJAX: 287
HTML: 279
JAVA: 278
设计模式: 274
WINDOWS PHONE 7: 256
LINQ: 255
WINFORM: 239
FLASH: 233
FLEX: 233
数据库: 230
XML: 230
SHAREPOINT: 224
IPHONE: 217
PHP: 200
HTML5: 194
========================博客积分前3000名tag统计==================
C#: 2808
JAVASCRIPT: 2575
ASP.NET: 2280
.NET: 1987
SILVERLIGHT: 1654
JQUERY: 1336
CSS: 1136
SQL: 1041
LINUX: 925
WCF: 839
ANDROID: 791
JS: 765
JAVA: 682
ORACLE: 630
WPF: 623
SHAREPOINT: 556
PHP: 528
AJAX: 526
SQL SERVER: 521
设计模式: 505
ASP.NET MVC: 504
HTML: 476
MVC: 464
WINDOWS MOBILE: 458
XML: 455
PYTHON: 447
DOWNMOON: 435
数据库: 425
C++: 415
FLEX: 415
LINQ: 412
WINFORM: 378
前1000和前3000的top10都没啥变化,看来还是比较准确的。说明大家关注这些比较多一些,并不能说明没关注别的。例如下面有些朋友的tag:
=============================有意思的tag==============
嫁给有钱人:1
和狗狗的十个约定:1
清宫图:1
女性安全期:1
响一声垃圾电话:1
腾讯不想对你说什么了:1
移民加拿大:1
待遇不好:1
艳照门:1
我承认我很无聊,哈哈
附HtmlagilityPack解析库的下载地址
http://htmlagilitypack.codeplex.com/
PS:觉得还有点意思的帮忙按个推荐呗。谢了。