博客园博客下载工具,可以主动搜索某人的blog,并以MHTML格式保存到本地文件夹脱机浏览。
1:输入某人的BLOG,例如http://www.cnblogs.com/JeffreyZhao/。
2:任意打开一篇博客文章,例如:http://www.cnblogs.com/JeffreyZhao/archive/2010/03/21/async-and-parallel-design-patterns-in-fsharp-3-more-agents.html
3:我们看到了博客文章的url格式大致是,http://www.cnblogs.com/JeffreyZhao/+%22archive"+年+月+日+文章标题+".html"
4:OK,我们输入http://www.cnblogs.com/JeffreyZhao/archive/2010/03.html。发现显示的是随笔档案 - 2010年3月。这就意味着我们可以通过更改年月来得到相应的年月的随笔档案。
5:我们从2005年01月一直搜索到2010年12月.构造我们需要搜索的地址列表。储存到httpCategoryUrls这样的List<string>.
{
for (int j = 1; j < 13; j++)
{
httpCategoryUrls.Add(textBox1.Text.ToString() + "archive/" + i + "/" +
(j < 10 ? ("0" + j).ToString() : j.ToString()) +".html");
}
}
6:逐个解析我们的httpCategoryUrls里面的url,采用foreach进行遍历。
{
url myurl;
Http myhttp = new Http();
Spider myspider = new Spider();
try
{
myurl = new url(rurl);
Uri burl = new Uri(rurl);
myspider.ProsessPage(myhttp.GetPage(burl));
}
catch
{ return false; }
while (myspider.outurl.Count > 0)
{
string urlValue = myspider.outurl.Dequeue().ToString();
if (!httpArticleUrls.Contains(urlValue) && urlValue.Contains("archive")
&& urlValue.EndsWith(".html")
&& Path.GetFileName(urlValue).Length > 9
)
{
httpArticleUrls.Add(urlValue);
}
}
}
其中随便找了个网上的spider组件,可以解析html得到html中的所有链接信息。
因为我们知道文章的url中包含"archive",并且url以.html结尾,
为了防止http://www.cnblogs.com/JeffreyZhao/archive/2010/03.html,这样的连接,我做了Length检查。
通过上述基本的几个步骤大致可以得到某人某年某月的随笔档案。全部保存到httpArticleUrls的List<string>中。
7:已经得到了某人的从2005年到2010年之间的所有文章了,剩下的就是发送Http请求去获取数据,然后本地保存了。
保存采用的是CDOMessage这样的类,该类可以生成MHTML格式的文档。代码如下:
{
CDO.Message message = new CDO.MessageClass();
message.MimeFormatted = true;
message.CreateMHTMLBody(str, CDO.CdoMHTMLFlags.cdoSuppressNone, "", "");
ADODB.Stream stream = message.GetStream();
int startIndex = message.HTMLBody.IndexOf("<title>", StringComparison.CurrentCultureIgnoreCase);
int endIndex = message.HTMLBody.IndexOf("</title>", StringComparison.CurrentCultureIgnoreCase);
string fileName =FilePath+ "\\1.mht";
try
{
Char[] chars = Path.GetInvalidFileNameChars();
string name = message.HTMLBody.Substring(startIndex + 7, endIndex - startIndex - 7);
foreach (char c in chars)
{
name = name.Replace(c.ToString(), string.Empty);
}
fileName = FilePath+"\\" +
name
+ ".mht";
}
catch
{ }
stream.SaveToFile(fileName, ADODB.SaveOptionsEnum.adSaveCreateOverWrite);
stream.Close();
}
文章的以文章的标题为名字进行保存。如果文章的名称中包含非法的字符,进行替换。
CDO.CdoMHTMLFlags.cdoSuppressNone:代表不进行压缩。这样图片可以嵌入其中。
8:大致功能已经实现,但是代码还有很多地方可以优化的,名称命名等都可以进行修改下,速度,效率啊目前都还没考虑,没有自动下载附件的功能,需要的话其实也挺简单的,得到所有文章中的压缩文件,通过WebClient.DownLoadFile方法下载等。
9:附件下载:BlogDownLoader.rar