nodeJS 爬蟲,通過Puppeteer實現滾動加載


最近在研究爬蟲,所以用自己熟悉的node簡單寫了一個。

開始用的是phantomjs來獲取HTML,但是看了文檔之后發現很久沒有維護了,所以就放棄了。

后來尋尋覓覓發現了 Puppeteer,看了下是Google開發的,所以果斷上手試了試,感覺比phantom不知道高到哪里去了。

B話少說,直接貼項目地址。

github.com/Huoshendame…

項目簡介

技術棧

node、puppeteer、cheerio(雖然puppeteer集成了Jq,但是既然已經裝了就用一下吧)

安裝注意事項

在運行npm install 在安裝 puppeteer的時候會報錯,因為node下載chrome(puppeteer依賴chrome瀏覽器)會報錯。所以先忽略掉chrome

npm install puppeteer --ignore-scripts
復制代碼

安裝成功之后,在去運行

npm install復制代碼

裝好之后,手動吧項目里的 chrome-win 文件夾 放到D盤根目錄。

PS:或者你自己放到自己的指定目錄,但是在項目里的reptile.js里面 puppeteer.launch的時候需要指定絕對定位的地址

 

功能介紹

1.通過Puppeteer打開頭條新聞頁面 https://www.toutiao.com/ch/news_game/。

2.獲取page實例,通過注入js來實現頁面滾動

3.在通過cheerio,分析dom結構,獲取標題、圖片及鏈接地址。

4.存儲到本地文件。(也可以放到DB里,我這里是直接接口返回了獲取的數據,並且順手存到了本地文件)

/* 引入相關 工具 */
const fs = require('fs')
const cheerio = require('cheerio')
const puppeteer = require('puppeteer')
 
/* 定義函數 */
let getListData = async function(Category) {
 /* 初始化 puppeteer*/
 const browser = await puppeteer.launch({
  executablePath: 'D:\\chrome-win\\chrome.exe',//把項目中的這個chrome-win文件夾放到D盤根目錄
  headless: false //這個是 是否打開chrome可視化窗口 true是不打開 false是打開
 })
 //獲取page實例
 const page = await browser.newPage()
 //我這里是通過 入參傳過來的 分類來判斷抓取相應頁面的數據
 let url = ''
 switch (Category) {
  case '0':
   url = 'https://www.toutiao.com/ch/news_game/'
   break;
  case '1':
   url = 'https://www.toutiao.com/ch/news_entertainment/'
   break;
  case '2':
   url = 'https://www.toutiao.com/ch/news_history/'
   break;
  case '3':
   url = 'https://www.toutiao.com/ch/news_finance/'
   break;
 }
 //打開頁面
 await page.goto(url)
 //定義頁面內容及Jquery
 var content , $
 /* 頁面滾動方法 */
 async function scrollPage(i) {
  content = await page.content();
  $ = cheerio.load(content);
  /*執行js代碼(滾動頁面)*/
  await page.evaluate(function () {
   /* 這里做的是漸進滾動,如果一次性滾動則不會觸發獲取新數據的監聽 */
   for (var y = 0; y <= 1000*i; y += 100) {
    window.scrollTo(0,y)
   }
  })
  // 獲取數據列表
  const li = $($('.feedBox').find('ul')[0]).find('li')
  return li
 }
 let i = 0
 let li = await scrollPage(++i)
 //如果數據列表 不夠30 則一直獲取
 while (li.length < 30) {
  li = await scrollPage(++i)
 }
 let data = {
   list: []
 }
 /* 封裝返回的數據*/
 li.map(function (index,item) {
  $(item).find('img').attr('src') != undefined ?
   data.list.push({
    src: $(item).find('img').attr('src'),
    title: $($(item).find('.title')).text(),
    source:$($(item).find('.source')).text(),
    href:$($(item).find('.title')).attr('href')
   }):''
 })
 //順手存入本地文件
 fs.writeFileSync('tt.JSON',JSON.stringify(data))
 fs.writeFileSync('tt.html',content)
 /* 關閉 puppeteer*/
 await browser.close()
  return data
}
module.exports = getListData復制代碼

 

最近在研究爬蟲,所以用自己熟悉的node簡單寫了一個。

開始用的是phantomjs來獲取HTML,但是看了文檔之后發現很久沒有維護了,所以就放棄了。

后來尋尋覓覓發現了 Puppeteer,看了下是Google開發的,所以果斷上手試了試,感覺比phantom不知道高到哪里去了。

B話少說,直接貼項目地址。

github.com/Huoshendame…

項目簡介

技術棧

node、puppeteer、cheerio(雖然puppeteer集成了Jq,但是既然已經裝了就用一下吧)

