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爬虫技术的主要内容,如果未能解决你的问题,请参考以下文章

node爬虫实践总结

php爬虫原型

反爬虫技术与“反”反爬虫技术

Node.js——NodeJs中的Promise

网络爬虫技术入门_Python基础与爬虫技术

爬虫技术的善恶与反爬虫技术