JavaEye的博客支持RSS的全文输出,所以你可以随时通过抓取RSS来将博客文章内容备份到本地或者同步到其他博客网站。除此之外,我们还为博客用户提供了如下两种高级的博客导出功能:
一、将博客导出备份为PDF
利用JavaEye博客制作电子书功能,将博客文章制作为PDF,下载或者共享出去,这种方式非常适合于备份或者电子出版。
二、用JavaEye博客备份脚本,将你的博客文章保存在本地硬盘html网页
我们已经为你编写好了ruby的备份脚本,你只要在自己电脑上安装Ruby解析器就可以运行了,抓取下来的博客文章,会按照每篇博客文章一个网页html文件来保存,所有网页文件都默认保存在以你JavaEye域名名称的目录下面。这样你可以定期运行这个备份脚本来实现网页格式的备份。
目 录 [ - ]
- 使用JavaEye博客备份脚本来批量导出你的博客
- JavaEye博客备份脚本源代码
- 用博客制作电子书功能来备份博客
- 使用Google Reader来巧妙的实现JavaEye博客的批量导出备份
使用JavaEye博客备份脚本来批量导出你的博客
首先你应该确保你的博客被Google Reader订阅,如果你是一个比较勤奋的博客作者,一般情况下都已经被订阅了。如果没有被Google Reader订阅,你也可以在Google Reader里面订阅自己的博客地址。然后你就可以下载这个页面附件提供的备份脚本来批量导出你的博客了。使用方法很简单:
1、你的电脑必须安装了Ruby解析器,如果还没有安装的话,赶紧去Ruby官方网站或者Rubyforge.org上下载安装一个吧。ruby1.8或者ruby1.9版本都可以,我们建议你用ruby1.8.7版本,因为这是我们编写脚本的开发和测试环境。对于操作系统,我们支持MacOSX,Linux和Windows。
2、打开命令行窗口,输入如下命令:
Ruby代码
1. ruby javaeye_blog_backup.rb -u bitch -p fcuk-gfw cnnic.iteye.com
备份脚本支持3个参数:-u和-p是填写你的Google帐户和密码(你还没有Google帐户?赶紧申请一个吧),必选的参数;另外还支持-d指定备份下来的网页保存在那个目录下面,默认是当前目录下面的域名子目录。最后一个参数就是你的JavaEye博客域名了。
是不是很简单?
JavaEye博客备份脚本源代码
Ruby代码
1. #!/usr/bin/env ruby
2. # encoding: UTF-8
3.
4. %w(cgi iconv open-uri openssl fileutils rexml/document).each { |lib| require lib }
5.
6. # this dirty line is used to pass the ssl verify. This script can
7. # execute successfully on my ArchLinux. You can try to comment it.
8. # And in ruby 1.9, you can pass a hash to open-uri instead of this.
9. # open(url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) { bla...
10. OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
11.
12. # Thanks to http://rednaxelafx.iteye.com/blog/588507
13. # String#mgsub taken from Ruby Cookbook, Recipe 1.18
14. class String
15. def mgsub(key_value_pairs = [].freeze)
16. regexp_fragments = key_value_pairs.collect {|k,v| k }
17. Regexp.union(*regexp_fragments)) do |match|
18. key_value_pairs.detect {|k,v| k =~ match}[1]
19. end
20. end
21. end
22.
23.
24. class GReader
25. TEMPLATE = <<-HTML
26. "-//W3C//DTD XHTML 1.0 Transitional//EN"
27. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
28. "http://www.w3.org/1999/xhtml">
29. <head>
30. "Content-Type" content="text/html; charset=UTF-8"/>
31. <title>_title_</title>
32. </head>
33. <body>
34. _link_
35. _time_
36. _body_
37. </body>
38. </html>
39. HTML
40.
41. def initialize(options = {})
42. @g_sid = get_sid options[:g_name], options[:g_pwd]
43. @g_auth = get_auth options[:g_name], options[:g_pwd]
44. @blog_rss = "http://#{options[:domain]}/rss"
45. @header = {
46. "UserAgent" => "JavaEye Blog Backup Script",
47. "Cookie" => "SID=#@g_sid",
48. "Authorization" => "GoogleLogin auth=#@g_auth"
49. }
50. @reader_path = "https://www.google.com/reader/atom/feed/#{CGI.escape @blog_rss}?n=44444"
51. @dir = FileUtils.makedirs(options[:dir] ||= options[:domain])
52. # Thanks to http://rednaxelafx.iteye.com/blog/588507
53. # In ruby 1.9, makedirs will give you an array
54. Dir.chdir @dir rescue Dir.chdir @dir.first
55. end
56.
57. def fetch
58. "Downloading..."
59. @reader_path
60. @reader_path, @header) do |response|
61. new(response).elements.each("*/entry") do |entry|
62. begin
63. "title"].text
64. "link"].attributes['href']
65. Time.parse(entry.elements["published"].text).strftime("%Y-%m-%d") rescue ''
66. "summary"] || entry.elements["content"]).text.sub(/<span style="color:red">\s*<a.*style="color:red">((已有 <strong>\d+<\/strong> 人发表留言,猛击->><strong>这里<\/strong><<-参与讨论)|(本文的讨论也很精彩,浏览讨论>>)).*$/m, '')
67. "#{title}.html"
68.
69.
70. # Thanks to http://rednaxelafx.iteye.com/blog/588507
71. # For windows user
72. if RUBY_PLATFORM =~ /mswin/i
73. '\'], [%r{/}, '/'],
74. ':'], [/\*/, '*'],
75. '?'], [/"/, '“'],
76. '<'], [/>/, '>'],
77. '|']])
78. "GB18030", "UTF-8", filename)
79. end
80.
81. File.open(filename, "w") do |f|
82. '_title_', title).sub('_link_', "<h3><a href=#{link} title='原文链接'>#{title}</a></h3>").sub('_time_', time).sub('_body_', body)
83. end
84. "[Save] #{filename}"
85. rescue Exception => e
86. "[Error] #{e.message}"
87. next
88. end
89. end
90. end
91. "All files have been saved in #{Dir.pwd}"
92. rescue Exception => e
93. "[Error] #{e.message}"
94. end
95.
96. def get_sid(g_name, g_pwd)
97. "Login..."
98. "https://www.google.com/accounts/ClientLogin?Email=#{g_name}&Passwd=#{g_pwd}") { |res| res.string.split("\n").detect {|l| l =~ /^SID=/ }.strip.sub(/^SID=/,'') }
99. rescue Exception => e
100. "[Error] login failed. #{e.message}"
101. exit
102. end
103.
104. def get_auth(login, password)
105. "Auth..."
106. "https://www.google.com/accounts/ClientLogin?Email=#{login}&Passwd=#{password}&service=reader") { |res| res.read.strip.sub(/^SID=.*Auth=/m,'') }
107. rescue Exception => e
108. "[Error] Auth failed. #{e.message}"
109. exit
110. end
111. end
112.