为什么选择用node来写爬虫?这是因为cheerio库完全兼容jQuery语法。如果你熟悉它,使用它真的很酷。取决于选择cheerio:Node.js版本的jQueryhttp:封装了一个HTTP服务器和一个简单的HTTP客户端乱码的初步实现既然要抓取网站的内容,首先要看一下网站的基本结构。我们选择了电影天堂作为目标网站,想要爬取所有最新电影的下载链接。分析页面的页面结构如下:我们可以看到每部电影的片名都在一个类为ulink的标签下面,再往上走,可以看到最外层的box类是co_content8ok,我们可以开始在职的。获取一页片名,首先引入依赖,并设置要抓取的urlvarcheerio=require('cheerio');varhttp=require('http');variconv=require('iconv-lite');varurl='http://www.ygdy8.net/html/gndy/dyzz/index.html';核心代码index.jshttp.get(url,function(sres){varchunks=[];sres.on('data',function(chunk){chunks.push(chunk);});//chunks存储html网页内容,传给cheerio.load后zhuanma//可以得到一个实现jQuery接口的变量,命名为`$`//剩下的就是jQuery内容sres.on('end',function(){vartitles=[];//因为我们发现这个网页的编码格式是gb2312,所以需要转码,否则会乱码//基于:""varhtml=iconv.decode(Buffer.concat(chunks),'gb2312');var$=cheerio.load(html,{decodeEntities:false});$('.co_content8.ulink').each(function(idx,element){var$element=$(element);titles.push({title:$element.text()})})console.log(标题);});});运行nodeindex结果如下成功获取到电影的片名,那如果我想获取多个页面的片名怎么办,不可能一个一个的改url。当然有办法,请继续阅读!获取多页片名,我们只需要将前面的代码封装成一个函数,递归执行即可完成核心代码index.jsvarindex=1;//页码控制varurl='http://www.ygdy8.net/html/gndy/dyzz/list_23_';vartitles=[];//用于保存标题functiongetTitle(url,i){console.log("获取页面内容"+i+"");http.get(url+i+'.html',function(sres){varchunks=[];sres.on('data',function(chunk){chunks.push(chunk);});sres.on('end',function(){varhtml=iconv.decode(Buffer.concat(chunks),'gb2312');var$=cheerio.load(html,{decodeEntities:false});$('.co_content8.ulink').each(function(idx,element){var$element=$(element);titles.push({title:$element.text()})})if(i<2){//只抓取二为了方便PagegetTitle(url,++index);//递归执行,页码+1}else{console.log(titles);console.log("Titleisgetting!");}});});}functionmain(){console.log("开始爬行");getTitle(url,index);}main();//main函数运行结果如下获取电影下载链接那么如果是手动操作的话,我们需要一个操作,点击电影详情页可以找到下载地址。怎么通过node实现呢?按照惯例,我们首先分析页面布局。如果我们要准确定位下载链接,首先需要找到id。Zoom的div,下载链接在这个div下tr下的a标签里然后我们再定义一个获取下载链接的函数getBtLink()functiongetBtLink(urls,n){//urls中包含所有详情页的地址http.get('http://www.ygdy8.net'+urls[n].title,function(sres){varchunks=[];sres.on('data',function(chunk){chunks.push(chunk);});sres.on('end',function(){varhtml=iconv.decode(Buffer.concat(chunks),'gb2312');//转码var$=cheerio.load(html,{decodeEntities:false});$('#Zoomtd').children('a').each(function(idx,element){var$element=$(element);btLink.push({bt:$element.attr('href')})})if(n