最后更新:v2017-09-14
前言:
1.使用本脚本之前必看:
2.想要看本程序的使用说明,可直接去这里:
3.有任何问题,意见,建议,bug提交等,建议去专门的讨论区:
BlogsToWordPress – WordPress博客搬家工具 讨论区
4.如果想要对此脚本进行扩展,以支持更多类型的博客搬家,可参考:
如何扩展BlogsToWordPress以支持更多类型的博客搬家
BlogsToWordpress简介
BlogsToWordpress是Python语言实现的脚本。
主要用来实现:
1. 将(新版)百度空间,网易163,新浪sina,QQ空间,人人网,CSDN,搜狐Sohu,博客大巴Blogbus,天涯博客,点点轻博客等博客,搬家到wordpress。
(即通过此Python脚本,将博客中的帖子的各种信息,导出为WXR文件。然后就可以将其导入wordpress,实现博客搬家了。)
2. 以及搬家后,修改原先帖子,添加搬家声明等信息。
下载BlogsToWordpress
关于下载:
之前的BlogsToWordpress,从v1到v17.1,都是放在GoogleCode上面的:
后来由于GoogleCode不支持下载功能,而搬家到SourceForge:
【记录】把BlogsToWordPress项目从GoogleCode搬家到SourceForge
目前最新下载主页是:
(旧版本:
之后,所有的最新版本,都请到SourceForge上的BlogsToWordpress 去下载。)
此处,把目前的最新版本的源码和可执行文件的下载地址,贴出来,方便直接点击下载:
最新版本号 | 源码下载地址 | 可执行文件下载地址 |
v18.3 | BlogsToWordpress_v18.3_2014-05-23.7z |
|
v18.2 |
| |
v17.7 | BlogsToWordpress_v17.7_2013-08-27.7z |
|
BlogsToWordpress的由来
关于最初的要把博客导入到wordpress中的详细折腾过程,参见:
此处只简要说说过程。
之前机缘巧合,想弄一个个人网站,然后就找到了wordpress。
用wordpress把网站搭建起来后,就遇到了,需要把之前其他博客的帖子,搬家搬到当前的个人网站。
接着就知道了,有个wordpress importer的东西,支持把对应的WXR文件导入到wordpress中,就可以实现帖子搬家了。但是对于如何获得/生成对应的WXR文件,就遇到了问题。
网上所能找到的所有的方法,都不能实现我要的功能。
最接近,最可能的,可以实现需要的功能,算是下面这几个工具了:
1。先是BlogMover.zip中的163-blog-mover.py和hi-baidu-mover.py,都不能用,
2 。其次,后来找到的新版本的hi-baidu-mover_v2.zip中的hi-baidu-mover_v2.py,也不能用。
两者的最原始的代码,都是参考 Live Space Mover的,其代码放在google code了:live-space-mover。
接下来,就是被逼无奈,在对于Python只有写过一个简单的脚本:
的基础上,花了大半个月,实现了这个脚本的:
(1)第一个版本
BlogsToWordpress_v2012-01-10.7z
是百度和163分开实现的。
当时不了解如何通过python去登陆百度,163等博客,所以也就无法导入博客中的私人日志。
(2)第二个版本:
后来在折腾了:
WLW (Windows Live Writer) Plugin–InsertSkydriveFiles
后,搞懂了如何C#中如何登陆网页,搞懂了cookie等相关的逻辑,然后回头又来通过python语言,实现了这套逻辑,因此,也就可以把登录功能添加到了此脚本中。实现了第二个版本的BLogsToWordpress,即支持登陆模式下的,导入所有的帖子,包括公开的public的帖子,和私人的private的帖子。
并且又接着在登陆模式基础上,添加修改帖子内容,以添加博客搬家声明的功能。
本来想单独放出来此第二个版本的,但是考虑到代码有点乱,以及本来就像将两个单独的python脚本baiduBlogToWordpress和163BlogToWordpress合并到一起的,所以就又去花时间,折腾出下面的:
(3)第三个版本:
此版本,是将两个脚本中间包含了很多重复的代码,。因此,在其基础上,动了大手术:
把整个博客搬家相关的框架部分的代码,抽取出来放到核心的BlogsToWordpress中;
然后再把不同博客提供商(百度和163)对应的代码,分别放到BlogBaidu和BlogNetease中去;
同时又把常用的功能提取出来,整理为我的自己的python库:crifanLib.py。
至此,才算实现我最终想要的,即把博客搬家,弄成框架式的。
这样,以后如果谁想要实现其他博客搬家的话,就可以参考已经实现的百度,163的博客的代码,然后照葫芦画瓢,去写个对应的BlogXXX,实现了对应的接口函数,也可以同样实现对应的博客搬家的功能了。
(4)第四个版本
在http://code.google.com/p/blogs-to-wordpress/issues/list中看到有人提要求,希望实现新浪,qq空间等搬家到wordpress。关于这点,之前就考虑过,之前没折腾,主要是因为:
a。精力有限,忙于折腾百度和网易的搬家的实现。
b。之前已经有人实现了此功能:新浪博客搬家WordPress
c。自己之前不需要此功能
不过,此处,还是打算,再花些精力,把新浪博客搬家到wordpress的功能实现了。
然后就花了几天,实现了这个v4.0,支持新浪博客搬家了。
此部分,总得来说,难度不是很大,但是还是有很多技术细节需要处理的。
尤其是BeautifulSoup的一些bug等,花费了不少时间找到规避该bug的方法。
其他的,包括评论数据如何获取等,就是通过抓取网页分析一下,就可找到具体方法了。
(5)第五个版本
同上,实现了某人所希望的,支持QQ空间搬家的功能。
折腾这个,把基本功能实现了,即支持导出帖子的标题,分类,标签,发布时间,内容等,花了大概2,3天,但是后期处理百度的各种变态的编码等问题,以及添加支持各种类型的图片地址的支持等,加上最后的大量的测试,共又花了2,3天。前后一共算下来共花了大概5天时间。
总的来说,难度不大,但是需要再花点精力。
有点难度的事情,主要是python中如何使用好正则表达式re模块,去写单个的pattern,但却能匹配多种不同的地址等,需要对正则表达式比较熟悉才能搞定的。
最后还是感慨一下,百度在QQ空间的技术实现上,真的很变态,详情参见:
【记录】给Python脚本BlogsToWordPress中实现QQ空间搬家到wordpress的功能 + 感慨:QQ空间真的很变态
(6)第六个版本
看到某人说没找到支持人人网搬家到wordpress的,所以就去实现了人人网搬家到wordpress。
添加了基本功能的支持,难度不大,但是需要先去实现登陆模式,因为人人网不登陆,是无法查看博客帖子的。
然后又发现有些公共主页,是可以不登陆,也是可以查看,也就添加了对应的支持导出为wxr。
另外,又花时间去测试了一些个别帖子,其评论多达1000多个,对其全部抓取并处理。
(7)第七个版本
看到有人在百度知道中提及想找CSDN搬家到wordpress,所以,就又花些时间去实现了这个功能。
(8)第八个版本
是看到博客备份工具(Blog_Backup)中,支持很多博客,所以自己就又花点时间,对于搜狐等一些常见的博客,添加了支持。
(9)第九版
主要改变了WXR(XML)文件导出方式,由之前的在全部文章处理完毕,最后一次性导出所有的文章为WXR文件,
改为现在在处理过程中,(当大小超过文件大小限制,默认为2MB的时候)就导出。
因为之前的问题是,如果由于后期某个帖子出了问题,导致前面已经处理过的那么多帖子,都无法导出,还要重来一遍,
现在,可以很大程度的避免此问题了。因为处理过的帖子,加起来要导出的内容超过大小限制,就会及时导出。
这样最坏情况,也最多就是最近一些处理过当的帖子,没有及时导出而已。
(11)第十一版
先是去添加了博客大巴的支持,详见:记录为BlogsToWordPress添加Blogbus支持
后来又去添加了新版百度空间的支持,详见:记录给BlogsToWordPress添加新版百度空间的支持 + 吐槽新版百度空间
(12)一是把子模块都移至子文件夹,使得逻辑和架构更加清晰。因为东西要做得好,不光是外在好用好看,内在也要逻辑清晰才行。
二是由于有人希望导出新版百度的私人的帖子,所以又去增加了对于新版百度空间的登陆模式和更新帖子的支持。
(13)为了方便用户,不需要再去下载安装chardet,所以把chardet集成进去了,发布了v13.8
后来又更新人人网的登陆模式,支持手动输入验证码登陆。
(16)详见:
【记录】为BlogsToWordPress添加点点轻博客(BlogDiandian)的支持
【记录】为BlogsToWordPress添加天涯博客(BlogTianya)的支持
BlogsToWordpress的相关数据
代码量
此脚本,算是在163-blog-mover.py和hi-baidu-mover_v2.py的基础上,自己一点点实现的。
不过呢,现在最新版本的代码中所包含的原先代码,大概不超过2%,可以说是>98%的内容,都是自己一点点从无到有实现的,所以可以说是绝大部分都是自己实现的。
现在BlogsToWordpress的全部代码,加起来的话,估计差不多有近5000行,基本上算是原先两者之和的10倍左右。
工作量和技术难度程度
其实,了解软件的都知道,代码量,不能准确反应出背后的工作量和技术的难度程度。
对于脚本的工作量和技术方面的难度程度,大概评估一下,可以算是:
如果最开始的163-blog-mover.py和hi-baidu-mover_v2.py的工作量和技术难度,都加起来,算是3个人工时的话,
那么三个版本:
(1)不支持登陆模式的第一个版本
工作量和难度,大概有30个人工时.
即,如果说,写163-blog-mover.py和hi-baidu-mover_v2.py需要花费3天的话,写出第一个脚本,至少需要30天=1个月。
其中太多细节和技术难点需要处理,主要精力花费在:
A。分析网页源码,以搞懂评论内容是如何获得的,即分析如何去提交对应的url以及相关的机制。如何提交评论地址,一点点获得所有的评论的内容。
B。获得了返回的评论的原始信息,如何解析处理,获得WXR中所需要的信息。这部分,最消耗时间,太多细节,需要一点点处理。太多评论中的异常的内容,需要考虑。
C。对于处理图片的部分,花费了巨大的精力。主要包括,如何写出一个完美的可以捕获到所有的可能的类型的图片地址,然后如何去下载对应的图片,接着再替换图片。关于用正则表达式re模块去写pattern的话,遇到了各种可能,测试了N个博客,改了N个版本,花了很多的精力和时间。
(2)支持登陆模式的和支持修改帖子的第二个版本
工作量和难度,在第二个版本的基础上,大概有15个人工时。
即在第二个版本的技术上,还需要花大概半个月才可以搞定。
其中主要精力花费是:
A。用IE9或chrome去分析网页登陆的背后逻辑,主要是相关的cookie的来龙去脉。
B。实现了登陆代码后,再去检测是否是登陆的是自己的博客。
C。抓取网页过程,分析发帖的逻辑。
D。实现修改帖子的代码,并测试多个博客,再修补一些bug或遇到特殊问题如何处理,比如遇到敏感词无法修改的帖子,自动跳过等。
总之,这部分,由于有了之前C#下面搞懂的网页登陆的一套逻辑,所以,实现起来,相对技术难度不是那么高,但是还是要花很多时间分析和实现相应代码的。
(3)最后的框架式的第三个版本
工作量和难度,大概有10个人工时.
即在第二个版本的基础上,还要再花个10天左右。
主要精力花费:
A。整理分离出框架代码:BlogsToWordpress
B。整理好子模块的代码,BlogBaidu,BlogNetease,以及自己的python库:crifanLib.py
C。全部代码都OK了,也要做前后加起来有10多个博客的测试,确保都是可以工作的。
这部分,总的来说,没太大技术问题,但是需要花时间和精力整理出来,以及做最后的测试。
(4)第四个版本
在v3.0的框架已经弄好的基础上,算是花了3天左右的时间,搞定了支持新浪博客搬家。
这部分,主要精力花在:
a。解决beautifulSoup的bug上面
b。支持图片下载功能,花了不少时间,主要是re模块的pattern很难弄出完美的,所以暂时只支持sina自己博客的图片,暂不支持其他地址的图片了。
c。自己找了N个博客,测试了各项功能是否OK
(5)第五个版本
v5.5的精力花费:
a。添加基本功能
b。支持各种图片地址及规避百度变态的编码等设计问题
c。大量的测试
大概花了5天时间。
对于v5.6中,解决了sina博客的帖子的评论有时候无法获取全部的bug。
下面是一些测试数据:
帖子1:http://blog.sina.com.cn/s/blog_4701280b0101854o.html
所用命令:
BlogsToWordpress.py -f http://blog.sina.com.cn/s/blog_4701280b0101854o.html -l 1 -x 20971520 |
评论数目:20912个
所花费的时间:
———————————————————————- |
帖子2:http://blog.sina.com.cn/s/blog_4701280b0102e0p3.html
所用命令:
BlogsToWordpress.py -f http://blog.sina.com.cn/s/blog_4701280b0102e0p3.html -l 1 -x 41943040 |
评论数目:37463个
所花费的时间:
Total Processed [0001] posts, averagely each consume seconds=2835.3740 |
(6)第六个版本
共大概花了3天时间,精力花费:
(1)实现基本功能,基本上1天就实现了:1.0天
(2)花时间调试,处理个别特殊的帖子,其编码也是有问题,只能特殊处理才可以:0.5天
(3)添加了支持所有评论(测试过1000多个的):0.5天
(4)支持了登陆模式(登陆并导出自己的人人网日志),非登陆模式(page模式,可导出一些不需要登陆即可查看的公共主页的日志),查看朋友模式(登陆自己的人人,但导出朋友的日志):0.5天
(5)测试了十多个人人网,加起来有好几百个帖子,N个评论:0.5天
(7)第七个版本
大概花了2天时间
(1)用1天实现了基本功能
(2)剩下一天用于测试,测试中发现了几个bug,以及一些个别博客特殊,需要修bug和加上特殊处理。
难度不大,但是对于CSDN博客,也发现一些变态的地方。
其博客帖子,最新的那几个,其下一篇,不是正常的按照时间顺序的下一篇,而是都变成了博客最早的那篇帖子。
本来这种希望读者可以多浏览你CSDN博客的帖子的做法,如果只是最新一篇帖子是这样处理的,那是可以理解的。但是却是最新的好几篇,甚至好多篇帖子,其下一篇都是最早帖子,那就是脑子进水的做法了。
(8)第八个版本
大概花了2天时间:
(1)1天时间了基本功能。
(2)剩下大半天,主要就是处理搜狐中,一些比较变态的事情,主要是blog content部分,包括了很多额外的垃圾内容,主要是:
精彩阅读 , 更多阅读 , 更多文章推荐阅读,体验新版博客,分享到搜狐微博,分割线clear,上一篇,下一篇等。
因为正常的博客,其设计出来,一般都是博客的帖子的内容与这帖子内容有关,但是非帖子内容本身的,则肯定是不同的div,不同的段落,而搜狐设计出来的博客帖子内容,通过Beautifulsoup处理后得到soup,再
foundContent = soup.find(id=”main-content”);
而得到的foundContent ,却包含了上面那些垃圾内容,导致处理起来,很是麻烦,要写出合适的pattern去再去用re.sub以去除这些内容,而且还要兼容不同格式,很是麻烦。
另外,其中很多搜狐的博客帖子,比较早期的一些,很多帖子是没有上下篇的,导致也是需要全部获取文章url列表,以得知下一篇的url,所以也是很费事。总之,搜狐博客设计的,也是尼玛够变态的。
(9)第九版
花了大概1天时间
主要是调整代码的框架结构,比较麻烦些。代码弄好后,经过基本测试,都OK了。
而且还测试了整体处理速度,原以为会慢,但是实际上还略快5%-10%。
(10)后续琐事不再赘述。
所支持的功能
原先脚本只支持最基本的提取帖子的标题,内容,分类,(部分)评论等。
而现在所实现的BlogsToWordpress的第三个版本,全部列出来,大概有:
1.支持输入的地址,是多种格式的。
2.支持处理全部评论
3.支持登陆模式 –> 可以导入私人日志了
4.支持登陆模式下的修改帖子内容->可以给原先帖子中添加搬家声明等内容
5.支持处理图片->下载图片,并替换相应地址:就像最近一些博客,比如QQ空间,百度空间等所支持的,你发布帖子的时候,自动检测出其他图片,问你是否要在发帖的同时,上传图片到你的空间的那个功能。
6.支持处理(其他网站的图片) –> 可以处理其他网站的图片了
7.支持本博客的和其他网站的图片地址替换时候的,自定义所要替换为的图片地址
8.是否自动忽略处理那些图片,该图片地址和之前已经处理过但出错的图片地址类似 –> 以节省时间
9.是否启用google翻译->用于生成WXR中的post title name,即wordpress中发布帖子的固定链接permanent link,可以通过启用google翻译,自动将标题翻译为英文,然后处理为有效的链接地址,这样导入到wordpress后,自动就有了固定链接了
10.支持自定义导出的帖子的地址的前缀
11.支持自定义所输出的WXR文件最大的大小值->导出WXR时,如果超出此大小,则会自动分割,避免了还需要额外的其他XML分割工具来分割了。
12.可自定义所要处理的帖子的类型,包括publicOnly,privateOnly,privateAndPublic
13.对于每种类型的帖子,具体如何处理:exportToWxr和modifyPost,即导出为WXR文件,还是修改帖子的内容。
14.是否自动跳过含敏感词的帖子,以避免修改帖子时候,某个帖子出现这类错误,而导致脚本无法继续执行了。
以上所有参数,都支持开关的特性,即某个功能你不需要,那么就可以传递参数去关闭该功能。
多说一句,正是由于功能太多了点,参数名字也太多,导致参数的缩略字母,都很容易互相冲突,搞得在定义哪个参数用哪个字母,都纠结了一番。。。
更多内容,请参考脚本的-h参数所输出的帮助信息。
BlogsToWordpress功能简介
本BlogsToWordpress脚本支持两大类功能:
1. 将博客内容导出为WXR文件
用于将WXR导入到wordpress中,实现博客搬家的功能
其中,对于导入为WXR,又可以分两类:
(1) 非登陆模式
没有提供用户名和密码的情况下,对于访问一个博客,那当然只能查看对应的公开的发表的帖子了。
因此也只能处理对应的公开发布的帖子。
(2) 登陆模式
在提供了用户名和密码的情况下,支持登陆对应的博客,然后可以根据设置,处理相应类型的帖子。
主要包含两类,一类是处理公开发表的帖子,将这些帖子导出为publish类型的,这样导入Wordpress后,就是对应的已发布的类型的帖子了。
另一类主要是,对于有些博客中,包含有些私人类型的帖子
(百度空间中,会显示出“该文章为私有”;
网易博客中显示出“私人日志”)
将这类帖子,导出为private,这样,导入wordpress后,其帖子属性就是private了,就不会公开发布出来,可以在:
文章 –> 所有文章 –> 私密,中看到对应的私人的帖子。
2. 修改帖子内容
用于在博客搬家之后,给原先博客中的每个帖子,添加对应的搬家声明类的文字说明。
其他一些说明
1.已经在wordpress官网中的 zh-cn:导入内容 中添加此链接,以方便想要搬家的人找到这里。