彭小盛

又一个WordPress站点

callback回调与node爬虫技术-Web生态

callback回调与node爬虫技术-Web生态

回调=>一直都是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
比如这个url的p代表整个网站页面地址,只要改变p参数的值酷酷跑,就能访问下一个页面。
我们可以设计一个带回调函数的模块=>
function fn(page,callback)
callback用来解析页面,page用来传页面参数。每次解析页面使用cheerio模块拆分得到想要得到的数据,再把数据保存在数组中。
最后再做一个循环,有多少个page就循环多少次,每次循环把数据存在数组里面,并合并上面的数组。

得到的都是连接,你又可以通过连接来发送请求,并且得到数据,就是一个重复设计程序的过程。