博客备份小工具3

【转】博客备份小工具3

接着 博客转发小工具2 ,又弄了一个第三版。主要功能有:博客备份到本地、浏览备份到本地的博客、关键字搜索本地的博客和转发博客可以选择个人分类 填写Tag标签。其实想了想,转发博客干嘛非要在本地客户端转发,直接在博客园的页面用js不就可以达到目的么。想是这么想,还没尝试。等我写完了这个博客就去试试。。继续回到这个小工具,说实在的本人做的这个小工具界面丑的那是、、反正就是很丑很丑啦。没办法,没有美工的那种艺术细胞。还有就是,整个功能其实真没什么技术含量,还是html的抓取,winfrom在工作中也没用过,就平时偶尔玩玩,望大神们勿喷~~。

不过我觉得这个小工具的作用:第一、可以用来备注自己的博客,自己留个底。第二、某些朋友的工作环境可能没有外网(我以前的公司就没有),这样的话可以用来备份一些博友的系类文章当资料。【要是可以的话,把系类文章导成dpf文档那就更爽了。可是我一直没成功~】。

也许有写人会说:啥啥啥的早就有类似的软件了。我不知道,我没用过,我觉得自己做的用着开心。就当练手吧。

开始说内容了。

功能一:备份博客到本地

备份的博客是博客园推荐的前150个。也可以自己手动输入要备份的url。

1.加载推荐博客

var docment = new HtmlAgilityPack.HtmlDocument();
docment.LoadHtml(BlogCommon.PostReqest(BlogUrlString.推荐博客url));
var nodes = docment.DocumentNode.SelectNodes("//ul//a");
List<object> list = new List<object>();
for (int i = 0; i < nodes.Count; i++)
{
    var url = "http://www.cnblogs.com" + nodes[i].Attributes["href"].Value;
    var name = "NO." + (i + 1).ToString() + " " + nodes[i].InnerText;
    list.Add(new { url = url, name = name });
}
list_tuijian.DataSource = list;
list_tuijian.ValueMember = "url";
list_tuijian.DisplayMember = "name";

2.加载随笔分类、档案和标签

首先选中博客改变url,然后url文本框的TextChanged事件里面加载 随笔分类、档案和标签数据。

var docment = new HtmlAgilityPack.HtmlDocument();
docment.LoadHtml(BlogCommon.GetRequest(BlogUrlString.个人博客分类url(strname)));
//加载随笔类型
LoadTree(docment, "//div[@class=‘catListPostCategory‘]//a", tree_suibiType, "随笔分类");
tree_suibiType.CheckBoxes = true;

// 加载随笔档案
LoadTree(docment, "//div[@class=‘catListPostArchive‘]//a", tree_suibiTime, "随笔档案");
tree_suibiTime.CheckBoxes = true;

//// 加载文章类型
//LoadTree(docment, "//div[@class=‘catListArticleCategory‘]//a", tree_wenzhangType, "文章类型");
//tree_suibiType.CheckBoxes = true;

docment.LoadHtml(BlogCommon.GetRequest(BlogUrlString.标签url(strname)));
// 加载文章类型
LoadTree(docment, "//div[@id=‘taglist‘]//a", tree_tag, "标签");
tree_tag.CheckBoxes = true;
public void LoadTree(HtmlAgilityPack.HtmlDocument docment, string where, TreeView trre, string TreeName)
{
    try
    {
        trre.Nodes.Clear();
        var nodes = docment.DocumentNode.SelectNodes(where);
        if (nodes == null || nodes.Count <= 0)
            return;
        List<object> list = new List<object>();

        TreeNode treenodeS = new TreeNode() { Name = "", Text = TreeName };
        for (int i = 0; i < nodes.Count; i++)
        {
            TreeNode treenode = new TreeNode();
            var url = nodes[i].Attributes["href"].Value;
            var name = nodes[i].InnerText;
            list.Add(new { url = url, name = name });
            treenode.Text = name;
            treenode.Name = url;
            treenodeS.Nodes.Add(treenode);
        }
        trre.Nodes.Add(treenodeS);
        trre.ExpandAll();//展开节点
    }
    catch (Exception ex)
    {
        MessageBox.Show("加载" + TreeName + "错误" + ex.Message);
    }
}

3.点击备份

点击备份,读取选中的复选框所包含的所有url。

