數據庫又不會弄,只能扒扒別人的數據了。
搭建環境:
(1)、創建一個文件夾,進入並初始化一個package.json文件。
npm init -y
(2)、安裝相關依賴:
npm install --save koa npm install --save cheerio // 后面會用到,用於抓取頁面模塊,為服務器特別定制的,快速、靈活、實施的jQuery核心實現
現在來一個簡單的demo熱熱身。直接上代碼(文件名:demo2.js):
var http = require('http') // Node.js提供了http模塊,用於搭建HTTP服務端和客戶端 var url = 'http://www.m4yy.com/type/2.html' //輸入任何網址都可以 http.get(url,function(res){ //發送get請求 var html='' res.on('data',function(data){ html += data //字符串的拼接 }) res.on('end',function(){ console.log(html) }) }).on('error',function(){ console.log('獲取資源出錯!') })
執行node demo2.js 得到結果如下:
很神奇有木有。然而這不是我們想要的,我們想要的是獲取頁面里面某一部份的數據。
這里以 沒事影院 的電視劇頁面為例。這時候cheerio就派上用場了,前面已經安裝過,這里就不再贅述,它的用法其實跟jquery是很相似的。參考 cheerio(百度百科的解釋)
在剛剛的js文件中引入cheerio模塊,然后加載所需要的html內容。
var $ = cheerio.load(html) // 加載需要的html
為了方便使用,這里封裝一個函數:
function filterChapters(html) { var $ = cheerio.load(html) // 加載需要的html,然后就可以愉快地使用類似jQuery的語法了 var chapters = $('.movie-item') //在html里尋找需要的資源的class var courseData = [] // 創建一個數組,用來保存資源 chapters.each(function(item, index) { //遍歷我們的html文檔 var chapter = $(this) var chapterTitle = chapter.children('a').attr('title') var tvUrl = chapter.children('a').attr('href').split('show/')[1] var imgUrl = chapter.find('img').attr('src') var updateStatus = chapter.find('.hdtag').text() var type = chapter.find('.otherinfo a').text() var url = `http://www.m4yy.com/show/${tvUrl}` courseData.push({ chapterTitle: chapterTitle, tvUrl: tvUrl, imgUrl: imgUrl, updateStatus: updateStatus, type: type, url: url }) }) return courseData //返回需要的資源 }
現在將上面的demo2.js文件稍作修改。完整代碼如下:
var http = require('http') // Node.js提供了http模塊,用於搭建HTTP服務端和客戶端 var url = 'http://www.m4yy.com/type/2-3.html' //輸入任何網址都可以 var cheerio = require('cheerio') // 抓取頁面模塊,為服務器特別定制的,快速、靈活、實施的jQuery核心實現 http.get(url,function(res){ //發送get請求 var html='' res.on('data',function(data){ html += data //字符串的拼接 }) res.on('end',function(){ var courseData = filterChapters(html) console.log('courseData', courseData) }) }).on('error',function(){ console.log('獲取資源出錯!') }) function filterChapters(html) { var $ = cheerio.load(html) // 加載需要的html var chapters = $('.movie-item') //在html里尋找需要的資源的class var courseData = [] // 創建一個數組,用來保存資源 chapters.each(function(item, index) { //遍歷html文檔 var chapter = $(this) var chapterTitle = chapter.children('a').attr('title') var tvUrl = chapter.children('a').attr('href').split('show/')[1] var imgUrl = chapter.find('img').attr('src') var updateStatus = chapter.find('.hdtag').text() var type = chapter.find('.otherinfo a').text() var url = `http://www.m4yy.com/show/${tvUrl}` courseData.push({ chapterTitle: chapterTitle, tvUrl: tvUrl, imgUrl: imgUrl, updateStatus: updateStatus, type: type, url: url }) }) return courseData //返回需要的資源 }
再次執行node demo2.js 此時結果如下:
光這樣還不夠,我們想把它存在一個json文件中,下面就新建一個tvList.json文件。將上面獲取的內容添加到json文件中,這里就涉及到文件的寫操作了。
需要用到模塊fs,因此在js文件中引入fs模塊。完整代碼如下:
var http = require('http') // Node.js提供了http模塊,用於搭建HTTP服務端和客戶端 var url = 'http://www.m4yy.com/type/2.html' //輸入任何網址都可以 var cheerio = require('cheerio') // 抓取頁面模塊,為服務器特別定制的,快速、靈活、實施的jQuery核心實現 var fs = require("fs") http.get(url,function(res){ //發送get請求 var html='' res.on('data',function(data){ html += data //字符串的拼接 }) res.on('end',function(){ var courseData = filterChapters(html) let content = courseData.map((o)=>{ return JSON.stringify(o) // JSON.stringify() 方法用於將 JavaScript 值轉換為 JSON 字符串。 }) fs.writeFile('./tvlist.json',content, function(err){ //文件路經,寫入的內容,回調函數 if(err) throw new Error ('寫文件失敗'+err); console.log("成功寫入文件") }) }) }).on('error',function(){ console.log('獲取資源出錯!') }) function filterChapters(html) { var $ = cheerio.load(html) // 加載需要的html var chapters = $('.movie-item') //在html里尋找需要的資源的class var courseData = [] // 創建一個數組,用來保存資源 chapters.each(function(item, index) { //遍歷html文檔 var chapter = $(this) var chapterTitle = chapter.children('a').attr('title') var tvUrl = chapter.children('a').attr('href').split('show/')[1] var imgUrl = chapter.find('img').attr('src') var updateStatus = chapter.find('.hdtag').text() var type = chapter.find('.otherinfo a').text() var url = `http://www.m4yy.com/show/${tvUrl}` courseData.push({ chapterTitle: chapterTitle, tvUrl: tvUrl, imgUrl: imgUrl, updateStatus: updateStatus, type: type, url: url }) }) return courseData //返回需要的資源 }
執行node demo2.js 效果如下: