• 博客园博客下载工具,可以主动搜索某人的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

  • 相关阅读:
    zabbix
    amoeba 读写分离
    部署MySQL-主从异步复制
    MySQL 基本操作
    mysql 完整备份和恢复
    正则匹配表达式各个符文表达的意义
    Include和require的区别
    nosql和Mysql的区别
    Git与SVN的区别
    mongodb与mysql区别
  • 原文地址:https://www.cnblogs.com/LoveJenny/p/1701740.html
Copyright © 2020-2023  润新知