• 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* s*/g,""); //获取文章标题 var time = curEle.find('td.title11').text().replace(/s* 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+" "+chaptertime+" "+chapterhref+" "); }); } //可以异步下载任意的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); }) */
  • 相关阅读:
    C++实现二叉树的相应操作
    C++对文件的操作
    C++与C的区别二
    C++多线程编程二
    C++多线程编程一
    C语言多线程编程二
    C语言多线程编程一
    HTML练习(三)
    磁盘/内存模式查询数据
    RestTemplate使用不当引发的问题分析
  • 原文地址:https://www.cnblogs.com/userOS/p/5980621.html
Copyright © 2020-2023  润新知