EasyText, EasyLicense 的作者, https://github.com/EasyHelper Good Good Study,Day Day Up.

 

博客园博客下载工具,可以主动搜索某人的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 i = 2005; i < 2011; i++)
 {
   
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进行遍历。

 

代码
           foreach (string rurl in httpCategoryUrls)
            {
                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格式的文档。代码如下:

 

 

代码
 foreach (string str in httpArticleUrls)
            {
                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

posted @ 2010-03-31 21:29  LoveJenny  阅读(5076)  评论(24编辑  收藏  举报
EasyText, EasyLicense 的作者, https://github.com/EasyHelper Good Good Study,Day Day Up.