天青色等烟雨,而我在等你。

Node.js 和 express.js初体验

因为前几天有位朋友分手了,要删掉人人网的所有状态.看他在那一条一条点来点去挺麻烦的,何不写个脚本来自动删呢.于是便有了本文.

其实脚本不难写,因为3g.renren.com的登录验证是不麻烦的.返回的html结构也不复杂,请求过程也都很直白,用python的话应该不是什么难题.可是既然node最近这么火,就正好借机会试一下吧.嘿嘿^^.

跟复习专业课一样,学一种新的工具流程也都差不多.无非是:

  1. 简单google一下,了解个大概(如果要是专业课复习,就是看一遍目录);

  2. 如果手册有Overview之类的什么东西抄一份(看一遍例题);

  3. 开始写,过程中多翻手册,如果不赶时间,最后把手册粗略的过一遍,做到对工具支持的特性心中有数(做题,看书,记公式);

  4. 重复3.

唉写到这里又不免感叹我这个学渣的悲哀TT,可是无论如何,既然生命要继续,我还是要把东西写完.

Node是什么我就不抄百科了.Express就是Node平台下面的一个web框架.对应起来就像Tornado是Python的一个web框架一样.但又不完全等价:因为Python是一门语言,而Node是一个平台,跑的是喜闻乐见的JavaScript语言,用的Google的V8引擎.

因为Node是以异步出名的,所以刚开始上手的时候真是有点不习惯.比如从数据库读一个User,然后渲染到前台.如果是在python里面,只要依次执行两个函数就好了.可是到这里,我前台页面都渲染完了,控制台显示User还没读出来(当然是夸张了,不过应该是这个道理).没错,要用回调的方式来解决了.至于具体的解决方案和手册教程,网上的前辈们早已总结好了.随便一搜就搜得到.

对Node大概有个了解之后,就开始之前提到的那个脚本.这里采用了Express.js+jsdom+request三个库来处理,除了jsdom这个库有memory leak的bug之外,这个bug我要mark一下,因为当时是部署到heroku的,采集状态不一会程序就crash了- =.log里面显示的是定位到jsdom那一行内存不足了(开始完全想不到会是这个库的问题,以为Node的性能好差啊,随便写个类爬虫应用就内存不足),后来网上搜了搜,好多人有同样的问题,就是要在jsdom的任务执行完毕之后用window.close()来关掉对应的env(其实看起来也不算是bug了,使用不得当而已),其他过程都问题不大,按照手册按部就班把这个小应用写了出来.放到了鄙人的github上面了.

不过还是遗留了一个问题就是:目前的状态采集和处理操作是顺序执行的(这个专业词叫什么来着我给搞忘记了),也就是说目前,在采集的时候,程序是阻塞掉的,不能同时删除.也是网上简单搜了一下,因为node的是异步执行的所以不用多线程的概念还是怎么回事.反正要把采集和处理能够并行执行才好,不知道node在这个问题上一般是怎么处理.改天再研究一下好了.记得好像是可以用setTimeout来避免主线程被阻塞掉的,但是setTimeout的原理看过又给搞忘记了,改天再翻下书好了.

嗯嗯就这样了要睡觉去了好困啊…

comments powered by Disqus