安裝注意事項

在運行npm install 在安裝 puppeteer的時候會報錯,因為node下載chrome(puppeteer依賴chrome瀏覽器)會報錯。所以先忽略掉chrome

 

 

 

 

  1.  
    npm install puppeteer --ignore-scripts
  2.  
    復制代碼

安裝成功之后,在去運行

 

 

 

 

npm install復制代碼

裝好之后,手動吧項目里的 chrome-win 文件夾 放到D盤根目錄。

PS:或者你自己放到自己的指定目錄,但是在項目里的reptile.js里面 puppeteer.launch的時候需要指定絕對定位的地址

 

功能介紹

1.通過Puppeteer打開頭條新聞頁面 https://www.toutiao.com/ch/news_game/。

2.獲取page實例,通過注入js來實現頁面滾動

3.在通過cheerio,分析dom結構,獲取標題、圖片及鏈接地址。

4.存儲到本地文件。(也可以放到DB里,我這里是直接接口返回了獲取的數據,並且順手存到了本地文件)

 

源碼

 

  1.  
    /* 引入相關 工具 */
  2.  
    const fs = require( 'fs')
  3.  
    const cheerio = require( 'cheerio')
  4.  
    const puppeteer = require( 'puppeteer')
  5.  
     
  6.  
    /* 定義函數 */
  7.  
    let getListData = async function(Category) {
  8.  
    /* 初始化 puppeteer*/
  9.  
    const browser = await puppeteer.launch({
  10.  
    executablePath: 'D:\\chrome-win\\chrome.exe',//把項目中的這個chrome-win文件夾放到D盤根目錄
  11.  
    headless: false //這個是 是否打開chrome可視化窗口 true是不打開 false是打開
  12.  
    })
  13.  
    //獲取page實例
  14.  
    const page = await browser.newPage()
  15.  
    //我這里是通過 入參傳過來的 分類來判斷抓取相應頁面的數據
  16.  
    let url = ''
  17.  
    switch (Category) {
  18.  
    case '0':
  19.  
    url = 'https://www.toutiao.com/ch/news_game/'
  20.  
    break;
  21.  
    case '1':
  22.  
    url = 'https://www.toutiao.com/ch/news_entertainment/'
  23.  
    break;
  24.  
    case '2':
  25.  
    url = 'https://www.toutiao.com/ch/news_history/'
  26.  
    break;
  27.  
    case '3':
  28.  
    url = 'https://www.toutiao.com/ch/news_finance/'
  29.  
    break;
  30.  
    }
  31.  
    //打開頁面
  32.  
    await page.goto(url)
  33.  
    //定義頁面內容及Jquery
  34.  
    var content , $
  35.  
    /* 頁面滾動方法 */
  36.  
    async function scrollPage(i) {
  37.  
    content = await page.content();
  38.  
    $ = cheerio.load(content);
  39.  
    /*執行js代碼(滾動頁面)*/
  40.  
    await page.evaluate( function () {
  41.  
    /* 這里做的是漸進滾動,如果一次性滾動則不會觸發獲取新數據的監聽 */
  42.  
    for (var y = 0; y <= 1000*i; y += 100) {
  43.  
    window.scrollTo(0,y)
  44.  
    }
  45.  
    })
  46.  
    // 獲取數據列表
  47.  
    const li = $($( '.feedBox').find( 'ul')[0]).find( 'li')
  48.  
    return li
  49.  
    }
  50.  
    let i = 0
  51.  
    let li = await scrollPage(++i)
  52.  
    //如果數據列表 不夠30 則一直獲取
  53.  
    while (li.length < 30) {
  54.  
    li = await scrollPage(++i)
  55.  
    }
  56.  
    let data = {
  57.  
    list: []
  58.  
    }
  59.  
    /* 封裝返回的數據*/
  60.  
    li.map( function (index,item) {
  61.  
    $(item).find( 'img').attr( 'src') != undefined ?
  62.  
    data.list.push({
  63.  
    src: $(item).find( 'img').attr( 'src'),
  64.  
    title: $($(item).find( '.title')).text(),
  65.  
    source:$($(item).find( '.source')).text(),
  66.  
    href:$($(item).find( '.title')).attr( 'href')
  67.  
    }): ''
  68.  
    })
  69.  
    //順手存入本地文件
  70.  
    fs.writeFileSync( 'tt.JSON',JSON.stringify(data))
  71.  
    fs.writeFileSync( 'tt.html',content)
  72.  
    /* 關閉 puppeteer*/
  73.  
    await browser.close()
  74.  
    return data
  75.  
    }
  76.  
    module.exports = getListData 復制代碼

 

 


免責聲明!

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



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