猜猜博客园最热门的标签

每天翻开技术博客,映入眼帘的是各种技术的关键字,五花八门,今天突然想知道最近比较热门的技术,谷歌搜了半天,得不出所以然。干脆自己用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:觉得还有点意思的帮忙按个推荐呗。谢了。

posted @ 2012-08-02 11:02  李久寧  阅读(3831)  评论(27编辑  收藏  举报