CSDN.NET是中国著名的IT技术社区,为IT专业技术人员提供最全面的信息传播和服务平台。每天,大量的开发者都会到论坛上看帖和回帖,但是在使用过程中,我感觉有些不方便,主要表现在以下几点:

  • 帖子数量多,还没看到就已经沉下去;
  • 回帖速度快,无法及时获得帖子状态;
  • 广告比较多,看帖速度慢;

所以,我根据自己的使用习惯,用C#编写了一个CSDN论坛阅读器--Csdn Reader。程序运行界面如图所示。

下面,我就来介绍一下它是如何编写的。

一、 读取帖子列表

  由于不可能获得网站后台数据,我只能通过分析网页的源代码来得到需要的数据。为了获得最新的帖子列表,我使用了以下方法。

1. HttpWebRequest/ HttpWebResponse

  System.Net.HttpWebRequest和System.Net.HttpWebResponse类负责发送以及接收请求,使用户能够直接与使用 HTTP 的服务器交互。

  例如,要获得“.NET技术 ”

(http://community.csdn.net/Expert/ForumsList.asp?typenum=1&roomid=52)的源代码,

  首先,根据指定的网页地址创建HttpWebRequest对象

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);

  然后,创建HttpWebResponse对象接收服务器要返回的信息,也就是源代码,

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

  最后,将获取的信息读取出来即可。

// encoding是网页使用的编码,不设置则为默认值:UTF-8

System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), encoding);

//读取内容到字符串

string Html = sr.ReadToEnd();

2. 正则表达式

分析帖子列表的html源代码,可以发现显示帖子的html格式如下:

<a href="/Expert/TopicView1.asp?id=帖子ID" target="_blank">帖子标题</a>

</td>

<td align="right">用户</td>

<td width="30" align="right">分数</td>

<td width="30" align="right">回复</td>

<td width="80" align="right">时间</td>

这样,就可以建立如下的正则表达式:

string strRegex =

@"<a[^<]*TopicView1.asp[^<]*id=(?<ID>[^<]*)""[^<]*target[^<]*>(?<topic>[^<]*)</a>[^<]*</td>[^<]*<td[^>]*>(?<user>[^<]*)</td>[^<]*<td[^>]*>(?<Points>[^<]*)</td>[^<]*<td[^>]*>(?<Replies>[^<]*)</td>[^<]*<td[^>]*>(?<ReplayTime>[^<]*)</td>";

小知识:什么是正则表达式?

  正则表达式,就是用某种模式去匹配一类字符串的一个公式。正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速分析大量文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。

然后,通过Match对象就很容易得到帖子的相关信息。代码如下:

Regex r;

MatchCollection m;

r = new Regex(strRegex, RegexOptions.IgnoreCase);

m = r.Matches(strHTML);

for (int i = 0; i < m.Count; i++)

{

Topic t = new Topic(m[i].Groups["ID"].Value

, m[i].Groups["topic"].Value

, m[i].Groups["user"].Value

, m[i].Groups["Points"].Value

, m[i].Groups["Replies"].Value

, m[i].Groups["ReplayTime"].Value);i

}

这里,我建了一个Topic类去保存帖子的各项属性,以方便对帖子列表显示进行控制。比如对于新贴子用一个特别的图标表示:

if (int.Parse(t.Replies) == 0)

item1.ImageKey = "NewTopic";

二、 看帖

打开任一帖子的html代码,可以发现它实际上是一个XML文件,这时就需要使用XSLT。

小知识:什么是XSLT

XSLT的英文标准名称为eXtensible Stylesheet Language Transformation(可扩展样式表语言转换)。XSLT可以将源 XML 文档的内容转换为另一个格式或结构不同的文档。

由于篇幅有限,这里我就不具体介绍XSLT,其相关信息读者可以查看MSDN。另外, VS.NET2005编辑器支持调试XSLT,可以随时查看转换效果。

调用XSL的代码如下:

XmlDocument xml = new XmlDocument();

//加载帖子的XML源代码

xml.LoadXml(strHTML);

XslCompiledTransform xslt = new XslCompiledTransform();

//加载XSLT