#region 获取某个选中树节点 的所有url地址

        public List<string[]> getShuibiType_all_url(string url, ref List<string[]> list_urlS)
        {
            label1.Text = "正在读取" + url;
            var docment = new HtmlAgilityPack.HtmlDocument();
            docment.LoadHtml(BlogCommon.GetRequest(url));
            // a class entrylistItemTitle  entrylistTitle
            var nodes = docment.DocumentNode.SelectNodes("//div[@class=‘entrylist‘]//div[@class=‘entrylistPosttitle‘]//a");
            if (nodes == null)
                nodes = docment.DocumentNode.SelectNodes("//div[@id=‘content‘]//div[@class=‘post post-list-item‘]/h2/a");
            var entrylistTitle = docment.DocumentNode.SelectNodes("//h1[@class=‘entrylistTitle‘]");
            if (entrylistTitle == null)
                entrylistTitle = docment.DocumentNode.SelectNodes("//div[@id=‘content‘]/h2");
            var posts_title = entrylistTitle != null ? entrylistTitle[0].InnerText : "未分类";
            if (nodes != null && nodes.Count > 0)
            {
                for (int j = 0; j < nodes.Count; j++)
                {
                    label1.Text = "正在读取[" + posts_title + "]" + (j + 1) + "/" + nodes.Count + "页" + "url地址";

                    list_urlS.Add(
                        new string[]
                        {
                            nodes[j].Attributes["href"].Value,
                            nodes[j].InnerText,
                            entrylistTitle.Count>=1?entrylistTitle[0].InnerText:"未分类"
                        });
                }
            }
            return list_urlS;
        }

        #endregion

点击备份,保存到本地。

