1. 程式人生 > >從csdn搬家到wordpress 轉自:http://youthmemo.com/?p=2082

從csdn搬家到wordpress 轉自:http://youthmemo.com/?p=2082

本程式可以完成的工作:轉移csdn上面的文章(限於文字內容)到wordpress;不能完成的工作:1、不支援在wordpress上建立分類,所以需要提前在wordpress上手工建立分類(保持與csdn一致);2、不能以很好的格式轉移文章,轉移之後文章格式需要調整。

程式由採集、解析、發帖三部分構成。採集負責將指定url的內容下載下來,解析負責從網頁內容中解析出正文連結、標題、釋出時間、分類資訊,發帖部分負責將解析出來的資料通過rpc傳送給wordpress,生成博文。

本程式用到的jar包及其版本如下:

-rw-r--r-- 1 mingyuan mingyuan  46725 2011-09-03 23:05 commons-codec-1.3.jar
-rw-r--r-- 1 mingyuan mingyuan 279781 2011-09-03 23:05 commons-httpclient-3.0.1.jar
-rwxrwxrwx 1 mingyuan mingyuan  52915 2010-05-03 03:39 commons-logging-1.1.jar
-rw-r--r-- 1 mingyuan mingyuan 281579 2011-09-04 01:40 jsoup-1.6.1.jar
-rwxrwxrwx 1 mingyuan mingyuan  34407 2010-05-03 03:39 ws-commons-util-1.0.2.jar
-rwxrwxrwx 1 mingyuan mingyuan  58573 2010-05-03 03:39 xmlrpc-client-3.1.3.jar
-rwxrwxrwx 1 mingyuan mingyuan 109131 2010-05-03 03:39 xmlrpc-common-3.1.3.jar
-rwxrwxrwx 1 mingyuan mingyuan  81555 2010-05-03 03:39 xmlrpc-server-3.1.3.jar

程式碼很簡單,就不解釋了,大夥看看即可明白。程式的入口函式是Mover.main

