统计个人博客园文章数据(WPF4 版)

     每当需要整理博客文章数据时总感觉很繁琐。虽然有许多功能强大的统计工具(例如,谷歌分析),但是仅限于加载该工具时至今的数据。对于早期未加入统计范围的博文来说就显得很不准确了。博客园管理页面中虽然也有博文详细信息,但要提取出来也很麻烦,总不能每页复制->粘贴到Excel 吧。

     看了老赵一篇关于 《按月统计博客园单个用户的发文数量》的文章后,于是决定也从“随笔档案”下手做一个自动抓取博文信息的工具,欢迎大家多多交流探讨!

工作原理

     博客园的随笔档案是按每月博文进行归总的页面,例如“http://www.cnblogs.com/gnielee/archive/2010/04.html” 会列出我在2010年4月写过的所有文章。浏览该页面的HTML 代码会看到类似下面的代码片段(代码格式在本文中调整过)。

<div class="entrylistPosttitle">
<
a id="ArchiveMonth1_Days_Entries_ctl00_TitleUrl" class="entrylistItemTitle"
href="http://www.cnblogs.com/gnielee/archive/2010/04/17/microsoft-research-rex-tool.html">
Microsoft Rex 正则表达式工具</a>
</
div> <div class="entrylistPostSummary">
&nbsp;摘要: <img src="http://images.cnblogs.com/cnblogs_com/gnielee/200730/o_channel9.jpg" class="desc_img"/> 这里都是摘要内容… …
<a href='http://www.cnblogs.com/gnielee/archive/2010/04/17/microsoft-research-rex-tool.html'>阅读全文</a></div> <div class="entrylistItemPostDesc">
posted @ <a href=http://www.cnblogs.com/gnielee/archive/2010/04/17/microsoft-research-rex-tool.html
Title = "permalink">2010-04-17 09:42</a>
Gnie 阅读(1574) | <a href=http://www.cnblogs.com/gnielee/archive/2010/04/17/microsoft-research-rex-tool.html#FeedBack
Title = "comments, pingbacks, trackbacks">评论 (35)</a>
&nbsp;<a href="http://www.cnblogs.com/gnielee/admin/EditPosts.aspx?postid=1714077">编辑</a>
</
div>

     看到这些代码后心中有稍许安慰。在<div class="entrylistPosttitle"> 中有我想要的博文“标题”和“链接地址”数据,在<div class="entrylistItemPostDesc"> 中有博文的“阅读量”和“评论量”。注,以上HTML 代码不一定实用所有博客园主题,大家可按各自主题设置自行调整正则表达式对比模式,接下来要做的就是将这些数据提取出来。

整理HTML 数据

首先通过WebClient 按月获取到随笔档案的HTML 代码,并针对标题中的一些特殊字符串(例如,&amp;)进行替换:

private string GetHtmlCode(string strUid, string strMonth)
{
    WebClient client = new WebClient();
    client.Encoding = Encoding.GetEncoding("UTF-8");
    string url = String.Format("http://www.cnblogs.com/{0}/archive/{1}.html", strUid, strMonth);
    string htmlCode = client.DownloadString(url);
    htmlCode = htmlCode.Replace("&amp;", "&");
    htmlCode = htmlCode.Replace("&lt;", "<");
    htmlCode = htmlCode.Replace("&gt;", ">");
    return htmlCode;
}

创建一个Article 类保存博文相关数据:

public class Article
{
    public string Title { get; set; }
    public  Url { get; set; }
    public int Read { get; set; }
    public int Comment { get; set; }
}

通过正则表达式比对,获取“标题”、“链接”、“阅读量”、“评论量”数据,并存入blogInfo 中:

ObservableCollection<Article> blogInfo = new ObservableCollection<Article>();
private void GetBlogData(string strDate, string strPattern)
{
    MatchCollection matchCollection = Regex.Matches(GetHtmlCode(urlText.Text.Trim(), strDate), 
strPattern, RegexOptions.IgnoreCase); foreach (Match match in matchCollection) { blogInfo.Add(new Article() { Title = match.Groups["title"].Value.Trim(), Url = new match.Groups["address"].Value.Trim()), Read = Convert.ToInt32(match.Groups["read"].Value.Trim()), Comment = Convert.ToInt32(match.Groups["comment"].Value.Trim()) }); } }

     最后,通过一个Button 事件触发以上方法,其中比较费事的就是正则表达式的定义regexPattern,将所有取到的数据与DataGrid 列表进行Binding。

