博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node.js网页爬虫
阅读量:6694 次
发布时间:2019-06-25

本文共 3290 字,大约阅读时间需要 10 分钟。

 

使用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.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 = 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= 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);    })*/

 

转载于:https://www.cnblogs.com/userOS/p/5980621.html

你可能感兴趣的文章
WinDbg内核调试命令
查看>>
React文档(十七)非受控组件
查看>>
python中的metaclass
查看>>
大白叔叔专题之匹配、网络流(二)(第一题不是呐~)
查看>>
在centos中使用rpm安装包安装jenkins
查看>>
Linux释放内存空间
查看>>
利用ASP.NET DataGrid显示主次关系的数据
查看>>
关于CachedRowSetImpl类
查看>>
Typora – Markdown 简介
查看>>
qt 免注册下载
查看>>
一致性hash算法实现(伪码)
查看>>
Leetcode 215. Kth Largest Element in an Array
查看>>
AutoLayout--masonry使用
查看>>
C++学习-10
查看>>
操作系统与c语言
查看>>
frame和iframe区别
查看>>
PHP验证码无法显示
查看>>
k8s/02中文文档学习笔记
查看>>
网站平台架构演变史(三) - 数据库表的查询优化
查看>>
步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
查看>>