alwaystest / Blog

24 stars 2 forks source link

NodeJS #13

Open alwaystest opened 8 years ago

alwaystest commented 8 years ago

NodeJS

标签(空格分隔): NodeJS


NodeJS入门参考

使用NodeJS写爬虫,为了解决登录问题,费了一些时间。

首先使用浏览器监听登录的网络请求,查看POST发送的数据。现在好多网站在登录之前都喜欢用JS先处理一下数据,比如添加一些隐藏字段,MD5加密等等,可以在浏览器的控制台直接键入点击事件调用的方法的名字,会返回方法所在的文件及行数,可以快速找到方法所在的位置,目前还没有仔细钻研JS函数的作用域问题。

这么一来发送的数据和接口就一目了然了。接下来就是比较麻烦的地方了,网站存储用户session数据基本都是使用cookie的,要想实现登录之后继续干点别的坏事,就必须把cookie存储下来,下次请求的时候发送出去。

我使用的是一个叫Superagent的model来做网络请求的,因为之前抄的别人的代码做爬虫就是用的Superagent,设置请求头,post和get数据方法直接看源码介绍。对cookie的处理,我找到这么一个说法StackOverflow。答案里面的Readme链接已经失效,目前最新的Readme文档里面没有这条说明,但是在SuperAgent的agency.js测试里面却有这么一个用法,使用superagent.agent()对象先去访问一次setcookie的链接,然后在使用同一个对象去访问getcookie的链接,很明显cookie是被保留的,这里就解决了cookie的办法,但是看评论里面这么处理cookie好像是有问题的,但是目前我还没有遇到,那么就先这么用吧。

根据这里,request模块有内建的cookie处理,所以下一步可能使用request来做爬虫。目前还没有实践。


使用BlueBird来处理JS的回调问题。使用BlueBird的promisify方法是需要被promisify的方法有一个cb函数来做参数的,cb函数调用的地方,就是then里面定义的函数执行的地方。

指定函数执行顺序

参考:http://www.html5rocks.com/zh/tutorials/es6/promises/

当你从“then”的回调函数返回的时候,这里有点小魔法。如果你返回一个值,它就会被传给下一个“then”的回调;而如果你返回一个“类 Promise”的对象,则下一个“then”就会等待这个 Promise 明确结束(成功/失败)才会执行。

有一个需求,要求先使用帐号登录,带着cookie做一系列操作,然后注销。这里需要按照顺序执行。之前使用Promise,then方法里面返回的是数据,导致注销和一系列操作同时执行了,即使方法是

login()
.then(doSth)
.then(logOut)

这里需要doSth方法返回一个类Promise对象,才能保证louOut是在执行完一系列操作之后才执行的。


使用livepool全局代理来监听 http请求,本来是想监听nodejs发起的post究竟传了什么参数,但是发现nodejs的请求并没有走livepool的代理。不知道是OS X的 连接里面是怎么定义这个代理的,设置了以后是系统级别全局代理还是别的情况。

另外在使用livepool的时候需要注意,他默认的设置代理的shell是针对一个名字叫WI-FI的网络连接来设置的,要么改脚本,要么改连接的名字,才能生效。脚本里面还有一句话是用来获取sudo时的密码的,反正我的机器是获取不到,我手动指定的。

阿里也开发了这么一套东西, 还没有试,有机会试试。


使用cheerio 来以jQuery的方式解析HTML。

12306火车时刻表的爬虫爬第三方网页上的时刻表,获取$('#table tbody td:nth-child(2)')没有获取到值,而$('#table td:nth-child(2)')可以获取到,但是连thead里面的数据也获取到了,待研究。