xslt.Load(Application.StartupPath.Replace(@"\", @"\\") + @"\\csdn.xsl");

//转换后输出到字符串

System.IO.StringWriter writer = new System.IO.StringWriter();

xslt.Transform(xml, null, writer);

strHtml = writer.ToString();

//最后将转换后的HTML显示到WebBrowser控件,IE为控件名

this.IE.Document.Write(strHtml);

三、 回帖

看贴一定要回帖。同样要使用HttpWebRequest/ HttpWebResponse类,但是这时是向服务器发送数据,需要在使用GetResponse创建HttpWebResponse对象之前先向HttpWebRequest对象写入需要发送的数据,代码如下:

//设置请求为Post

request.ContentType = "application/x-www-form-urlencoded";

request.Method = "POST";

//将发送的数据转换成byte数组

byte[] b = encoding.GetBytes(PostData);

//将数据写入到HttpWebRequest对象

request.ContentLength = b.Length;

System.IO.Stream sw =request.GetRequestStream();

sw.Write(b, 0, b.Length);

sw.Close();

小结

这里介绍的只是CSDN Reader的基本功能。读者可以到http://feiyun0112.cnblogs.com/下载最新的源代码。我会不断的完善和更新,希望大家多提宝贵的意见和建议。

刊登于 电脑报2006年11月6日  第44期

转载于:https://www.cnblogs.com/feiyun0112/archive/2006/11/07/552868.html

献给开发者的大礼--打造CSDN论坛专用阅读器(电脑报2006年11月6日 第44期)相关推荐

  1. 微众银行张开翔: FISCO BCOS - 开放的区块链实践之道 | 11月25日【区块链技术与实践】论坛...

    张开翔老师,微众银行区块链首席架构师. 张老师在互联网业和金融行业工作多年,有丰富的分布式系统和海量服务实践经历,于2015年专注投入区块链.隐私计算的技术和行业研究,主持微众银行区块链全栈技术体系设 ...

  2. 华为云开发者日震撼来袭!11月20日,上海见

    首场华为云开发者日HDC.Cloud Day开始报名啦!相约上海,感受科技的无限魅力! 华为云开发者日HDC.Cloud Day是面向全球开发者的旗舰活动,打造开发者专属的技术盛宴.汇聚来自千行百业. ...

  3. 2011年中国移动开发者大会11月3-4日与您相约北京

    2011中国移动开发者大会将是2011年度中国最大规模的移动盛事. 本次大会全面覆盖软件应用和服务.平台.运营商.终端.芯片等移动产业链各个领域,与此同时,专注于产业链中最活跃的因素--应用软件的研发 ...

  4. 关于11月28日CSDN遭受网络攻击的情况说明

    各位CSDN网友: 2014年11月28日,CSDN网站因遭受网络攻击导致用户无法正常登陆或访问,对此,许多网友通过微博.微信.邮件.QQ等多种方式,对我们表示了极大的关注.经过技术人员的努力,在遭受 ...

  5. VR AR应用时代来临!2017环球资源VR AR应用高峰论坛(上海)11月8日盛大揭幕

    2017环球资源VR AR行业应用高峰论坛(上海)将于11月8日在上海龙之梦万丽酒店隆重举办. 论坛由45周年B2B多渠道媒体公司--环球资源联合25年资深全媒体平台--世界经理人倾力打造,并获得中国 ...

  6. 【北京】VMware vForum 2012 开发者盛会(11月20-21日)

    [珠海] 11月25日(周日下午)OSC 源创会 我要报名» 注: 赠书微博需要粉丝数超过50人 时间: 11月20日 09:00- 11月21日 18:00 地点: 北京 国际饭店会议中心 报名链接 ...

  7. 开发者的云计算盛会,期待您的参与(11月20日~21日,北京,免费)

    立即报名 报名截止时间:11月16日23:00 天气正逐渐变冷,而云计算的热潮正席卷全球.作为开发者,您或许可以不关注Windows 8,您或许可以不关注智能手机,但您不能不关注云计算,因为您开发的程 ...

  8. 相约11月25日,开发者的嘉年华

    >>厦门GDG DevFest 2018 2018 年 11 月 25 日,大家期待已久的厦门GDG DevFest 2018 将于厦门大学科艺中心隆重举行! 此次活动主题是时下最受关注的 ...

  9. 转载sanmusoft 论电脑报论坛的挂掉及电脑报的最后倒掉

    论电脑报论坛的挂掉及电脑报的最后倒掉! 听说,电脑报的论坛又挂掉了,听说而已,我没有亲见.但我却见过未挂的电脑报论坛,慢慢悠悠的被各大网友灌来灌去,也倒自在,终于在2005年年初被某些水友玩挂一块硬盘 ...

最新文章

  1. 关于java.util.LinkedHashMap cannot be cast to ......的解决办法
  2. Python使用matplotlib可视化散点图、并在可视化图像的底部和右边添加边缘直方图、自定义边缘直方图的色彩(Marginal Histogram)
  3. Python-使用python-memcache操作Memcached
  4. c调python_py_initialize:C调Python出错 是初始化错误?
  5. C++ opengl 纹理生成
  6. 国土空间规划的体系和内容
  7. python万年历时钟_python实现万年历类calendar
  8. java emoji编码转换_编码:unicode、utf-8以及emoji
  9. php批量查qq号码是否冻结,PHP批量检查网站的sitemap是否存在
  10. 【esp32】esp-ali-smartliving源码分析
  11. php在线图片签名,ElementUi+Vue+Php+fpdf+fpdi 实现文档在线签订(图片水印、手写签名)...
  12. 严格模式和普通模式之间的区别
  13. 为什么 MongoDB 使用 B 树?
  14. CSS 字体样式大全
  15. Linux C 编程开发环境(工具链,编译,汇编,链接,库)基础知识与实践
  16. 结合 Whisper + Stable-diffusion 的语音生成图像任务
  17. 在win10上去除移动硬盘的bitlocker
  18. 计算机核心期刊的终审环节,核心期刊终审状态要多久
  19. android程序字体大小,Android如何动态调整应用字体大小详解
  20. 【初等数论】个人数论总结

热门文章

  1. 企业进销存管理系统 email_进销存财务软件选它就对了!
  2. Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)
  3. 翻转二叉树—leetcode226
  4. 等待CreateProcess进程退出
  5. [NOTE] sqli-labs Basic Challenges
  6. 加油站(暴力+贪心)
  7. conda 分享自己的实验环境
  8. 德州扑克里的专业术语你知道几个?
  9. Mysql查询数据库状态及信息
  10. Leetcode-88:合并两个有序数组