下面先給出主要的類Mover.java

  1. package cn.mingyuan.csdn2wordpress;
  2. import java.io.IOException;
  3. import java.net.MalformedURLException;
  4. import java.net.URL;
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. import
     java.util.HashMap;
  9. import java.util.LinkedList;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.concurrent.TimeUnit;
  13. import org.apache.xmlrpc.XmlRpcException;
  14. import org.apache.xmlrpc.client.XmlRpcClient;
  15. import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
  16. import org.jsoup
    .Jsoup;
  17. import org.jsoup.nodes.Document;
  18. import org.jsoup.nodes.Element;
  19. import org.jsoup.select.Elements;
  20. /**
  21.  * 採集、解析、轉移
  22.  * 
  23.  * @author mingyuan
  24.  * 
  25.  */
  26. publicclassMover{
  27. privateint totalPages;
  28. privateXmlRpcClientConfigImpl config;
  29. privateXmlRpcClient client;
  30. privateString baseUrl;
  31. privateObject userName;
  32. privateObject password;
  33. privateString csdnUserName;
  34. publicMover(int totalPages,String blogRpcUrl,String csdnUrl,String csdnUserName,String userName,
  35. String password){
  36. this.totalPages = totalPages;
  37. this.baseUrl = csdnUrl;
  38. this.csdnUserName = csdnUserName;
  39. this.userName = userName;
  40. this.password = password;
  41.         config =newXmlRpcClientConfigImpl();
  42. try{
  43.             config.setServerURL(new URL(blogRpcUrl));
  44. }catch(MalformedURLException e){
  45. System.out.println(“請檢查url”);
  46. }
  47.         client =newXmlRpcClient();
  48.         client.setConfig(config);
  49. }
  50. privateList<String> getlinks(){
  51. List<String> list =newLinkedList<String>();
  52. for(int i =1; i <= totalPages; i++){
  53. System.out.println(“processing page ”+ i);
  54. Downloader downloader =newDownloader();
  55. String content = downloader.download(baseUrl +“/”+ csdnUserName +“/article/list/”+ i);
  56. if(content ==null)
  57. continue;
  58. Document doc =Jsoup.parse(content);
  59. Elements first = doc.select(“.link_title”);
  60. for(int j =0; j < first.size(); j++){
  61. Element first2 = first.get(j).select(“a”).first();
  62. String link = baseUrl + first2.attr(“href”);
  63.                 list.add(link);
  64. System.out.println(“get link\t”+ link);
  65. }
  66. System.out.println(“page ”+ i +“ extractor done,sleep 2s”);
  67. try{
  68. TimeUnit.SECONDS.sleep(1);
  69. }catch(InterruptedException e){
  70.                 e.printStackTrace();
  71. }
  72. }
  73. return list;
  74. }
  75. publicList<CSDNPost> getPosts(){
  76. List<String> links = getlinks();
  77. List<CSDNPost> posts =newLinkedList<CSDNPost>();
  78. for(String link : links){
  79. CSDNPost post = getPost(link);
  80. if(post !=null){
  81.                 posts.add(post);
  82. }
  83. }
  84. return posts;
  85. }
  86. privateCSDNPost getPost(String url){
  87. System.out.println(“url\t”+ url);
  88. Downloader downloader =newDownloader();
  89. String html = downloader.download(url);
  90. if(html ==null)
  91. returnnull;
  92. Document doc =Jsoup.parse(html);
  93. String title = doc.select(“.article_title”).first().text();
  94. String categroy =“Uncategorized”;
  95. Elements link_categories = doc.select(“.article_manage .link_categories”);
  96. if(link_categories !=null){
  97. Element first = link_categories.first();
  98. if(first !=null){
  99. Elements href = first.select(“a”);
  100. if(href !=null){
  101.                     categroy = href.text();
  102. }
  103. }
  104. }
  105. String postdate = doc.select(“.article_manage .link_postdate”).first().text();
  106. String content = doc.select(“.details .article_content”).first().text();
  107. SimpleDateFormat sdf =newSimpleDateFormat(“yyyy-MM-dd HH:mm”

    相關推薦

    csdn搬家wordpress http://youthmemo.com/?p=2082

    本程式可以完成的工作:轉移csdn上面的文章(限於文字內容)到wordpress;不能完成的工作:1、不支援在wordpress上建立分類,所以需要提前在wordpress上手工建立分類(保持與csdn一致);2、不能以很好的格式轉移文章,轉移之後文章格式需要調整。 程式由採集、解析、發帖三

    fiddler filters 使用(fiddler只顯示指定請求,fiddler不顯示指定請求,即filter請求過濾)http://blog.csdn.net/notejs/article/

    fiddler filters 使用(fiddler只顯示指定請求,fiddler不顯示指定請求,即filter請求過濾)Fiddler 有一個filters可以很好的幫助我們只顯示我們關係的請求或者隱藏掉我們不關心的請求。這在開發中是非常有用的,尤其是你在這邊想看請求,那邊

    STL中迭代器淺析(http://blog.csdn.net/gou_zh/archive/2008/11/04/3209974.aspx)

    STL中迭代器淺析 C++中的迭代器主要有三種,迭代器的作用就是讓你用*iter就可以訪問容器中的值,用iter++就可以向後遍歷,而不必去管容器的內部結構。 1.insert iterator(安插型迭代器,三種)back_insert_iterator, front_in

    sqlite 資料型別 全面(http://blog.csdn.net/jin868/article/details/5961263)

    一般資料採用的固定的靜態資料型別,而SQLite採用的是動態資料型別,會根據存入值自動判斷。SQLite具有以下五種資料型別: 1.NULL:空值。 2.INTEGER:帶符號的整型,具體取決有存入數字的範圍大小。 3.REAL:浮點數字,儲存為8-byte IEEE浮

    Tomcat啟動分析(http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html)

    接受 inf ultimate database -a htm ble 配置 https Tomcat啟動分析 1 - Tomcat Server的組成部分 1.1 - Server A Server element represents the entire Catali

    Java時間日期格式轉換 http://www.cnblogs.com/edwardlauxh/archive/2010/03/21/1918615.html

    throws 星期四 stat 格式轉換 see blog 一是 取得數據 www Java時間格式轉換大全 import java.text.*; import java.util.Calendar; public class VeDate { /** * 獲取

    PHP黑魔法(該篇文章http://www.91ri.org/12634.html 目的是作為自己的筆記方便查找)

    open Once font 註意 not 條件 思維 資料 echo 那些年我們學過的PHP黑魔法

    Java併發程式設計volatile關鍵字解析--http://www.cnblogs.com/dolphin0520/p/3920373.html

    Java併發程式設計:volatile關鍵字解析    volatile這個關鍵字可能很多朋友都聽說過,或許也都用過。在Java 5之前,它是一個備受爭議的關鍵字,因為在程式中使用它往往會導致出人意料的結果。在Java 5之後,volatile關鍵字才得以重獲生機。   volatile關鍵

    http://www.cnblogs.com/findumars/p/5180490.html)記憶體管理

    [導語] 記憶體管理是C++最令人切齒痛恨的問題,也是C++最有爭議的問題,C++高手從中獲得了更好的效能,更大的自由,C++菜鳥的收穫則是一遍一遍的檢查程式碼和對C++的痛恨,但記憶體管理在C++中無處不在,記憶體洩漏幾乎在每個C++程式中都會發生,因此要想成為C++高手,記憶體管理一關是必須要過的,

    實現多執行緒的兩種方法(http://www.2cto.com/kf/201507/423032.html)

     實現多執行緒的兩種方法:繼承Thread類或實現Runnable介面 Java中實現多執行緒有兩種方法:繼承Thread類和實現Runnable介面,在程式開發中只要是多執行緒,我們一般都是實現Runnable介面,原因歸結為一點:實現介面比繼承類要好。 多執行緒的第

    C++中函式過載、隱藏、覆蓋和重寫的區別 http://www.bijishequ.com/detail/277975?p=

    程式碼編譯執行環境:VS2012+Debug+Win32 1.函式過載(Function Overload) 1.1定義 C++規定在同一作用域中,同名函式的形式引數(指引數的個數、型別或者順序)不同時,構成函式過載。 1.2用法 比如,要從兩個變數中返回其中較

    三十歲以前不要在乎的事情- -(http://smallcar.bokee.com/3123902.html)

    三十歲以前不要在乎的事情- -                                             1.放棄 :把握的反面就是放棄,選擇了一個機會,就等於放棄了其它所有的可能。當新的機會擺在面前的時候,敢於放棄已經獲得的一切,這不是功虧一簣,這不是半途而廢

    關於 redis、memcache、mongoDB 的對比 http://www.cnblogs.com/94cool/p/3247307.html

    從以下幾個維度,對 redis、memcache、mongoDB 做了對比。 1、效能 都比較高,效能對我們來說應該都不是瓶頸。 總體來講,TPS 方面 redis 和 memcache 差不多,要大於 mongodb。 2、操作的便利性 memcache 資料結構單一。(key-value) redis

    轉載http://blog.csdn.net/hguisu/article/details/7418161 作者為真實的歸宿

    轉載自:http://blog.csdn.net/hguisu/article/details/7418161 作者為:真實的歸宿 1.什麼是IO       Java中I/O操作主要是指使用Java進行輸入,

    操作系統---棧區與堆區 https://blog.csdn.net/amcp9/article/details/79597481

    大量 src 獨立 下一條 拓展 自動分配 原創 工作 detail 當一個程序運行時,其RAM存儲方式是按照一定的區域劃分的,以C為例 內存中的棧區處於相對較高的地址向較低的地址拓展,由操作系統決定的最高地址,所以它是一塊連續的內存空間。 棧中分配局部變量空間

    oracle聚簇表的理解 (https://blog.csdn.net/gumengkai/article/details/51009345 )

    Oracle支援兩種型別的聚簇:索引聚簇和雜湊聚簇 一.索引聚簇表的原理 聚簇:如果一些表有一些共同的列,則將這樣一組表儲存在相同的資料塊中 聚簇還表示把相關的資料儲存在同一個塊上。利用聚簇,一個塊可能包含多個表的資料。 概念上就是說如果兩個表或多個表經常做連線操作,就可以預先把需要的資料也儲存在一起

    oracle聚簇表的理解 (https://blog.csdn.net/gumengkai/article/details/51009345 )

    們的 關於 sele 結果 在一起 pac 問題 umeng eat Oracle支持兩種類型的聚簇:索引聚簇和哈希聚簇 一.索引聚簇表的原理 聚簇:如果一些表有一些共同的列,則將這樣一組表存儲在相同的數據塊中 聚簇還表示把相關的數據存儲在同一個塊上。利用聚簇,一個塊可能包

    c語言列印二叉樹樹形結構(轉載http://blog.csdn.net/xzongyuan)

    #include<stdio.h> #include<stdlib.h> #include<time.h> #define NUM 5 typedef struct _node { int value; struct _nod

    java編碼轉換過程(http://cmsblogs.com/?p=1475)

    tex src bytes .com 設定 界面 console 獲取 java程序 一、java編碼轉換過程(轉自http://cmsblogs.com/?p=1475) 我們總是用一個java類文件和用戶進行最直接的交互(輸入、輸出),這些交互內容包含的文字可能會包含

    DP(動態規劃)新手到專家 ——Hawstein

    清晰 進行 odi 此外 是個 ons 最小 影響 簡介 這是我第一篇博文,本想自己寫一篇,但是看他的DP講的太好了,就轉載了一下; ——————————————————————————————————————————————————————————分界線 作者:Hawst