先前有用php写过小爬虫,其实本质就是获取到网页中的Dom结构,然后分析里面的元素,提取出自己想要的东西。最近想找东西练练node,就想到用node做小爬虫。去看了看慕课网scott老师讲的。感觉很棒,学到了不少东西。自己跟着做了一篇,爬了下慕课网的课程。明天准备再去写一个脚本爬自己博客。下面是学到东西的总结。感谢scott老师。
包模块的选择
这里除了http核心模块外,还用到了bluebird和cheerio,这两个模块。bluebird封装了promise,可以异步来调用。cheerio则是可以让我们更方便的操作Dom,就可以像jquery一样来操作Dom。我们的目的是,分析dom结构,然后操作dom节点,获取我们想要的,并且拼接成下面的数组:
1 | var coursesData = { |
直接上代码
1 | var http = require('http') |
中间收获
用request发起请求
如何用node伪造一个请求。比如就在本地提交评论到慕课网?
注意这里的headers可以直接先去评论一个,去看看请求headers,然后复制过来就可以啦。
中间有个错误。querystring都是小写。虽然官方文档介绍它的时候是queryString。这个地方要注意了。然后可以用request方法发起一个请求。然后最后把数据post过去就可以了。Cookie那个地方要用本地cookie.
1 | var http = require('http') |
这中间又出了个错,就是content-length
和post
过去的数据长度不一致。导致socket hang up
解决方法就是改长度啦。
关于promise
promise的话,node新版本是已经当成核心模块了。但是如果是旧版本就可以用bluebird这些东西。然后再看看promise有哪里好。代码或许可以解释好多。下面是三个小球。我们让他们一个接着一个产生动画。
看下dom结构:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<style>
.box{
width:30px;
height:30px;
-webkit-border-radius:50%;
-moz-border-radius:50%;
border-radius:50%;
}
.box1{
background:red;
}
.box2{
background:yellow;
}
.box3{
background:blue;
}
</style>
<div class="box box1" style="margin-left:0px"></div>
<div class="box box2" style="margin-left:0px"></div>
<div class="box box3" style="margin-left:0px"></div>
没用promise之前,callback嵌套。
1 | <script src="node_modules/bluebird/js/browser/bluebird.js"></script> |
用了promise后,也是异步调用,但是确实同步编写。是不是看着很好?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51<!DOCTYPE html>
<script src="node_modules/bluebird/js/browser/bluebird.js"></script>
<script>
var box1 = document.querySelector(".box1");
var box2 = document.querySelector(".box2");
var box3 = document.querySelector(".box3");
var Promise = window.Promise;
function promiseAnimate(ball,distance){
return new Promise(function(resolve,reject){
function _animate(){
setTimeout(function(){
var marginLeft = parseInt(ball.style.marginLeft,10);
if(marginLeft === distance){
resolve();
}else{
if(marginLeft<distance){
marginLeft++;
}else{
marginLeft--;
}
ball.style.marginLeft = marginLeft + "px";
_animate();
}
},5)
}
_animate();
})
}
promiseAnimate(box1,100)
.then(function(){
return promiseAnimate(box2,200);
})
.then(function(){
return promiseAnimate(box3,300);
})
.then(function(){
return promiseAnimate(box3,150);
})
.then(function(){
return promiseAnimate(box2,150);
})
.then(function(){
return promiseAnimate(box1,150);
});
</script>
官网上关于promise有个例子,里面我看到了这个insertAdjacentHTML
,觉得好棒。大部分浏览器都支持了。
1 | <script> |
总结
觉得学到挺多东西的。其实感觉node不知道怎么入手,书也不知道看啥好,有点迷茫。有看一些node书,感觉大部分都是讲语法和API,还是多做点东西,实践中学习,心里稍微踏实点。再次谢谢scott老师。