首页 > 代码库 > node.js网页爬虫

node.js网页爬虫

 

使用node开发一个小工具,扫描分子反应动力国家重点实验室新闻动态列表页前三页的信息(地址如下:http://www.sklmr.dicp.ac.cn/list.php?tid=1要求打印出新闻名称,链接地址,发布时间。

例如在控制台打印

韩克利入选2016年度“中国科学院特聘研究员”计划 2016-06-14     http://www.sklmr.dicp.ac.cn/show.php?id=521

我室金属表面解离吸附动力学理论研究取得新进展    2016-06-12   http://www.sklmr.dicp.ac.cn/show.php?id=520

张大煜讲座第21:加州理工学院William A. Goddard III教授 2016-05-04   http://www.sklmr.dicp.ac.cn/show.php?id=519

 





/*
* *设计 *第一种:抓取一页打印一页。 *第二种:把三页全部抓取完后,存到数组中,统一打印。 *第一种方式较高效。使用第一种方式。 */ /** *思路: *1.抓取网站html内容。 *2.获取抓取的html的必要内容。 *3.把获取内容存到数组。 *4.把数组内容输到控制台。 */ var http = require(http); //引入nodejs的http模块,该模块用于构建http服务和作为HttpClient使用。 var cheerio = require(cheerio); //可以理解为服务端的Jquery。使用方法和客户端一样。 //var promise = require(‘promise‘); //对异步编程进行流程控制,更加符合后端程序员的编程习惯。 //var url = ‘http://www.sklmr.dicp.ac.cn/list.php?tid=1‘; //要抓取的网址,后面有拼接。 //抓取每一个节点的信息 function filterChapters(html){ var $ = cheerio.load(html); //把HTML内容解析成DOM对象 并且可以像jquery css选择器查询那样对这个DOM进行筛选 var articleList = $(td.text).find(tr); var articleArr = []; articleList.each(function() { var curEle = $(this); var title = curEle.find(a.title10).text().replace(/\s*\r\n\s*/g,""); //获取文章标题 var time = curEle.find(td.title11).text().replace(/\s*\r\n\s*/g,""); //获取文章时间 var href = http://www.mamicode.com/"http://www.sklmr.dicp.ac.cn/"+curEle.find(a.title10).attr(href); //获取文章链接 if( title!=null&&title!="") //有点小困难。因为DOM数据和直线是同一个等级,并且直线只有属性没有id。所以必须去除直线里面的tr空数据,否则会打印一部分空数据和错误信息。 articleArr.push({ title:title, time:time, href:href }); }) return articleArr; } //在控制台打印信息 function printCourseInfo(courseData){ courseData.forEach(function(item){ var chapterTitle = item.title; var chaptertime = item.time; var chapterhref =http://www.mamicode.com/ item.href; console.log(chapterTitle+"\t"+chaptertime+"\t"+chapterhref+"\n"); }); } //可以异步下载任意的URL (通过 HTTP GET方法),在完成下载的时候,它会调用回调函数并把下载的内容当做参数传进去,并将其内容输出到控制台。 function getPageList(url){ http.get(url, function(res) { var html = ‘‘ res.on(data, function(data) { res.setEncoding(utf8); //设置buffer字符集 html += data; //拼接buffer }) res.on(end, function() { // 将抓取的内容进行处理 var courseData=http://www.mamicode.com/ filterChapters(html); printCourseInfo(courseData); }) }).on(error, function(err) { console.log(错误信息: + err) }) } //或者请求前3页的数据。 list = [http://www.sklmr.dicp.ac.cn/list.php?tid=1,http://www.sklmr.dicp.ac.cn/list.php?tid=1&page=20,http://www.sklmr.dicp.ac.cn/list.php?tid=1&page=40]; for(var i=0;i<3;i++) { var url =list[i]; getPageList(url); } /* 或者请求前3页的数据。tid=1,tid=1&page=20,tid=1&page=40,tid=1&page=60.....这样的规律可以拼接url。 var list = []; for(var i=0;i<=40;i+20) { var url = url+page=i; list.push(getPageList(url)); } //调用Promise的下面的all方法。参数是一个事件集合。 //Promise将会进行异步执行。但是最后的返回时机要根据最耗时的那个请求为标准。 //then(),可以接受两个参数(callback).第一个参数是成功(resolved)的回调。 //第二个参数是执行上个操作失败(rejected)的回调。 Promise .all(aa) .then(function(data) { console.dir(data); }) */

 

node.js网页爬虫