使用node.js如何爬取網站數據


  數據庫又不會弄,只能扒扒別人的數據了。

  搭建環境:

  (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  效果如下:

    

 

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM