首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

(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结构:

比如这个url的p代表整个网站页面地址,只要改变p参数的值,就能访问下一个页面。

我们可以设计一个带回调函数的模块=>

function fn(page,callback)

callback用来解析页面,page用来传页面参数。每次解析页面使用cheerio模块拆分得到想要得到的数据,再把数据保存在数组中。

最后再做一个循环,有多少个page就循环多少次,每次循环把数据存在数组里面,并合并上面的数组。

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209G0VIE500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券