摘要:前提本項目地址如果需要,可以到本地打開可直接查看爬蟲數(shù)據(jù)目標爬取斗魚正在直播的主播數(shù)據(jù)房間號,在線人數(shù),房間標題,主播名稱,直播分類等等依賴構建安裝包的應用程序框架小型漸進式客戶端請求庫,和模塊具有相同的,具有許多高級客戶端功能可以
前提
本項目github地址:https://github.com/janyin/dou...
如果需要,可以clone到本地
$ npm install --save
$ node app
打開http://localhost:3030/index.html 可直接查看爬蟲數(shù)據(jù)
目標爬取斗魚正在直播的主播數(shù)據(jù)(房間號,在線人數(shù),房間標題,主播名稱,直播分類等等)
依賴構建安裝npm包express+superagent+cheerio
$ npm install express superagent cheerio --save
express:Node.js的Web應用程序框架
superagent:小型漸進式客戶端HTTP請求庫,和Node.js模塊具有相同的API,具有許多高級HTTP客戶端功能
cheerio:可以理解為一個Node.js版本的jquery,用來從網(wǎng)頁中以 css selector取數(shù)據(jù),使用方式和jquery基本相同
實現(xiàn)步驟 1、引入依賴并實例化expressconst express = require("express"); const superagent = require("superagent"); const cheerio = require("cheerio"); const app = express();2、定義目標url
const url = "https://www.douyu.com/directory/all"; const rooturl = "https://www.douyu.com";
rooturl是斗魚首頁,url是斗魚全部直播間第一頁,rooturl后面直播間地址數(shù)據(jù)要用到
3、發(fā)送請求 獲取數(shù)據(jù) 分析數(shù)據(jù) 生成頁面數(shù)據(jù)到前端用superagent發(fā)送get請求到斗魚,回調函數(shù)接受到的數(shù)據(jù)給cheerio解析,這樣就可以用jquery選擇器進行操作
使用cheerio.load()解析
打開斗魚,發(fā)現(xiàn)其直播列表均在id為live-list-contentbox的ul里,用jquery選擇器獲取所有l(wèi)i并遍歷
在li里尋找到我們需要的數(shù)據(jù),最后push到data里
app.get("/", function (req, response) { // 聲明get請求在指定的路徑下調用相應的回調函數(shù) let data = [];//存放獲取的數(shù)據(jù) superagent.get(url).end(function (err, res) {//發(fā)起get請求 if (err) { console.log(err); } else { console.log("狀態(tài)碼:" + res.status); let $ = cheerio.load(res.text);//使用cheerio解析數(shù)據(jù) $("#live-list-contentbox li").each(function (i, ele) { //獲取目標數(shù)據(jù) 并遍歷存放到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);//目標數(shù)據(jù)發(fā)送給前端
})
4、監(jiān)聽端口app.listen(3030, function () { console.log("server is listening port 3030...."); })
最后node這個項目,打開http://localhost:3000/ 得到我們需要的數(shù)據(jù)
以上全部代碼在first.js里. 爬蟲數(shù)據(jù)部分結果:
進階爬蟲
思考:這只是斗魚第一頁主播的數(shù)據(jù),如果是100頁的數(shù)據(jù),或者全部呢?
這時候就需要async,不可能同步發(fā)100個請求,容易被誤以為惡意攻擊
Async提供了直接,強大的函數(shù)來處理異步JavaScript,雖然最初設計用于Node.js,但它也可以直接在瀏覽器中使用
$ npm install async --save分析頁面
100個頁面可以先獲取100個相應的url,但是發(fā)現(xiàn)斗魚切換到第二頁的時候其url并沒有改變,
通過chrome devtools發(fā)現(xiàn)在切換頁面時的ajax請求。
發(fā)現(xiàn)ajax請求的url是https://www.douyu.com/gapi/rk... ,后面加的/2就是相應的頁數(shù)(這里是第二頁)
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";2、聲明一個函數(shù)獲取所有的url
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就有多少
3、async異步發(fā)送請求app.get("/data", function (req, res) { let urls = geturls(100); //獲取100個url let datas = []; //存放目標數(shù)據(jù) async.mapLimit(urls,25,function (url, callback) { //異步發(fā)送請求 fetchPage(url, callback);//分析數(shù)據(jù)并提取 }, function (err, result) { console.log("分析完成!"); res.send(datas);//發(fā)送數(shù)據(jù)給前端 }); })
async.mapLimit(coll, limit, iteratee, callback)
coll是迭代的集合,就是數(shù)組存放需要發(fā)送請求的url
limit一次最大異步操作數(shù)
一個異步函數(shù),用于應用于每個項目 coll
callback可選,所有iteratee 函數(shù)完成或發(fā)生錯誤時調用的回調。
ps:最后一個函數(shù)里result參數(shù)的數(shù)據(jù)和datas數(shù)組數(shù)據(jù)是一樣的,發(fā)送datas主要是方便后面頁面提取
4、分析頁面函數(shù)function fetchPage(url, callback) { superagent.get(url).end(function (err, sres) { if (err) { console.log(err); } else { let item = JSON.parse(sres.text);//解析json數(shù)據(jù) let list = item.data.rl; list.forEach(function (ele) {//提取需要的數(shù)據(jù) let obj = { name: ele.nn, id: ele.rid, online: ele.ol, title: ele.rn, class: ele.c2name, }; datas.push(obj); }); callback(null, datas);//這個datas會發(fā)送給result } }) } })
因為ajax請求直接返回的是json數(shù)據(jù)就不需要上面的cheerio解析
5、設置靜態(tài)文件目錄app.use(express.static("public")) app.listen(3030, function () { console.log("server is listening port 3030...."); })6、編寫前端html,展示數(shù)據(jù)
前端代碼在index.html里,主要是獲取數(shù)據(jù)遍歷輸出到表格,還有一個搜索功能(不建議搜索1W以上的數(shù)據(jù),會很卡)
以上代碼均在app.js里
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97018.html
摘要:站的彈幕服務器也有類似的機制,隨便打開一個未開播的直播間,抓包將看到每隔左右會給服務端發(fā)送一個心跳包,協(xié)議頭第四部分的值從修改為即可。 原文:B 站直播間數(shù)據(jù)爬蟲, 歡迎轉載項目地址:bilibili-live-crawler 前言 起因 去年在 B 站發(fā)現(xiàn)一個后期超強的 UP 主:修仙不倒大小眼,專出 PDD 這樣知名主播的吃雞精彩集錦,漲粉超快。于是想怎么做這樣的 UP,遇到的第一...
摘要:很基礎,不喜勿噴轉載注明出處爬蟲實戰(zhàn)項目之鏈家效果圖思路爬蟲究竟是怎么實現(xiàn)的通過訪問要爬取的網(wǎng)站地址,獲得該頁面的文檔內容,找到我們需要保存的數(shù)據(jù),進一步查看數(shù)據(jù)所在的元素節(jié)點,他們在某方面一定是有規(guī)律的,遵循規(guī)律,操作,保存數(shù)據(jù)。 說明 作為一個前端界的小學生,一直想著自己做一些項目向全棧努力。愁人的是沒有后臺,搜羅之后且學會了nodejs和express寫成本地的接口給前端頁面調用...
摘要:很基礎,不喜勿噴轉載注明出處爬蟲實戰(zhàn)項目之鏈家效果圖思路爬蟲究竟是怎么實現(xiàn)的通過訪問要爬取的網(wǎng)站地址,獲得該頁面的文檔內容,找到我們需要保存的數(shù)據(jù),進一步查看數(shù)據(jù)所在的元素節(jié)點,他們在某方面一定是有規(guī)律的,遵循規(guī)律,操作,保存數(shù)據(jù)。 說明 作為一個前端界的小學生,一直想著自己做一些項目向全棧努力。愁人的是沒有后臺,搜羅之后且學會了nodejs和express寫成本地的接口給前端頁面調用...
摘要:不過因為各個平臺互相挖人的關系,導致關注的一些主播分散到了各個直播平臺,來回切換有點麻煩,所以萌生了做一個視頻聚合站的想法。后續(xù)我們會對這三個部分的功能做逐一展開說明。正則處理要求比較高,但是幾乎能應對所有的情況,屬于大殺器。 前言 作為一個爐石傳說玩家,經(jīng)常有事沒事開著直播網(wǎng)站看看大神們的精彩表演。不過因為各個平臺互相挖人的關系,導致關注的一些主播分散到了各個直播平臺,來回切換有點麻...
閱讀 3076·2023-04-25 20:43
閱讀 1719·2021-09-30 09:54
閱讀 1590·2021-09-24 09:47
閱讀 2874·2021-09-06 15:02
閱讀 3510·2021-02-22 17:09
閱讀 1233·2019-08-30 15:53
閱讀 1441·2019-08-29 17:04
閱讀 1956·2019-08-28 18:22