MSN博客搬家工具

 

1.    说明
最近MSN的博客即将关闭,而使用MSN上推荐的迁移到workpress,又总是不成功。在网上下了几个工具,都是各个blog开发的,只能搬到特定的blog中去。让人十分郁闷。
后来试写了一段代码,先把从MSN博客备份到本地,挑了些技术文档搬到了CSDN,下面是程序的实现和说明,大家举一反三吧。用此方法也可以搬到其它的blog
编译好的程序可以下载,源码可以下载,大家可以直接使用或者修改加以完善。

2.    原理
使用XML-RPC协议,一个XML-RPC消息就是一个请求体为xmlhttp-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回,可以通过此协议,读写blog上的文章,如CSDNWORDPRESS,新浪等都支持,利用它可以方便地开发blog的客户端。

3.    程序说明

1)        MSN网页解析
public class Fetcher {
         private String getPage(String file) {      //
读取日志文件
                   BufferedReader reader = null;
                   StringBuilder sb = new StringBuilder();
                   String line = null;
                   try {
                            reader = new BufferedReader(new InputStreamReader(
                                               new FileInputStream((file)), Charset.forName("utf-8")));
                            while ((line = reader.readLine()) != null) {
                                     sb.append(line);
                            }
                            reader.close();
                   } catch (MalformedURLException e) {
                            System.out.println("file:" + file);
                            System.out.println("error:" + e);
                   } catch (IOException e) {
                            System.out.println("file:" + file);
                            System.out.println("error:" + e);
                   }
                   return sb.toString();
         }

//
解析日志文件:标题,日期,正文
         public void getDoc(String file, String server, String user, String passwd) {
                   String html = getPage(file);
                   String titleDivRegex = "<title>.+?</title>";
                   Pattern titleDivPattern = Pattern.compile(titleDivRegex);
                   Matcher titleDivMatcher = titleDivPattern.matcher(html);
                   String title = null;
                   if (titleDivMatcher.find()) { //
标题
                            title = titleDivMatcher.group().replaceAll("<title>", "")
                                               .replaceAll("</title>", "");
                   }
                   String dateDivRegex = "<h5 id=/".+?/">.+?</h5>";
                   Pattern dateDivPattern = Pattern.compile(dateDivRegex);
                   Matcher dateMatcher = dateDivPattern.matcher(html);
                   String dateStr = null;
                   Date postDate = null;
                   if (dateMatcher.find()) {      //      
日期
                            dateStr = dateMatcher.group().replaceAll("<h5 id=/".+?/">", "")
                                              .replaceAll("</h5>", "").trim();
                            String tmp = dateStr.replace("&#58;", ":");
                            postDate = new Date(tmp);
                   }
                   String textDivRegex = "<div id=/".*/" class=/"blogpost/">.+?</div>";
                   Pattern textDivPattern = Pattern.compile(textDivRegex);
                   Matcher textMatcher = textDivPattern.matcher(html);
                   String text = null;
                   if (textMatcher.find()) {       //
正文
                            text = textMatcher.group().replaceAll(
                                               "<div id=/".*/" class=/"blogpost/">", "").replaceAll(
                                               "</div>", "").trim();
                   }
                   String[] categories = { "android", "linux" };
                   text = "<html><meta http-equiv=/"Content-Type/" content=/"text/html; charset=utf-8/">"
                                     + text + "</html>";

                   Post post = new Post(title, text, categories, postDate);
                   post.setServer(server, user, passwd);
                   post.publish();

                   System.out.println("title:" + title);
                   System.out.println("date" + postDate);
         }
}

2)        上转到其它博客
public class Post {
         private Date dateCreated;
         private String description;
         private String title;
         private String[] categories;
         private String mServer;
         private String mUser;
         private String mPasswd;
         static private XmlRpcClientConfigImpl config;
         static private XmlRpcClient client;

         public Post(String title, String description, String[] categories,
                            Date dateCreated) {
                   this.dateCreated = dateCreated;
                   this.description = description;
                   this.title = title;
                   this.categories = categories;
         }

         static {
                   config = new XmlRpcClientConfigImpl();
                   client = new XmlRpcClient();
         }

         private void writelog(String log) {
                   UI.getInstance().showLog(log);
         }

         public void setServer(String server, String user, String passwd) {
                   mServer = server;
                   mUser = user;
                   mPasswd = passwd;
                   try {
                            config.setServerURL(new URL(mServer));
                            client.setConfig(config);
                   } catch (MalformedURLException e) {
                            System.out.println("connect error");
                   }
         }

         public void publish() {
                   Map<String, Object> struct = new HashMap<String, Object>();
                   struct.put("dateCreated", dateCreated);
                   struct.put("description", description);
                   struct.put("title", title);
                   struct.put("categories", categories);
                   Object[] params = new Object[] { mUser, mUser, mPasswd, struct, true };
                   String blogid = null;
                   try {           //
发布日志
                            blogid = (String) client.execute("metaWeblog.newPost", params);
                            writelog("OK:  title=" + title + " id=" + blogid + "/n");
                   } catch (XmlRpcException e) {
                            writelog("ERR: title=" + title + "/n");
                   }
                   struct.clear();
         }
}

4.    使用方法

1)        下载代码

a)         从此处下载
http://download.csdn.net/source/2773467
(注意:本程序只测试过迁移到CSDN,迁移到其它Blog可能需要修改代码)

b)        将下载的软件包解压缩

2)        运行程序

a)         msn blog日期格式以便于程序识别

                                      i.              打开msn blog,并登录

                                    ii.              选项->常规
将日期设置为yyyy/mm/dd格式
将时间设置为hh:mm:ss格式

b)        msn blog日志保存到本地

                                      i.              msn博客登录后,在迁移页面点击将日志下载到PC”

                                    ii.              解包,依据index把需要迁移的日志放入目录X

c)         上传到其它blog

                                      i.              在其它blog注册用户

                                    ii.              cd blogmover

                                  iii.              java -jar blogmover.jar
点击Choose选择迁移日志所存在的目录
X
Server,UserID, Passwd中填写新blog的信息,然后点击Send

3)        编译源码

a)         eclipse打开

b)        File->New->JavaProject->Create project from existing source打开源码

c)         项目名->右键->Build Path->Configure Build Path…->Add Extennal JARs加入软件包一级目录的三个库(wsxxx, xmlxxx, xmlxxx)

d)        编译运行即可

5.    参考

1)        从百度空间到CSDN——博客搬家源码
http://blog.csdn.net/telnetor/archive/2010/05/04/5556539.aspx

2)        各个blogxml-rpc支持(MetaWeblog API)
http://www.discuz.net/thread-946562-1-1.html

 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值