如何下载phpBB3论坛的所有帖子,如果我不是管理员?
我用来在一个论坛上发布我的想法,并开始担心如果它关闭,我会放松他们。你知道一个好的方法来下载整个(其他人的想法也很好!)phpBB3论坛到数据库?有没有软件可用,或者我必须自己写?如何下载phpBB3论坛的所有帖子,如果我不是管理员?
UPDATE1:
好了,我可以写我自己 - 这不是一个很难的问题,不是吗?我只是不想浪费时间发明自行车。
UPDATE2:
有一个在超级用户回答:How can I download an entire (active) phpbb forum?
不过我更愿意做一个Ruby脚本backuping论坛。这不是一个完整的解决方案,但它对我来说已经足够了。是的,如果你很担心,它不会违反任何TOS。
require :rubygems
require :hpricot
require 'open-uri'
require :uri
require :cgi
#require 'sqlite3-ruby'
class PHPBB
def initialize base_url
@base_url = base_url
@forums, @topics = Array.new(4) { {} }
self.parse_main_page 'main', 'index.php'
@forums.keys.each do |f|
self.parse_forum "forum.#{f}", "viewforum.php?f=#{f}"
end
@topics.keys.each do |t|
self.parse_topic "topic.#{t}", "viewtopic.php?t=#{t}"
end
end
def read_file cached, remote
local = "%s.%s.html" % [__FILE__, cached]
if File.exists? local
return IO.read local
else # download and save
puts "load #{remote}"
File.new(local, "w+") << (content = open(@base_url + remote).read)
return content
end
end
def parse_main_page local, remote
doc = Hpricot(self.read_file(local,remote))
doc.search('ul.forums/li.row').each do |li|
fa = li.search('a.forumtitle').first # forum anchor
f = self.parse_anchor(fa)['f']
@forums[f] = {
forum_id: f,
title: fa.inner_html,
description: li.search('dl/dt').first.inner_html.split('<br />').last.strip
}
ua, pa = li.search('dd.lastpost/span/a') # user anchor, post anchor
q = self.parse_anchor(pa)
self.last_post f, q['p'] unless q.nil?
end
end
def last_post f,p
@last_post = {forum_id: f, post_id: p} if @last_post.nil? or p.to_i > @last_post[:post_id].to_i
end
def last_topic f,t
end
def parse_forum local, remote, start=nil
doc = Hpricot(self.read_file(local,remote))
doc.search('ul.topics/li.row').each do |li|
ta = li.search('a.topictitle').first # topic anchor
q = self.parse_anchor(ta)
f = q['f']
t = q['t']
u = self.parse_anchor(li.search('dl/dt/a').last)['u']
@topics[t] = {
forum_id: f,
topic_id: t,
user_id: u,
title: ta.inner_html
}
end
end
def parse_topic local, remote, start=nil
doc = Hpricot(self.read_file(local,remote))
if start.nil?
doc.search('div.pagination/span/a').collect{ |p| self.parse_anchor(p)['start'] }.uniq.each do |p|
self.parse_topic "#{local}.start.#{p}", "#{remote}&start=#{p}", true
end
end
doc.search('div.postbody').each do |li|
# do something
end
end
def parse_url href
r = CGI.parse URI.parse(href).query
r.each_pair { |k,v| r[k] = v.last }
end
def parse_anchor hp
self.parse_url hp.attributes['href'] unless hp.nil?
end
end
这将违反服务条款并可能违法。
其次,如果*的社区开始解决这些类型的网络刮的问题,那么你就知道...
不,这个剂量不违反TOS。是什么让你这么想的?对我来说,这是解析和排序数据的标准问题。你有这个问题吗? – Andrei 2010-09-01 19:08:02
@Andrei,你能提供论坛的网址吗? – shamittomar 2010-09-01 19:09:50
嗯...我会拒绝这样做。它开始看起来更邪恶吗? – Andrei 2010-09-01 19:14:47
http://superuser.com/questions/116201/how-can-i-download-an- whole-active-phpbb-forum – Andrei 2010-09-01 23:22:09
使用[offline Explorer](http://www.softpedia.com/get/Internet/Offline-Browsers/Offline-Explorer-Pro.shtml) – 2010-09-01 18:34:06
这是我的想法,但我会只喜欢有用的信息的SQLite数据库。 – Andrei 2010-09-01 19:02:32