随着CSDN访问量的不断增多,给自己的写,转,翻的动力也增加了很多。那么数字对我来说就很重要,那么怎么样去监测每天的CSDN的访问量这是我目前需要考虑的问题。突然想到之前通过网页抓取表标签的例子,刚好可以拉过来修改一下直接使用。
Step1:在CSDN中每个用户都有自己的主页的地址(http://blog.csdn.net/younghaiqing),通过主页地址可以直接访问看到左侧导航的用户访问量。将页面通过HttpWebResponse请求将数据存放在StreamReader中。
string url = "http://blog.csdn.net/younghaiqing";
//创建http链接
var request = (HttpWebRequest)WebRequest.Create(url);
//request.Timeout = 1000 * 10; //5s过期
var response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string content = sr.ReadToEnd();
HashSet<string> syncsInfo = new HashSet<string>();
syncsInfo.Add(list);
SendSyscsMail(syncsInfo);
Step2:放入StreamReader中的数据时HTML文件不能直接使用,数据也不是我需要的,那么通过查看元素得知。
<ul id="blog_rank">
<li>访问:<span>7340次</span></li>
<li>积分:<span>1029</span> </li>
.......
<li>排名:<span>千里之外</span></li>
</ul>
step3:是唯一的,那么我可以使用正则表达式,先将< ul id=”blog_rank”>元素给取出来,在经过一次正则表达式将里面的标签全部替换掉。
/// <summary>
/// 第一次正则
/// </summary>
/// <param name="sHtmlText">HTML代码</param>
/// <returns></returns>
public static List<string> GetHtmlTextList(string sHtmlText)
{
// 定义正则表达式用来匹配 text 标签
Regex regText = new Regex(@"<ul\s+id\=\""blog_rank\"">([\S\s]*?)</ul>", RegexOptions.IgnoreCase);
// 搜索匹配的字符串
MatchCollection matches = regText.Matches(sHtmlText);
List<string> sUrlList = new List<string>();
// 取得匹配项列表
foreach (Match match in matches)
{
sUrlList.Add(replceHtml(match.Value));
}
return sUrlList;
}
/// <summary>
/// 第二次正则:将取出来的含有html的标签替换掉,只留下里面的值
/// </summary>
/// <param name="strHtml"></param>
/// <returns></returns>
public static string replceHtml(string strHtml)
{
Regex objRegExp = new Regex("<(.|\n)+?>");
return objRegExp.Replace(strHtml, "");
}
数据取好以后,那么我的数据保存在哪里?这是一很大的问题,还好公司有发邮件的功能,那么就让他每天定时给我发邮件。
/// <summary>
/// 发送邮件服务
/// </summary>
/// <param name="syncsFail"></param>
private static bool SendSyscsMail(HashSet<string> syncsFail)
{
bool flag = false;
if (syncsFail != null && syncsFail.Count > 0)
{
//遍历同步失败的数据,给IT管理人员发邮件通知
StringBuilder sb = new StringBuilder()
.Append("<body style=\"margin: 10px; font-size: 12pt;\">")
.Append(" <div>您好:</div>")
.Append(" <div style=\"text-indent: 2em;\"YoungCSDN用户量访问同步</div>")
.Append(" <div style=\"margin-left: 2em;\">");
foreach (string temp in syncsFail)
{
sb.AppendFormat("{0} <br/>", temp);
}
sb.Append(" </div>");
try
{
//发送提醒邮件
EMail email = new EMail(
"mossadmin@hitechsemi.com", //系统发送的
ConfigurationManager.AppSettings["MonitorPerson"], //提醒邮件接收者
null, //抄送人收件箱地址
"CSDN用户量访问同步", //邮件标题
sb.ToString(), //邮件正文
null); //附件
email.Send();
flag = true;
}
catch (Exception)
{
flag = false;
}
}
return flag;
}
EMail为一个邮件的新类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.IO;
using System.Net.Mime;
using System.Configuration;
namespace ConsoleApplication1
{
public class EMail
{
private MailMessage mMailMessage; //主要处理发送邮件的内容(如:收发人地址、标题、主体、图片等等)
private SmtpClient mSmtpClient; //主要处理用smtp方式发送此邮件的配置信息(如:邮件服务器、发送端口号、验证方式等等)
private int mSenderPort = 25; //发送邮件所用的端口号(htmp协议默认为25)
private string mSenderServerHost = ConfigurationManager.AppSettings["eMailServer"]; //发件箱的邮件服务器地址(IP形式或字符串形式均可)
private string mSenderUsername = ConfigurationManager.AppSettings["eMailSenderUsername"]; //发件箱的用户名(即@符号前面的字符串,例如:hello@163.com,用户名为:hello)
private string mSenderPassword = ConfigurationManager.AppSettings["eMailSenderPassword"]; //发件箱的密码
private bool mEnableSsl = false; //是否对邮件内容进行socket层加密传输
private bool mEnablePwdAuthentication = true; //是否对发件人邮箱进行密码验证
/// <summary>
/// 构造函数
/// </summary>
/// <param name="fromMail">发件人</param>
/// <param name="toMail">收件人,多个收件人之间用';'分隔</param>
/// <param name="CCMail">抄送人,多个收件人之间用';'分隔</param>
/// <param name="emailSubject">标题</param>
/// <param name="emailBody">正文</param>
/// <param name="emailAnnex">附件相对地址</param>
public EMail(string fromMail, string toMail, string CCMail, string emailSubject, string emailBody, string emailAnnex)
{
try
{
mMailMessage = new MailMessage();
string[] tempTo = toMail.Split(';');
if (tempTo.Length > 0)
{
for (int i = 0; i < tempTo.Length; i++)
{
if (!string.IsNullOrEmpty(tempTo[i]))
{
mMailMessage.To.Add(tempTo[i]);
}
}
}
if (!string.IsNullOrEmpty(CCMail))
{
string[] tempCC = CCMail.Split(';');
if (tempCC.Length > 0)
{
for (int i = 0; i < tempCC.Length; i++)
{
if (!string.IsNullOrEmpty(tempCC[i]))
{
mMailMessage.CC.Add(tempCC[i]);
}
}
}
}
mMailMessage.From = new MailAddress(fromMail);
mMailMessage.Subject = emailSubject;
mMailMessage.Body = emailBody;
mMailMessage.IsBodyHtml = true;
mMailMessage.BodyEncoding = System.Text.Encoding.UTF8;
mMailMessage.Priority = MailPriority.Normal;
if (!string.IsNullOrEmpty(emailAnnex) && File.Exists(emailAnnex))
{
//构造一个附件对象
Attachment attach = new Attachment(emailAnnex);
//得到文件的信息
ContentDisposition disposition = attach.ContentDisposition;
disposition.CreationDate = File.GetCreationTime(emailAnnex);
disposition.ModificationDate = File.GetLastWriteTime(emailAnnex);
disposition.ReadDate = File.GetLastAccessTime(emailAnnex);
//向邮件添加附件
mMailMessage.Attachments.Add(attach);
}
}
catch (Exception e)
{
//Console.WriteLine(e.Message);
throw e;
}
}
/// <summary>
/// 邮件的发送
/// /// </summary>
public void Send()
{
try
{
if (mMailMessage != null)
{
mSmtpClient = new SmtpClient();
mSmtpClient.Host = this.mSenderServerHost;
mSmtpClient.Port = this.mSenderPort;
mSmtpClient.UseDefaultCredentials = false; //不适用默认凭证
mSmtpClient.EnableSsl = this.mEnableSsl;
if (this.mEnablePwdAuthentication)
{
System.Net.NetworkCredential nc = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword); //身份凭证
mSmtpClient.Credentials = nc.GetCredential(mSmtpClient.Host, mSmtpClient.Port, "NTLM");//身份凭证
}
else
{
mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);//身份凭证
}
mSmtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; //发送方式为网络发送
mSmtpClient.Send(mMailMessage); //发送
}
}
catch (Exception e)
{
//Console.WriteLine(e.Message);
throw e;
}
}
}
}
还有一些数据在web.config中配置,如:邮件地址,邮件登录名,密码,收件人
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<!--系统邮件发送设置-->
<add key="eMailServer" value="172.127.13.154"/>
<add key="eMailSenderUsername" value="小明"/>
<add key="eMailSenderPassword" value="123"/>
<!--程序出错人邮箱地址,个人邮箱-->
<add key="MonitorPerson" value="haiqing.yang@xx.com"/>
</appSettings>
</configuration>
运行结果如下: