// 模塊導入 var express = require('express');//導入express 模塊 // const utility = require('utility');//提供了不少經常使用且比較雜的輔助方法,如 utility.md5() md5算法,用來加密 var eventproxy = require('eventproxy'); var superagent = require('superagent');//是個 http 方面的庫,能夠發起 get 或 post 請求。 var cheerio = require('cheerio'); //Node.js 版的 jquery,用來從網頁中以 css selector 取數據,使用方式跟 jquery 同樣同樣的。 var url = require("url"); //node.js自帶 var app = express();//建立一個express實例 這樣app上就有express中的各類方法了。如 get post put delete app.get('/',function(req,res){ superagent.get('https://cnodejs.org/').end(function(error,sres){ if(error){ return next(error); } // sres.text 存放着爬取的html內容 var $ = cheerio.load(sres.text);//將它傳給 cheerio.load 以後 就能夠獲得一個實現了 jquery 接口的變量,咱們習慣性地將它命名爲 `$` var jsonObj = []; var urlList = []; var baseUrl = "https://cnodejs.org/"; $('#topic_list .cell').each(function(index,item){ item = $(item); var name = item.find('.user_avatar img').attr('title') var href = item.find(".topic_title").attr("href"); var title = item.find(".topic_title").attr("title"); href = url.resolve(baseUrl,href);//拼接完整的url地址 urlList.push(href); }) var eq = new eventproxy(); eq.after('myEvent',urlList.length,function(data){ //data是一個數組,當eq 監聽的全部myEvent事件都完成了後開始往下走↓↓,這個時候data已是一個把每次事件執行完後傳遞過來的數據拼接好的數組,因此 這個after 至關於一個計數器,記數次數爲第二個參數 // res.send(data); data = data.map(function(item){ var $ = cheerio.load(item);//把返回的數據變成能夠用選擇器選擇的對象 return { title: $('.topic_full_title').text().trim(),//獲取title comment1: $('.reply_content').eq(0).text().trim() //獲取內容 } }) res.send(data); }); urlList.forEach(function(items){ superagent.get(items).end(function(err,res){ // console.log(res); eq.emit('myEvent',res.body)//告訴eq myEvent 事件作完了,而且把sres.text傳遞過去。 }) }) }) }) // 監聽端口 app.listen(3000,function(){ console.log('成功'); })
爬蟲爬一下。css