本項目github地址:https://github.com/janyin/dou...
若是須要,能夠clone到本地css
$ npm install --save
$ node app
打開http://localhost:3030/index.html 可直接查看爬蟲數據html
爬取鬥魚正在直播的主播數據(房間號,在線人數,房間標題,主播名稱,直播分類等等)前端
安裝npm包express+superagent+cheerionode
$ npm install express superagent cheerio --save
const express = require('express'); const superagent = require('superagent'); const cheerio = require('cheerio'); const app = express();
const url = 'https://www.douyu.com/directory/all'; const rooturl = 'https://www.douyu.com';
rooturl是鬥魚首頁,url是鬥魚所有直播間第一頁,rooturl後面直播間地址數據要用到jquery
在li裏尋找到咱們須要的數據,最後push到data裏git
app.get('/', function (req, response) { // 聲明get請求在指定的路徑下調用相應的回調函數 let data = [];//存放獲取的數據 superagent.get(url).end(function (err, res) {//發起get請求 if (err) { console.log(err); } else { console.log('狀態碼:' + res.status); let $ = cheerio.load(res.text);//使用cheerio解析數據 $('#live-list-contentbox li').each(function (i, ele) { //獲取目標數據 並遍歷存放到data中 let href = rooturl + $(ele).find('a.play-list-link').attr('href');//href是存放的直播間id,加rooturl生成直播間連接 let lives = { name: $(ele).find('span.dy-name').text(), num: $(ele).find('span.dy-num').text(), title: $(ele).find('.mes-tit>h3').text().trim(), links: href,//直播間連接 }; data.push(lives); }) } response.send(data);//目標數據發送給前端
})github
app.listen(3030, function () { console.log('server is listening port 3030....'); })
最後node這個項目,打開http://localhost:3000/ 獲得咱們須要的數據ajax
$ npm install async --save
100個頁面能夠先獲取100個相應的url,可是發現鬥魚切換到第二頁的時候其url並無改變,
經過chrome devtools發如今切換頁面時的ajax請求。
發現ajax請求的url是https://www.douyu.com/gapi/rk... ,後面加的/2就是相應的頁數(這裏是第二頁)chrome
const express = require('express'); const superagent = require('superagent'); const async = require('async'); const app = express(); const rooturl = 'https://www.douyu.com/gapi/rkc/directory/0_0';
function geturls(num) { let href = []; let urls = []; for (let i = 1; i <= num; i++) { href.push('/' + i); } href.forEach(function (ele) { urls.push(rooturl + ele); }) return urls; }
傳進去的num是多少,返回的url就有多少express
app.get('/data', function (req, res) { let urls = geturls(100); //獲取100個url let datas = []; //存放目標數據 async.mapLimit(urls,25,function (url, callback) { //異步發送請求 fetchPage(url, callback);//分析數據並提取 }, function (err, result) { console.log('分析完成!'); res.send(datas);//發送數據給前端 }); })
async.mapLimit(coll, limit, iteratee, callback)
ps:最後一個函數裏result參數的數據和datas數組數據是同樣的,發送datas主要是方便後面頁面提取
function fetchPage(url, callback) { superagent.get(url).end(function (err, sres) { if (err) { console.log(err); } else { let item = JSON.parse(sres.text);//解析json數據 let list = item.data.rl; list.forEach(function (ele) {//提取須要的數據 let obj = { name: ele.nn, id: ele.rid, online: ele.ol, title: ele.rn, class: ele.c2name, }; datas.push(obj); }); callback(null, datas);//這個datas會發送給result } }) } })
由於ajax請求直接返回的是json數據就不須要上面的cheerio解析
app.use(express.static('public')) app.listen(3030, function () { console.log('server is listening port 3030....'); })
以上代碼均在app.js裏