#region 保存内容到文件
        /// <summary>
        /// 保存内容到文件
        /// </summary>
        /// <param name="list_str">根据地址集合</param>
        /// <param name="type"></param>
        /// <param name="docment"></param>
        public void SaveFile(List<string[]> list_str, string type, HtmlAgilityPack.HtmlDocument docment)
        {
            if (list_str == null || list_str.Count <= 0)
                return;
            for (int i = 0; i < list_str.Count; i++)
            {
                var url = list_str[i][0];
                var name = url.Split(‘/‘).Length >= 4 ? url.Split(‘/‘)[3] : "未分类";
                if (list_str[i].Length == 3)
                {
                    try
                    {
                        label1.Text = "正在请求[" + name + "/" + type + "]页面" + (i + 1) + "/" + list_str.Count + "。";

                        #region 文件路径处理
                        //过滤文件名的特殊字符
                        string[] rep = new string[] { "&mdash;", ":", "<", ">", "?", "*", "/", "|", "\"" };
                        string fileNmae = list_str[i][1].Replace("\\", string.Empty);
                        for (int j = 0; j < rep.Length; j++)
                        {
                            if (rep[j].Length == 0)
                                continue;
                            fileNmae = fileNmae.Replace(rep[j], string.Empty);
                        }
                        var Paht = ForwardPath + name + "\\" + type + "\\" + list_str[i][2] + "\\";
                        for (int j = 0; j < rep.Length; j++)
                        {
                            if (rep[j].Length == 0)
                                continue;
                            Paht = Paht.Replace(rep[j], string.Empty);
                        }
                        Paht = FileHelp.PathBlogs + Paht;
                        var FilePath = Paht + fileNmae + ".html";
                        #endregion

                        if (radioButton2.Checked && File.Exists(FilePath))
                        {
                            label1.Text = "页面数据存在[" + name + "/" + type + "]页面" + (i + 1) + "/" + list_str.Count + "。";
                            continue;
                        } 

                        var html = BlogCommon.GetRequest(url);
                        docment.LoadHtml(html);
                        var Nodes = docment.DocumentNode.SelectNodes("//div[@class=‘postBody‘]");
                        if (Nodes == null)
                            Nodes = docment.DocumentNode.SelectNodes("//div[@id=‘cnblogs_post_body‘]");
                        html = Nodes[0].InnerHtml;
                        docment.DocumentNode.InnerHtml = "<div id=‘my_html_postBody‘>" + html + "</div>";

                        #region 去掉a标签的超链接
                        //去掉a标签的超链接
                        var html_aS = docment.DocumentNode.SelectNodes("//a");
                        if (html_aS != null)
                            for (int z = 0; z < html_aS.Count; z++)
                                if (html_aS[z].Attributes["href"] != null && html_aS[z].Attributes["href"].Value[0] != ‘#‘)
                                    html_aS[z].Attributes["href"].Value = "javascript:void()";
                        #endregion 

                        label1.Text = "准备保存[" + name + "/" + type + "]内容" + (i + 1) + "/" + list_str.Count + "~";
                        FileHelp.CreatePath(Paht + @"imgs\");
                        saveImg(docment, Paht + @"imgs\", label1.Text + "...");
                        docment.CreateAttribute("url", url);

                        //profile_block
                        docment.DocumentNode.InnerHtml = "<div id=‘mytext_url‘>" + url + "</div>"
                                                        + "<div id=‘mytext_BlogTitleName‘>" + name + "</div>"
                                                        + docment.DocumentNode.InnerHtml;

                        docment.Save(FilePath, Encoding.UTF8);
                        File.SetCreationTime(FilePath, new DateTime(FileHelp.Ticks));
                        LuceneHelp.CreateIndexFilePath(FilePath);
                        //FileHelps.SaveFile(Paht, fileNmae + ".txt", html);
                        label1.Text = "保存成功" + (i + 1) + "/" + list_str.Count + "。";
                    }
                    catch (Exception ex)
                    {
                        string mess = url + "\r\n" + ex.Message + "\r\n" + ex.StackTrace + "\r\n\r\n";
                        string myPath = FileHelp.PathBlogs + ForwardPath + name + "\\" + type + "\\";
                        FileHelp.SaveFile(myPath, "err.txt", mess, false);
                    }
                }
                else
                    FileHelp.SaveFile(FileHelp.PathBlogs + ForwardPath + name + "\\" + type + "\\", "err.txt", "异常373位置", false);
            }
        }
        #endregion

功能二:浏览本地博客

1.递归加载目录下所以博客文件

(这个方法不行,如果文件多的话,会有点卡。以后要改成点击加载下层目录)

public TreeNodeCollection loadTree(string path, TreeNodeCollection treeS, bool isNe = true)
{
    List<string[]> list = FileHelp.FileSystemInfo(path, "3");
    string[] str = new string[] { "", "" };
    if (list != null)
    {

        for (int i = 0, j = 0; i < list.Count; i++, j++)
        {
            if (list[i][0] == "imgs")
            {
                j--;
                continue;
            }
            TreeNode tree1 = new TreeNode() { Text = list[i][0] };
            treeS.Add(tree1);
            loadTree(list[i][1], treeS[j].Nodes);
        }
    }
    return treeS;
}

2.点击加载博客内容(这里使用到了webBrowser控件来显示博客内容)

 #region 点击tree树  加载对应内容
        /// <summary>
        /// 点击tree树  加载对应内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
            {
                htmlPath = FileHelp.PathBlogs + Forward.ForwardPath + e.Node.FullPath;
                string html = FileHelp.GetFile(htmlPath);
                HtmlAgilityPack.HtmlDocument docment = new HtmlAgilityPack.HtmlDocument();
                docment.LoadHtml(html);
                try
                {
                    var text_html = docment.DocumentNode.SelectNodes("//div[@id=‘my_html_postBody‘]")[0].InnerHtml;
                    var mytext_url = docment.DocumentNode.SelectNodes("//div[@id=‘mytext_url‘]")[0].InnerHtml;
                    webBrowser1.DocumentText = text_html;
                    text_url.Text = mytext_url;
                }
                catch (Exception)
                { }
            }
        }
        #endregion

功能三:本地浏览关键字搜索

搜索使用的Lucenne.net。这里面的水太深了。这里就使用到了点皮毛。这里给出一些资料地址

1.首先在备份的时候就需要创建搜索索引。

/// <summary>
/// 创建索引
/// </summary>
/// <param name="analyzer"></param>
/// <param name="title"></param>
/// <param name="content"></param>
private static void AddIndex(IndexWriter writer, string title, string content, string filePath, string id, string mytext_BlogTitleName = "Blog", string ClickQuantity = "0")
{
    try
    {
        // Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));

        Document doc = new Document();
        doc.Add(new Field("Title", title, Field.Store.YES, Field.Index.ANALYZED));//存储且索引
        //doc.Add(new Field("Content", content, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));// Field.Store.YES, Field.Index.ANALYZED));//存储且索引
        doc.Add(new Field("Content", content, Field.Store.YES, Field.Index.ANALYZED));
        doc.Add(new Field("filePath", filePath, Field.Store.YES, Field.Index.NOT_ANALYZED));//存储且索引
        doc.Add(new Field("BlogTitleName", mytext_BlogTitleName, Field.Store.YES, Field.Index.NOT_ANALYZED));
        doc.Add(new Field("id", id, Field.Store.YES, Field.Index.NOT_ANALYZED));
        doc.Add(new Field("ClickQuantity", ClickQuantity, Field.Store.YES, Field.Index.NOT_ANALYZED));
        //防止重复索引
        writer.DeleteDocuments(new Term("id", id));
        //AddTime
        writer.AddDocument(doc);
    }
    catch (FileNotFoundException fnfe)
    {
        throw fnfe;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

2.点击搜索

#region 点击搜索
        private void but_select_Click(object sender, EventArgs e)
        {
            new Thread(delegate()
            {
                try
                {
                    lab_meg.Text = "正在搜索.....";
                    var htm = "";
                    var list = LuceneHelp.SelectData(FileHelp.PathBlogs + "Index\\", txt_select.Text.Trim(), this.lab_meg);
                    var count = 150;
                    if (list.Count >= count)
                    {
                        var mess = MessageBox.Show("搜索结果过多,是否只显示前" + count + "条~", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                        if (mess == System.Windows.Forms.DialogResult.Yes)
                        {
                            int index = 0;
                            foreach (var item in list)
                            {
                                index++;
                                htm += "<a name=‘click_load_file‘ href=‘#‘ filePath=‘" + item.FilePath + "‘>" +
                                         item.FileName + "</a><br/><div>" + item.Content
                                         + "<div><br/><div style=‘width:100%;text-align:right;‘><span style=‘margin-right:20px;background-color:#e1d2d2‘>作者["
                                         + item.BlogTitleName + "]&nbsp;&nbsp;搜索(" + item.ClickQuantity + ")</span></div><br/><br/>";
                                if (index >= count)
                                    break;
                            }
                        }
                        else
                            foreach (var item in list)
                            {
                                htm += "<a name=‘click_load_file‘ href=‘#‘ filePath=‘" + item.FilePath + "‘>" +
                                         item.FileName + "</a><br/><div>" + item.Content
                                         + "<div><br/><div style=‘width:100%;text-align:right;‘><span style=‘margin-right:20px;background-color:#e1d2d2‘>作者["
                                         + item.BlogTitleName + "]&nbsp;&nbsp;搜索(" + item.ClickQuantity + ")</span></div><br/><br/>";
                            }

                    }
                    else
                    {
                        foreach (var item in list)
                        {
                            htm += "<a name=‘click_load_file‘ href=‘#‘ filePath=‘" + item.FilePath + "‘>" +
                                     item.FileName + "</a><br/><div>" + item.Content
                                     + "<div><br/><div style=‘width:100%;text-align:right;‘><span style=‘margin-right:20px;background-color:#e1d2d2‘>作者["
                                     + item.BlogTitleName + "]&nbsp;&nbsp;搜索(" + item.ClickQuantity + ")</span></div><br/><br/>";
                        }
                    }
                    webBrowser1.DocumentText = htm;
                    htmlList = htm;
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(ex.Message);
                    lab_meg.Text = "搜索出错~" + ex.Message;
                }
            }).Start();
        }
        #endregion

下载地址:

环境:vs2013 版本:.Net Framework4.5 数据库:无

程序下载 源码下载  (源码都给您了,顺手点个赞呗~~)

原文地址:https://www.cnblogs.com/orangehero/p/10354221.html

时间: 2024-10-04 03:03:36

博客备份小工具3的相关文章

博客转发小工具1

[转]博客转发小工具1 有些朋友在转发别人博客的时候会问,博客怎么转发的啊?让我一段一段的复制吗?那图片怎么办?隐藏代码要一个一个的打开了复制? 对,很麻烦.费时费力.有的同学会说收藏不就可以了吗?收藏只是收藏了别人的地址,并没有收藏人家的全部内容.如果人家删除原文章,那就等于白收藏了. 我不知道 博客园有没有一键转发的功能,反正我是没找到的.于是,闲来无事,做了个博客转发小工具. 其实很简单,分三步. 一:取得页面内容 取页面内容需要用到HtmlAgilityPack.dll 详细用法可以百度

博客转发小工具2

[转]博客转发小工具2 昨天发了一个博客转发小工具有朋友说"能一键转发到各主流媒体站上就更好了".一开始我以为会能难,需要登录啊还有cookie的管理啊模拟post请求啊,乱七八糟一大堆.心想算啦,太累人,还不一定搞得定.后来心里总想着有没有什么简单的办法,就在网上查资料.最后皇天不负有心人让我找到了HttpClient. ok,接着昨天的来.昨天的只能获取别人文章的内容复制到粘贴板.今天让它能一键发布. 首先需要解决的问题就是登录问题,不然可能是不能发布的. 登录博客园的代码 1 /

【转】博客转发小工具1

[转]博客转发小工具1 有些朋友在转发别人博客的时候会问,博客怎么转发的啊?让我一段一段的复制吗?那图片怎么办?隐藏代码要一个一个的打开了复制? 对,很麻烦.费时费力.有的同学会说收藏不就可以了吗?收藏只是收藏了别人的地址,并没有收藏人家的全部内容.如果人家删除原文章,那就等于白收藏了. 我不知道 博客园有没有一键转发的功能,反正我是没找到的.于是,闲来无事,做了个博客转发小工具. 其实很简单,分三步. 一:取得页面内容 取页面内容需要用到HtmlAgilityPack.dll 详细用法可以百度

利用MetaWeblog API 自制博客发布小工具

博客园提供了诸多数据接口, 利用这些接口可以很容易的实现博客的发布,修改,删除等 1.需要引用一个DLL:为CookComputing.XmlRpcV2 2.新建一个类,在其中是一些要实现的东西,如: 3.调用这些接口发布一篇简单的博客,其中的URL应该是你的博客设置里的 在下方的账号与密码处填上你的账号与密码 4.查看结果

cnblogs博客下载-cnblogs博客导出-cnblogs博客备份工具-基于python

http://blog.csdn.net/infoworld/article/details/19547723 以下代码是基于infoworld的csdn备份python代码修改的cnblogs博客备份,但是和infoworld的界面不匹配,只能够用在python里面.python确实有意思,开发很快,怪不得这么流行. #! encoding=utf-8 #cnblogs博客备份,使用方法:修改最下面的url和output,然后执行就可以了. import urllib2 import re i

C#控制台基础 在博客备份xml文件中提取所有博文的标题 (正则,流读取)

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ introduction: 解析 博客园-博客备份 生成的XML文件,获得所有博文的标题. code: 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System

豆约翰博客备份专家基本使用方法---新手必读

本文介绍一下豆约翰博客备份专家,批量下载博客的方法,以新浪博客为例: http://blog.sina.com.cn/s/articlelist_1315458633_0_1.html 博主的昵称是[Lois传说] 这个博客有很多关于香港tvb演员及剧集的介绍,博文图文并茂,博客中养眼的帅哥美女众多,就以其为例演示豆约翰博客备份专家软件的强大功能. 首先,打开博客备份专家软件.主界面如下: 点击最上面一排按钮中的[新增博客下载]按钮,弹出如下界面: 首先博客站点选择我们要下载博客的站点,目前博客

豆约翰博客备份专家新增微信公众号文章批量下载功能

目前微信火得一塌糊涂,豆约翰博客备份专家也来凑凑热闹. 自媒体的兴起,使得一些各个领域的专家在微信中开通了公众号,我们大家可以选择自己感兴趣的进行订阅. 微信公众号会定期的向订阅者推送一些高质量的文章(当然也包括一些广告). 下面我们就来看一下如何利用豆约翰博客备份专家来批量下载微信公众号文章. 要批量下载微信公众号文章,首先我们必须要知道公众号ID. 首先打开搜狗微信搜索:http://weixin.sogou.com/ 在搜索框中录入微信公众号名称,比如豆约翰关注的一个公众号[哥伦布没来过]

要批量下载的博客文章太多,又不想全部下载怎么办---豆约翰博客备份专家新增选择导出博客功能

有的时候,我们要下载的博主比较高产,发表了数以千计的博文,要批量下载的博客文章太多,又不想全部下载怎么办? 针对这种需求,新版本的博客备份专家开发了博客的部分导出功能. 与以往只能导出全部博文不同,新版博客备份专家,让用户可以通过先按分类或标题进行筛选,然后勾选想导出的部分博客进行导出. 首先,我们可以对已经下载下来的博文按文章标题或文章分类进行筛选,比如这里我们按分类筛选:如下图所示: 以上,我们在分类筛选框中录入了[IT人生涯],可以看到文章列表自动显示出来属于该分类的文章,不属于该分类的文