本程序可以完成的工作:转移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
- packagecn.mingyuan.csdn2wordpress;
- importjava.io.IOException;
- importjava.net.MalformedURLException;
- importjava.net.URL;
- importjava.text.ParseException;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importjava.util.HashMap;
- importjava.util.LinkedList;
- importjava.util.List;
- importjava.util.Map;
- importjava.util.concurrent.TimeUnit;
- importorg.apache.xmlrpc.XmlRpcException;
- importorg.apache.xmlrpc.client.XmlRpcClient;
- importorg.apache.xmlrpc.client.XmlRpcClientConfigImpl;
- importorg.jsoup.Jsoup;
- importorg.jsoup.nodes.Document;
- importorg.jsoup.nodes.Element;
- importorg.jsoup.select.Elements;
- /**
- *采集、解析、转移
- *
- *@authormingyuan
- *
- */
- publicclassMover{
- privateinttotalPages;
- privateXmlRpcClientConfigImplconfig;
- privateXmlRpcClientclient;
- privateStringbaseUrl;
- privateObjectuserName;
- privateObjectpassword;
- privateStringcsdnUserName;
- publicMover(inttotalPages,StringblogRpcUrl,StringcsdnUrl,StringcsdnUserName,StringuserName,
- Stringpassword){
- this.totalPages=totalPages;
- this.baseUrl=csdnUrl;
- this.csdnUserName=csdnUserName;
- this.userName=userName;
- this.password=password;
- config=newXmlRpcClientConfigImpl();
- try{
- config.setServerURL(newURL(blogRpcUrl));
- }catch(MalformedURLExceptione){
- System.out.println(“请检查url”);
- }
- client=newXmlRpcClient();
- client.setConfig(config);
- }
- privateList<String>getlinks(){
- List<String>list=newLinkedList<String>();
- for(inti=1;i<=totalPages;i++){
- System.out.println(“processingpage”+i);
- Downloaderdownloader=newDownloader();
- Stringcontent=downloader.download(baseUrl+“/”+csdnUserName+“/article/list/”+i);
- if(content==null)
- continue;
- Documentdoc=Jsoup.parse(content);
- Elementsfirst=doc.select(“.link_title”);
- for(intj=0;j<first.size();j++){
- Elementfirst2=first.get(j).select(“a”).first();
- Stringlink=baseUrl+first2.attr(“href”);
- list.add(link);
- System.out.println(“getlink\t”+link);
- }
- System.out.println(“page”+i+“extractordone,sleep2s”);
- try{
- TimeUnit.SECONDS.sleep(1);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- }
- returnlist;
- }
- publicList<CSDNPost>getPosts(){
- List<String>links=getlinks();
- List<CSDNPost>posts=newLinkedList<CSDNPost>();
- for(Stringlink:links){
- CSDNPostpost=getPost(link);
- if(post!=null){
- posts.add(post);
- }
- }
- returnposts;
- }
- privateCSDNPostgetPost(Stringurl){
- System.out.println(“url\t”+url);
- Downloaderdownloader=newDownloader();
- Stringhtml=downloader.download(url);
- if(html==null)
- returnnull;
- Documentdoc=Jsoup.parse(html);
- Stringtitle=doc.select(“.article_title”).first().text();
- Stringcategroy=“Uncategorized”;
- Elementslink_categories=doc.select(“.article_manage.link_categories”);
- if(link_categories!=null){
- Elementfirst=link_categories.first();
- if(first!=null){
- Elementshref=first.select(“a”);
- if(href!=null){
- categroy=href.text();
- }
- }
- }
- Stringpostdate=doc.select(“.article_manage.link_postdate”).first().text();
- Stringcontent=doc.select(“.details.article_content”).first().text();
- SimpleDateFormatsdf=newSimpleDateFormat(“yyyy-MM-ddHH:mm”);
- CSDNPostpost=newCSDNPost();
- post.setCategories(newString[]{categroy});
- post.setTitle(title);
- try{
- post.setDateCreated(sdf.parse(postdate));
- }catch(ParseExceptione){
- post.setDateCreated(newDate());
- }
- post.setDescription(content);
- returnpost;
- }
- publicvoidpublish(CSDNPostpost){
- Map<String,Object>struct=newHashMap<String,Object>();
- struct.put(“dateCreated”,post.getDateCreated());
- struct.put(“description”,post.getDescription());
- struct.put(“title”,post.getTitle());
- struct.put(“categories”,post.getCategories());
- Object[]params=newObject[]{userName,userName,password,struct,true};
- Stringblogid=null;
- try{
- blogid=(String)client.execute(“metaWeblog.newPost”,params);
- }catch(XmlRpcExceptione){
- e.printStackTrace();
- System.out.println(“导入出现错误:title=”+post.getTitle());
- }
- System.out.println(post.getTitle()+“>>导入完毕,生成博文id为>>”+blogid);
- struct.clear();
- }
- publicstaticvoidmain(String[]args)throwsIOException{
- Moverextractor=newMover(19,“http://youthmemo.com/xmlrpc.php”,“http://blog.csdn.net”,“telnetor”,“admin”,
- “xxxx”);
- List<CSDNPost>posts=extractor.getPosts();
- for(CSDNPostpost:posts){
- extractor.publish(post);
- try{
- TimeUnit.SECONDS.sleep(1);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- System.out.println(post.getTitle());
- }
- System.out.println(“done!”);
- }
- }
下面给出下载类Downloader.java
- packagecn.mingyuan.csdn2wordpress;
- importjava.io.BufferedReader;
- importjava.io.IOException;
- importjava.io.InputStreamReader;
- importorg.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
- importorg.apache.commons.httpclient.HttpClient;
- importorg.apache.commons.httpclient.HttpException;
- importorg.apache.commons.httpclient.HttpMethod;
- importorg.apache.commons.httpclient.HttpStatus;
- importorg.apache.commons.httpclient.cookie.CookiePolicy;
- importorg.apache.commons.httpclient.methods.GetMethod;
- importorg.apache.commons.httpclient.params.HttpClientParams;
- importorg.apache.commons.httpclient.params.HttpMethodParams;
- /**
- *downloader
- *
- *@authormingyuan
- *
- */
- publicclassDownloader{
- privateHttpClientParamsparams=null;
- privateHttpClientclient=null;
- /**
- *默认构造函数,初始化一系列变量
- */
- publicDownloader(){
- //构造HttpClientParams参数
- params=newHttpClientParams();
- params.setParameter(
- HttpClientParams.USER_AGENT,
- “Mozilla/5.0(Windows;U;WindowsNT5.1;zh-CN;rv:1.9.2.3)Gecko/20100401Firefox/3.6.3GTBDFffGTB7.0(.NETCLR3.5.30729)”);
- params.setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS,false);
- params.setParameter(HttpClientParams.MAX_REDIRECTS,4);
- params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT,(long)60*1000);
- params.setParameter(HttpClientParams.SO_TIMEOUT,60*1000);
- //使用系统提供的默认的恢复策略
- params.setParameter(HttpMethodParams.RETRY_HANDLER,newDefaultHttpMethodRetryHandler());
- client=newHttpClient(params);
- }
- /**
- *下载网页
- *
- *@paramurl
- *网页url
- *@returnString类型的网页源码
- */
- publicStringdownload(Stringurl){
- HttpMethodmethod=newGetMethod(url);
- StringsourceCode=null;
- method.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
- //读取内容
- StringBuilderbuilder=newStringBuilder();
- BufferedReaderreader=null;
- try{
- intstatusCode=client.executeMethod(method);
- if(statusCode!=HttpStatus.SC_OK){
- returnnull;
- }
- reader=newBufferedReader(newInputStreamReader(method.getResponseBodyAsStream(),“utf8″));
- Stringline;
- while((line=reader.readLine())!=null){
- builder.append(line+“\r\n”);
- }
- sourceCode=builder.toString();
- }catch(HttpExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- reader.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- //释放连接
- method.releaseConnection();
- client.getHttpConnectionManager().closeIdleConnections(0);
- }
- returnsourceCode;
- }
- }
最后发出一个pojo,CSDNPost.java
- packagecn.mingyuan.csdn2wordpress;
- importjava.util.Date;
- /**
- *csdnpost
- *
- *@authormingyuan
- *
- */
- publicclassCSDNPost{
- /**
- *博文创建日期
- */
- privateDatedateCreated;
- /**
- *博文内容
- */
- privateStringdescription;
- /**
- *标题
- */
- privateStringtitle;
- /**
- *博文分类
- */
- privateString[]categories;
- publicCSDNPost(){
- }
- publicCSDNPost(Stringtitle,Stringdescription,String[]categories,DatedateCreated){
- this.dateCreated=dateCreated;
- this.description=description;
- this.title=title;
- this.categories=categories;
- }
- publicDategetDateCreated(){
- returndateCreated;
- }
- publicvoidsetDateCreated(DatedateCreated){
- this.dateCreated=dateCreated;
- }
- publicStringgetDescription(){
- returndescription;
- }
- publicvoidsetDescription(Stringdescription){
- this.description=description;
- }
- publicStringgetTitle(){
- returntitle;
- }
- publicvoidsetTitle(Stringtitle){
- this.title=title;
- }
- publicString[]getCategories(){
- returncategories;
- }
- publicvoidsetCategories(String[]categories){
- this.categories=categories;
- }
- }
以上是全部源码。
在文章的结尾,我愿意跟大家分享一下这个小程序的开发心得。
一开始写这个程序的时候,觉得会很快搞定,因为这个程序无非就是三个过程:采集、解析、发帖。其实也真是这样的一个过程。
这个程序耗费精力比较多的地方是在解析网页、提取链接、标题、内容、发布时间、分类方面。
一开始想用xpath解析网页,并且写xpath表达式都在chrome上测试通过xpath helper验证通过了。但在编码阶段发现现有的工具包,比如dom4j就不支持对html的解析,网上看了有通过htmlparser将html转换成xml的方法。但觉得太麻烦,最后发现了JSoup这个非常强大的工具,它可以通过类似jquery和css选取语法的表达式来提取内容。尝试了下非常方便,于是解析这个问题没有了(有个小窍门:chrome浏览器开发者工具可以看某节点的css样式,把这个样式直接传递给jsoup就能提取内容)。
wordpress支持MetaWeblog协议,可以通过XML-RPC进行发帖。关于它们的信息可以通过以下链接找到:
http://en.wikipedia.org/wiki/MetaWeblog
http://en.wikipedia.org/wiki/XML-RPC (可以找到各种语言版本的api)
另外JSoup的地址是:
程序写的太匆忙,肯定有很多不尽人意的地方,希望各位指出。我的联系方式是:admin#youthmemo.com。
相关推荐
大幅http://hi.csdn.net/invite.php?u=325297&c=1ace3e55fd7f56be
http://album.hi.csdn.net/app_uploads/liubocy/20081117/021309093.p.jpg?d=20081117021615546http://album.hi.csdn.net/app_uploads/liubocy/20081117/021309093.p.jpg?...
Google Chrome 正式版 官方离线安装包,可自动升级,ChromeStandaloneSetup.exe 版本:23.0.1271.95 m 可自动升级 国内用户从官方下载Chrome后,安装...国内由于某原因经常无法下载,故现在放到CSDN供大家学习使用。
这是一个安卓app升级版本更新的项目,里面包含了通知栏更新以及app内部更新,更新的情况分为强制更新,推荐更新和无需更新3种,里面使用了downloaderManager和...https://github.com/zilianliuxue/AndroidStudy/
简单的学生信息管理系统,实现对用户类型的不同权限管理(增删改查). 文章介绍:https://blog.csdn.net/qq_56886142/article/details/122740969?spm=1001.2014.3001.5501
+65+ http://passport.csdn.net/account/active?user=w757090923&active=DB8E378EF10ABF2811B4597AEBAE3FF4
[license]https://download.csdn.net/download/qq345162168/12579760 [part1]https://download.csdn.net/download/qq345162168/12579642 [part2]https://download.csdn.net/download/qq345162168/12579654 [part3]...
http://blog.csdn.net/gjldwz/article/details/50555922 Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element '...
IAR EWARM 6.50.6 破解 破解原理和方法见:...此破解方式暂时未发现bug,若有发现问题的可到http://blog.csdn.net/chivalrys/article/details/8564568 提交问题。 仅供研究学习
资源分类:Python库 所属语言:Python 资源全名:pulpcore-client-3.12.0.dev1616039724.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
智能家居资料 视频链接:https://www.bilibili.com/video/BV1Tv41167s8 教程链接:https://www.bilibili.com/video/BV1St4y1X78p 资料包密码:12348765
更详细的信息请参见http://topic.csdn.net/t/20060328/11/4644901.html。 这7种FFT代码包括。 1. galois_godel()给出的程序 2. http://topic.csdn.net/t/20060222/13/4570436.html中的程序 3. 朱志刚的FFT程序...
IAR EWARM 6.50.6 & 6.60.1 破解 破解原理和方法见:...此破解方式暂时未发现bug,若有发现问题的可到http://blog.csdn.net/chivalrys/article/details/8564568 提交问题。 仅供研究学习
项目介绍:https://blog.csdn.net/weixin_40805686/article/details/99221539 在线演示地址:http://www.weichufeng.cn/csdn/shopCar/shopCar.html
V1.0: https://blog.csdn.net/weixin_44550335/article/details/120623524?spm=1001.2014.3001.5501 V1.2 https://blog.csdn.net/weixin_44550335/article/details/120623641?spm=1001.2014.3001.5501 V2.0 ...
1.0: https://blog.csdn.net/HappyStarLap/article/details/136232327?spm=1001.2014.3001.5502 2.0: https://blog.csdn.net/HappyStarLap/article/details/136272139?spm=1001.2014.3001.5502 3.0: ...
从描述中也无法获取更多细节,它只是重复了标题的信息。不过,我们可以根据提供的标签“文件”以及压缩包内的文件名来推测可能涉及的知识点。 压缩包包含两个文件:`vivado_lic2037.lic` 和 `说明.txt`。这两个...
excal转dbc,详细信息见 https://blog.csdn.net/m0_56315547/article/details/121164420?spm=1001.2014.3001.5501 百度网盘下载地址: 链接:https://pan.baidu.com/s/1N20i5IDD7K6tSohgVVbOfQ?pwd=lfe3 提取码:...
官方地址:http://mhdd.com/,其他下载地址:https://hddguru.com/software/2006.02.10-Magic-Boot-Disk/,使用方法请参考我的博文:https://blog.csdn.net/sdnuwjw/article/details/90143711
https://blog.csdn.net/weixin_53221528/article/details/134428251?spm=1001.2014.3001.5502https://blog.csdn.net/weixin_53221528/article/details/134428251?...