當前位置 主頁 > 網站技術 > 代碼類 > 最大化 縮小

    node爬取新型冠狀病毒的疫情實時動態

    欄目:代碼類 時間:2020-02-06 21:06

    寫在前面:

    新型冠狀病毒有多么可怕,我想大家都已經知道了。湖北爆發了新型冠狀病毒,湖南前幾天爆發了禽流感,四川發生地震,中國加油!昨天晚上我突發奇想地打算把疫情實時動態展示在自建站上,于是說干就干(先附上昨晚用puppeteer截的圖片)。 

    安裝node_modules:

    所需的node_modules:①puppeteer;②cheerio;③fs;④cron。

    需要注意的是安裝puppeteer的時候很容易安裝失敗,這里有倆個解決方法,都是用淘寶源(馬云爸爸不是白叫的😄)。

    一、先將npm換成淘寶源再安裝:

    npm config set registry http://registry.npm.taobao.org/
    npm install -g cheerio
    npm i -g puppeteer
    npm i -g fs
    npm i -g cron

    二、用cnpm進行安裝:

    npm install cnpm -g --registry=https://registry.npm.taobao.org/
    cnpm install -g cheerio
    cnpm i -g puppeteer
    cnpm i -g fs
    cnpm i -g cron

    具體操作:

    用puppeteer爬取:

    puppeteer本質上是一個chrome瀏覽器,網頁很難分清這是人類用戶還是爬蟲,我們可以用它來加載動態網頁。

    先來一個簡單的例子,用puppeteer截圖:

    const puppeteer = require('puppeteer');
     
    (async () => {
     const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});  //啟動瀏覽器實例
      /* puppeteer.launch()的可選參數如下:
      headless: 是否打開瀏覽器,默認為true
      ignoreHTTPSErrors: 是否忽略https錯誤,默認為true
      executablePath: 配置要調用瀏覽器的可執行路徑,默認是同Puppeteer一起安裝的Chromeium
      slowMo:指定的毫秒延緩Puppeteer的操作
      args:設置瀏覽器的相關參數,比如是否啟動沙箱模式“--no-sandbox”,是否更換代理“--proxy-server”,
      */
     const page = await browser.newPage();  //新建頁面
     await page.goto('https://ncov.dxy.cn/');  //訪問目標網頁:丁香醫生
     await page.screenshot({  //進行截圖
      path: 'p1.png',
      type: 'png',
      // quality: 100, 只對jpg有效
      // 指定區域截圖,clip和fullPage兩者只能設置一個
      // fullPage: true,
      clip: {
       x: 0,
       y: 0,
       width: 1000,
       height: 1000
      }
     });
     browser.close();  //關閉瀏覽器
    })();

    用puppeteer獲取網頁源代碼:

    const puppeteer = require('puppeteer');
     
    (async () => {
     const browser = await puppeteer.launch();
     const page = await browser.newPage();
     await page.goto('https://ncov.dxy.cn/');
     //page.frames() 獲取當前頁面所有的 iframe,然后根據 iframe 的名字精確獲取某個想要的 iframe
     const frame = await page.mainFrame();
     const bodyHandle = await frame.$('html');  //獲取所有的html
     //frame.evaluate()在瀏覽器中執行函數,相當于在控制臺中執行函數,返回一個Promise
     const html = await frame.evaluate(body=>body.innerHTML,bodyHandle);
     await bodyHandle.dispose();
     browser.close();
     console.log(html);
    })();

    用cheerio解析html:

    // 使用cheerio模塊裝載我們得到的頁面源代碼,返回的是一個類似于jquery中的$對象
    // 使用這個$對象就像操作jquery對象一般去操作我們獲取得到的頁面的源代碼
    var $ = cheerio.load(html);
    var $menu_box = $(".statistics___1cFUQ");
    console.log($menu_box.html());
    
    
    
在线观看中文字幕理论片