今天就用Node.js来做一个爬虫小项目吧。爬虫目标:http://songshuhui.net/(科学松鼠会)我们需要创建一个文件夹,自己命名即可,然后在文件夹下分别创建两个文件夹,命名为data和img,进入这个通用的目录终端文件夹。在终端输入npminit创建一个package.json配置文件,根据自己的实际情况填写,或者一路回车。再次输入npminstallcheeriorequest--save,会下载cheerio(用法和Jquery差不多),request依赖包。在general文件夹下创建index.js来编写我们的主要逻辑代码。下面是代码varhttp=require('http');varfs=require('fs');varcheerio=require('cheerio');varrequest=require('request');vari=0;varurl="http://songshuhui.net/archives/96881";//初始化地址函数fetchPage(x){startFetch(x);}//封装函数functionstartFetch(x){//使用http模块初始化服务器Aget请求http.get(x,function(res){varhtml="";//用来存储整个页面的html内容res.setEncoding("utf-8");//防止中文乱码res.on('data',function(chunk){html+=chunk;});//监听data事件,每次取一条数据res.on('end',function(){var$=cheerio.load(html);//使用cheerio模块解析htmlvarauthor=$(".metax_singlea:first-child").text().trim();//获取文章作者vartitle=$(".atrctitle.contenttitlea").text().trim();//获取文章标题varlink=$(".atrctitle.contenttitlea").attr("href");//获取文章网址varnew_item={title:标题,Author:作者,Link:链接,i:i=i+1//用于判断获取了多少篇文章};控制台日志(新项目);savedContent($,title);//保存文章的文字内容savedImg($,title);//保存文章的图片内容varnextLink=$(".navilinks.prevlinka").attr("href");varstr=encodeURI(nextLink);如果(我<=500){fetchPage(str);}//通过控制i号来控制抓取的文章});//监听结束事件,如果获取到整个网页内容,则执行回调函数}).on('error',function(err){console.log(err);});}functionsavedContent($,title){$(".entryp").each(function(index,item){varx=$(this).text();x=x+"\n";fs.appendFile("./data/"+title+".txt",x,"utf-8",function(err){if(err){console.log(err);}});});}//本地存储爬取文字资源functionsavedImg($,title){$(".entry.wp-captionimg").each(function(index,item){varimg_title=$(this).attr("alt");varimg_filename=img_title+".jpg";varimg_src=$(this).attr("src");request.head(img_src,function(err,res,body){if(err){console.log(err);}});请求(img_src).pipe(fs.createWriteStream("./img/"+title+"--"+img_filename));//使用request模块向服务器发起请求获取图片资源});}//将抓取到的图片资源存储在本地fetchPage(url);代码部分完成,在webstorm上运行index.js文件,直接选择index.js,点击右上角绿色三角按钮选择网址,分析网站源码,每篇文章都有上一篇或者next页面内容,这样我们就可以串联获取dom节点的不同url,这样就可以获取到每个url的内容了。控制台的输出是获取图片,获取文章爬虫成功!
