callback回调与node爬虫技术
Posted Web生态
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了callback回调与node爬虫技术相关的知识,希望对你有一定的参考价值。
回调=>一直都是javascript中最为重要的一个模块,我们都知道js中很多函数都是异步完成的(比如ajax等),异步函数得到的值是无法共享到另一个函数中的。如果有一种方法能把这些函数封装起来,通过一个接口得到返回值,那就简单多了。
callback就提供这样的接口,把参数作为函数的接收口,你也可以把它理解为函数的出口。这样把出口数据传给主函数的参数,主函数的参数设置成一个函数,这个函数的参数再作为返回值,我们通常把这个参数称为行参。通过回调函数输出参数你就能得到返回值了。
网上看到一个很有趣的例子来解释什么是回调:
实例:
比如一个求和函数,我们要得到其值。
a>通常的写法:
function Fn(a,b){
return a+b;
}
使用的时候:
Fn(5,6); //11
b>采用回调函数的写法:
function Fn(a,b,callback){
let c;
c=a+b;
callback(c);
}
使用:
Fn(5,6,function(c){
console.log(c); //11
});
回调的优势:
主要体现的在封装,不让你的函数看起来很臃肿,你可以把你的函数写成一个一个的模块,这样你就可以把调用者和被调用者分开,不用过多的去关心被调用者。你现在使用大部分框架和模块思路都是使用回调的方式。
回调、异步、for循环折腾在一起的情况=>
回调函数本身就是一个异步事件,如果你把它镶嵌在一个for循环中,希望循环执行异步事件其实是行不通的,因为for循环是同步事件,异步事件必定排在同步之后。
我们来看一个函数:
function push(callback){
pArr=[];
for(let i=1;i<101;i++){
mod1(i,function(data){
pArr.push(data);
if(i>=100){
callback(pArr);
}
})
}
}
这里mod1是一个异步回调函数,传入第一个参数得到不同的数据,我们要把数据装入pArr,实际情况这时callback得到的值为空。因为for循环是优先执行的,执行完i的值早就等于100了,而这时异步才开始执行,所有pArr为空。
正确写法需要增加一个闭包,防止变量i的丢失=>
function push(callback){
let pArr=[];
for(let i=1;i<101;i++){
(function(num){
mod1(num,function(data){
pArr.push(data);
if(num>=100){
callback(pArr);
}
})
})(i); //这里的i传给了匿名函数的参数。
}
}
nodejs爬虫=>
首先我们来理解爬虫是什么=?
这里只是讲主要的爬虫思想,有了思想,很多难题你就可以迎刃而解。爬虫就是爬取别人网页的代码,通过代码得到你想要的资源或者数据。这个工作看似很简单,以为只要f12就可以做到,让一个网页的文章有上千篇或上万篇的时候你也靠人力吗?或者说你要得到上万个好友的个人资料。
当人力解决不了这个问题的时候,你就要把这些需求,设计成一个程序,这个程序可以反复的抓取数据,那就是爬虫了。
设计程序的思路:
nodejs提供了http接口,这个接口就是向url发送请求并响应数据。
http.get(url,callback);
这个函数可以把一张网页的代码都爬取下来,如果是https的网站必须使用https模块。
cheerio模块:提供jQuery方式的获取html页面中的元素,通过npm就能下载。
研究一个网页的url结构:
http://www.zcool.com.cn/?p=1#tab_anchor
我们可以设计一个带回调函数的模块=>
function fn(page,callback)
callback用来解析页面,page用来传页面参数。每次解析页面使用cheerio模块拆分得到想要得到的数据,再把数据保存在数组中。
最后再做一个循环,有多少个page就循环多少次,每次循环把数据存在数组里面,并合并上面的数组。
得到的都是连接,你又可以通过连接来发送请求,并且得到数据,就是一个重复设计程序的过程。
以上是关于callback回调与node爬虫技术的主要内容,如果未能解决你的问题,请参考以下文章