给论坛建了个镜像

chromaso:给论坛建了个镜像
我给这个论坛建了一个镜像:
https://mirror.chromaso.net/

动机在于解决以下问题:
  1. 最近论坛服务器不稳定,常常报出 503 Service Unavailable 错误。如果直接从镜像阅读的话,就可以避免被这种错误所打扰。
  2. 论坛没有方便的「只看该作者的回帖」的功能,导致在小说区找到原文比较费力。所以镜像中添加了这个功能。
  3. 论坛中繁体中文和简体中文混杂,降低了阅读体验。于是镜像中添加了繁简转换的选项。

为保持社区的私密性,防止镜像被滥用,第一次访问镜像时,必须是从此处点击链接跳过去;此后,就可以直接从浏览器里打开了。(这个设定已经去掉了)

前端的代码放在 https://gitlab.com/chromaso/mazochina-mirror-serve 了,而爬虫端的代码放在 https://gitlab.com/chromaso/mazochina-mirror-crawl 了,欢迎提 merge request……

有什么功能或界面上的建议或者 feature request 的话,也可以直接在这里回复……
dajiezzk:Re: 给论坛建了个镜像
厉。。。。。厉害了
skylancelot:Re: 给论坛建了个镜像
这个可以!!!
zj425:Re: 给论坛建了个镜像
你也太伟大了把!!!
svciga:Re: 给论坛建了个镜像
nice!lz大神啊!不仅能写长篇,还能做这些啊,好厉害!
caoyu:Re: 给论坛建了个镜像
大神!!!膜拜!!!!
templar:Re: 给论坛建了个镜像
哇。。。dalao 我以后也要成为这么厉害的程序员
707:Re: 给论坛建了个镜像
大佬是技术牛人啊,我有几个问题想请教下:
请问多久会同步一次论坛数据呢?
回复帖子还是跳转到原论坛吗?
是自己买的服务器还是公用的资源?

镜像站比原站快多了啊,简体字也够大,看起来很舒服,期待论坛管理员把网站迁到楼主的服务器上啊,到时给楼主点维护费帮忙运维就好
chromaso:Re: 给论坛建了个镜像
"707":大佬是技术牛人啊,我有几个问题想请教下:
请问多久会同步一次论坛数据呢?
回复帖子还是跳转到原论坛吗?
是自己买的服务器还是公用的资源?

镜像站比原站快多了啊,简体字也够大,看起来很舒服,期待论坛管理员把网站迁到楼主的服务器上啊,到时给楼主点维护费帮忙运维就好
同步论坛数据的算法比较复杂。简单来说是直接用爬虫来抓网页,但是为了减少对源站服务器的压力,我尽量只做最低限度的抓取。策略大体来说是这样的:
1. 每两分钟抓取一次论坛首页,然后对比论坛首页上每个板块的最近发表时间,对于最近发表时间比镜像里要新的板块,将该板块标记为 dirty;
2. 抓取每个 ditry 板块的列表页,然后对比每个主题的最新更新时间,对于最近发表时间比镜像里要新的主题(或者是镜像里不存在的主题),将该主题标记为 dirty;如果列表页第一页的所有帖子的最近发表时间都比镜像里要新,那就再往后爬一页,直到遇到最新发表时间比镜像里要旧的帖子为止;(因此,避免了不必要的板块列表页抓取)
3. 对于每个 dirty 的帖子,抓取第一页(因为有时候第一页会被楼主编辑),然后直接跳到之前抓取过的最后一页,从那页开始往后爬,直到到达末页;(因此,避免了不必要的主题内容页抓取)

然后为了避免在高峰时段对源站服务器造成压力,会有一个全局的 throttle,一旦发现源站 503 等错误,直接暂停整个爬虫,过一会儿再重新开启;而如果开启后立刻又遇到 503 等错误,会再次暂停,并且这次暂停的时间会是第一次的 4 倍;以此类推,第 N 次连续遇到 503 等错误后,暂停的时间会是第 N-1 次连续遇到 503 等错误时的 4 倍。

考虑到论坛里发帖频率并不是非常高。因此,在非高峰时段,99% 以上的帖子应该能在发布后的两分半钟内被同步到镜像中;在高峰时段考虑到触发 throttle,应该能做到 95% 的帖子在五分钟内被同步到镜像中。

当然,实际上为了处理子板块、置顶帖、被删除帖、被移动至另一板块的帖子等 edge case,逻辑比这里说的要复杂很多,但是大体来说的逻辑是这样的。

因为镜像站是只可能读取源站的帖子,不可能对原论坛进行写入(除非用户愿意把源站的用户名和密码提供给镜像站),所以任何写入操作都只能指引用户跳转回源站操作。

服务器是 DigitalOcean 最便宜的一款 VPS 啦。
百香果:Re: 给论坛建了个镜像
高手 !
kokiwolf:Re: 给论坛建了个镜像
看楼主的文就能知道楼主必须是个扎实的技术M
百香果:Re: 给论坛建了个镜像
"deltat":我给这个论坛建了一个镜像:
为保持社区的私密性,防止镜像被滥用,第一次访问镜像时,必须是从此处点击链接跳过去;此后,就可以直接从浏览器里打开 http://mirror.chromaso.net/ 了。
好奇怎麼做的... 雖然大概猜到是cookies
但具體就抓瞎了.........
而且我用Chrome的私密無痕瀏覽也是從這連過去就可以了
好奇
chromaso:Re: 给论坛建了个镜像
"百香果":
"deltat":我给这个论坛建了一个镜像:
为保持社区的私密性,防止镜像被滥用,第一次访问镜像时,必须是从此处点击链接跳过去;此后,就可以直接从浏览器里打开 http://mirror.chromaso.net/ 了。
好奇怎麼做的... 雖然大概猜到是cookies
但具體就抓瞎了.........
而且我用Chrome的私密無痕瀏覽也是從這連過去就可以了
好奇
噢噢这个的话你看我代码 index.js 第 25 - 32 行就是啦
百香果:Re: 给论坛建了个镜像
"deltat":
"百香果":好奇怎麼做的... 雖然大概猜到是cookies
但具體就抓瞎了.........
而且我用Chrome的私密無痕瀏覽也是從這連過去就可以了
好奇
噢噢这个的话你看我代码 index.js 第 25 - 32 行就是啦


謝謝
不過不太懂JAVA 哈哈哈
只會基本的HTML, 頂多做一些自己方便連結的私人頁面
之前是把http://mirror.chromaso.net/ 連結放到自己的html,
想說看文章的時候可以直接連, 結果連不上才好奇

像這樣的html :


另外DO的服務有時候會有一些優惠, 可以Google看看
chromaso:Re: 给论坛建了个镜像
今天给镜像加上了标题搜索功能,并且是考虑了繁简转换的(i.e. 搜索「机车」可以同时匹配到「機車」、「機车」、「机車」等各种繁简组合)。

不过目前只是搜索标题,没有加正文搜索。
707:Re: 给论坛建了个镜像
0
dajiezzk:Re: 给论坛建了个镜像
楼主做一个这样的项目用了多久啊,表示好奇
lshldhs:Re: 给论坛建了个镜像
赞美楼主!
Wangufo505:Re: 给论坛建了个镜像
不如用nodebb重新做一个吧XD
Wangufo505:Re: 给论坛建了个镜像
太厉害了!