標籤:
使用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); })*/
node.js網頁爬蟲