摘要:本文记录了我尝试开发logstash插件的愉(艰)快(辛)过程
背景
有很多大V的微博很有营养,比如agenzh的微博有很多关于技术方面的和程序员邹欣有很多关于软件工程的,值得反复玩味。但是微博是按timeline形式排列的,非常不方便非线性查看。agentzh的code2ebook给我启发,可不可以把感兴趣大V的微博做成电子书?
规划
首先想到的是写爬虫,然后模拟翻页操作,抓取全部微博。这种方式当然行得通,我也很熟练。刚好最近在看ELK,按照邹欣老师Build To Learn的原则,用ELK来收集分析也挺不错的,顺便练练手。logstash定期获取更新的微博,写入elasticsearch,除了可以导出生成电子书外,还可以在kibana做可视化分析。例如分析下大V们发微博的时间分布来分析下其作息习惯。根据词频来对大V进行分类,agenzh的openresty词频肯定很高。
logstash input plugin
logstash自带了很多input plugin,比如抓取twitter。但是没有微博的,想想自己能贡献一个微博的plugin还是挺激动的。于是开始学习怎么写input plugin。第一反应是模仿twitter这个插件写,首先使用下面的命令生成一份plugin模板。
bin/logstash-plugin generate --type input --name weibo --path ~/elastic/plugins
得到如下图的目录结构
可以看到weibo.rb是需要我们自己修改的。
其中重点在run这个method中:
1.创建一个event对象
2.修饰event对象
3.加入queue
logstash的Excution Model解释说,input plugin跑在单独线程中,我们只需要往queue里插入event中就行了,至于如何发送到elasticsearch就不用管了。
然而logstash-input-twitter的结构有点不一样。
猜测有两个原因:
第一,这是个streaming api,跟restful api不一样
第二,这个plugin写得比较早,新版本推荐写法不一样。
流程其实不复杂,所以也就不用参照了,直接自己写就是了。
1.发送request抓取更新的微博
2.根据抓取结果创建event对象
3.插入queue
到目前为止还是比较愉快的,接下来就有点闹心了。
Weibo API
抓取更新的微博有两种方法,第一就是爬虫,第二是通过微博官方的API。总是野路子不太好,所以决定尝试下通过官方的API抓取。然后我的噩梦就开始了,查看api文档,找到了以下api。
恶心的地方就在需要登录授权,充分体现了微博是面向企业收费的网站,对个人开发者极其不友好,不提供(或者是我没找到)个人访问的token。看看github这个同性交友网站是多么的人性化,直接提供了个人访问的token。
于是为了获得我自己的token。我还需要像开发第三方应用一样,使用另一个获取token的API。还好微博提供了SDK,可以直接拿来用。
本以为直接这样就能用了,结果还需要一个申请一个应用,填写AppKey和重定向url。
没开发过微博第三方应用,完全搞不懂这个重定向url是干什么的。于是我随手填了www.baidu.com,顺便申请了应用。
反复确认了几次之后,意识到可能是应用未审核的问题。到这个时候我真想放弃了,直接爬得了。可是沉没成本以及投入那么多了,还是继续吧。
然后这个审核界面死活提交不了证件图片,我尝试了用Chrome,Firefox,IE都没成功。这时候我的内心是万马奔腾的。idea产生就在一瞬间,框架规划也没花多长时间,最后在这个微博API的使用上耗了一下午,还没搞定。虽然不太可能,还是呼吁下微博开放个人访问token。
未完待续......