nodejs抓取动态网页(使用node开发一个小工具,扫描分子反应动力(图) )
优采云 发布时间: 2021-10-27 12:00nodejs抓取动态网页(使用node开发一个小工具,扫描分子反应动力(图)
)
使用node开发一个小工具,扫描分子反应动力学国家重点实验室新闻列表页面的前三页(地址如下:)。需要打印新闻名称、链接地址和发布时间。
比如在控制台打印
韩克力入选2016年度“中国科学院特聘研究员”2016-06-14
我室金属表面解离和吸附动力学理论研究取得新进展2016-06-12
张大宇讲座第21期:加州理工学院William A. Goddard III教授2016-05-04
<p><br /><br /><br /><br />/**
*设计
*第一种:抓取一页打印一页。
*第二种:把三页全部抓取完后,存到数组中,统一打印。
*第一种方式较高效。使用第一种方式。
*/
/**
*思路:
*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