node.js網頁爬蟲

來源:互聯網
上載者:User

標籤:

 

使用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網頁爬蟲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.