private void goBtn_Click(object sender, RoutedEventArgs e)
{
    blogInfo.Clear();
    DateTime fromDate = Convert.ToDateTime(fromDatePicker.Text.Trim());
    DateTime toDate = Convert.ToDateTime(toDatePicker.Text.Trim()).Add(new TimeSpan(30, 0, 0, 0));
    if (toDate < fromDate)
    {
        MessageBox.Show("ToDate can't earlier than FromDate");
    }
    else
    {
        string datePattern;
        string regexPattern = @"<div class=""entrylistPosttitle""><a id=""[\w]+"" class=""entrylistItemTitle"" href=""(?<address>\S+)"">(?<title>[\x00-\xff\S]+?)</a></div>[\S\s]+?"
                            + @"<div class=""entrylistItemPostDesc"">[\S\s]+?\((?<read>\d+)\)[\S\s]+?\((?<comment>\d+)\)";
        while (fromDate <= toDate)
        {
            datePattern = fromDate.ToString("yyyy/MM");
            GetBlogData(datePattern, regexPattern);
            fromDate = fromDate.Add(new TimeSpan(30, 0, 0, 0));
        }
                
        int readCount = 0, commentCount = 0;
        foreach (Article blogList in blogInfo)
        {
            readCount += blogList.Read;
            commentCount += blogList.Comment;
        }
        sumLabel.Content = String.Format("Article: {0}    Read: {1}    Comment: {2}", 
            blogInfo.Count.ToString(),readCount.ToString(),commentCount.ToString());
                
        dataGrid.DataContext = blogInfo;
    }
}

     数据的抓取速度取决于随笔档案的数量和当时的网速。有时我这里上博客园很慢,那就别指望取到数据了。以下是软件截图,其中还添加了将数据导出Excel 的功能。

CnblogsData

ToExcel

相关参考

1. .NET Framework 4 Regular Expression Language Elements

2. WPF 4 DataGrid 控件(基本功能篇)

3. WPF 4 DataGrid 控件(自定义样式篇

4. WPF 4 DataGrid 控件(进阶篇一)

源码下载

     软件本身主要涉及WPF4 的两个新控件:DatePicker、DataGrid,感兴趣的朋友可以下载源代码研究,或者再加以完善,欢迎大家拍砖交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCvSharp4是一个基于OpenCV的开源计算机视觉库,它提供了各种功能和算法,用于处理图像和视频。通过使用OpenCvSharp4,我们可以对图像进行各种统计分析,例如计算图像的直方图。 在统计图像方面,可以使用OpenCvSharp4计算图像的直方图。直方图是一种表示图像亮度分布的图形,它将图像中所有像素的亮度值进行统计,然后将统计结果以图形的形式展示出来。通过直方图,我们可以更直观地了解图像的亮度分布情况。 在OpenCvSharp4中,可以使用`Cv2.CalcHist`方法计算图像的直方图。此方法需要指定图像和通道的数量,并将结果存储在一个数组中。例如,以下代码可以计算一张灰度图像的直方图: ```csharp using OpenCvSharp; Mat image = Cv2.ImRead("image.jpg", ImreadModes.Grayscale); Mat[] images = { image }; int[] channels = { 0 }; // 使用0通道(灰度图像只有一个通道) int[] histSize = { 256 }; // 像素值范围为0到255,共256个值 Rangef[] ranges = { new Rangef(0, 256) }; // 像素值的范围 Mat hist = new Mat(); Cv2.CalcHist(images, channels, null, hist, 1, histSize, ranges); ``` 在上述代码中,`Cv2.ImRead`用于读取图像,`Cv2.CalcHist`用于计算直方图。计算完成后,直方图将存储在`hist`矩阵中。 通过分析直方图的结果,我们可以得到图像的一些统计信息,例如图像的亮度分布情况、亮度值的平均值、图像的对比度等。这些统计信息对于图像的后续处理和分析非常有用。 总结来说,OpenCvSharp4提供了方便的功能和方法,用于统计和分析图像。通过计算图像的直方图,我们可以了解图像的亮度分布情况,并得到一些有用的统计信息。 ### 回答2: 在中使用 OpenCvSharp4 统计图像非常简单方便。首先,我们需要安装 OpenCvSharp4 库并导入。然后,我们可以使用该库提供的各种图像处理函数进行图像统计。 常见的图像统计包括计算图像的像素总数、最大值、最小值、平均值、方差和标准差等。我们可以使用 OpenCvSharp4 中的函数来实现这些统计。 例如,我们可以使用 `Cv2.ImRead` 函数读取图像并将其存储在一个 `Mat` 对象中。然后,我们可以使用 `Mat.Total` 属性获取图像的像素总数,使用 `Mat.Max` 和 `Mat.Min` 方法分别获取图像的最大值和最小值。使用 `Mat.Mean` 方法可以计算图像的均值,使用 `Mat.Var` 方法可以计算图像的方差,使用 `Mat.StdDev` 方法可以计算图像的标准差。 除了这些基本的统计之外,OpenCvSharp4 还提供了其他功能强大的图像处理函数,例如直方图统计、灰度图像统计和颜色特征统计等。我们可以根据需求选择合适的函数来进行图像统计。 总的来说,OpenCvSharp4 提供了丰富的图像处理函数,可以方便地进行图像统计。在中使用 OpenCvSharp4 进行图像统计,不仅可以实现基本的统计功能,而且还可以进行更加复杂的图像分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值