备份微博通常调用新浪微博提供的API就可以了,但是我并不关注文本数据,更需要得到一条微博原原本本的显示内容,就像archive.org对网站进行备份一样,可以将微博截图快照下来。

对于网页快照,可以使用PhantomJS进行截图。PhantomJS是一个支持JavaScript API的无界面、运行于服务端的WebKit环境(Headless WebKit with JavaScript API),Headless这里的意思是渲染页面在后台完成。PhantomJS可以用来进行前端自动化测试、网络状况监控、网页渲染后自动截图等。但是微博快照和网页快照不同,微博快照在网页渲染后,只是截取页面上指定的区域(DOM),依赖于PhantomJS的CasperJS提供了更强大的函数封装、方法和语法糖,可以完成定义排序浏览器导航步骤、填充提交表单、点击跟踪链接、指定DOM元素区域截图等任务,当然也可以实现备份微博。

首先使用CasperJS模拟用户登陆微博过程,填写用户名密码并提交表单。

var casper = require("casper").create();
casper.start('http://www.weibo.com/login.php', function() {
    this.fill('div[class="W_login"]', {'loginname':'YOURUSERNAME'}, false);
    this.fill('div[class="W_login"]', {'password':'YOURPASSWORD'}, false);
    this.click('a[class="W_btn_d"]');
});

用CasperJS给页面上指定的区域(DOM)截图非常简单:调用captureSelector,给页面中'.WB_feed_type'选择器匹配的元素截图,输出的文件名为微博的mid号。

casper.thenOpen('http://weibo.com/u/UID',function() {
    mid=this.getElementAttribute(".WB_feed_type", "mid");
    this.captureSelector(mid+'.png',".WB_feed_type");
});

最后获得的微博截图效果如下,加入cron定时任务就能自动备份。现在个人微博首页只显示5条最新微博,可以每次将5条微博全部备份,同时设定合理的更新间隔时间,可以避免只备份最新微博但是在更新间隔时间里新增了多条微博的问题。类似的,稍加改动还可以应用于备份twitter豆瓣的timeline。

weibo_capture