node爬取新型冠状病毒的疫情实时动态


Posted in Javascript onFebruary 06, 2020

写在前面:

新型冠状病毒有多么可怕,我想大家都已经知道了。湖北爆发了新型冠状病毒,湖南前几天爆发了禽流感,四川发生地震,中国加油!昨天晚上我突发奇想地打算把疫情实时动态展示在自建站上,于是说干就干(先附上昨晚用puppeteer截的图片)。 

node爬取新型冠状病毒的疫情实时动态

安装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());

用fs写入到文件中:

/* fs.wirteFile有三个参数
  * 1,第一个参数是要写入的文件路径
  * 2,第二个参数是要写入得内容
  * 3,第三个参数是可选参数,表示要写入的文件编码格式,一般就不写,默认就行
  * 4,第四个参数是个回调函数 只有一个参数error,来判断是否写入成功
  */
fs.writeFile("./coronavirus.php",$menu_box.html(),error=>{
  if(error) return console.log("写入文件失败,原因是:"+error.message);
  console.log('写入成功');
});

引入到网站中:

我是直接把它放在头部,局部代码如下:

<div id="header-bg">
  <style type="text/css">
    .title___2d1_B img {
      width: 18px;
      height: 18px;
      cursor:pointer;
    }
    #novel_coronavirus {
      text-align: center;
      position:relative;
      top:50px;
      background-color:rgba(255,255,255,0.7);
    }
    #novel_coronavirus li {
      margin: 10px;
      padding:2px;
      border:1px slide #000;
    }
    #novel_coronavirus ul li { 
      list-style:none;
      display: inline-block;
    }
    .count___3GCdh p{
      font-size:12px;
    }
    .count___3GCdh span{
      font-size:20px;
    }
  </style>
  <div id="novel_coronavirus" > 
    <strong><p style="font-size:23px">新型冠状病毒疫情实时动态</p></strong>
    <?php require("./test/coronavirus.php");?>
  </div>
</div>

服务器上运行的完整代码:

CronJob的定时参数是 秒 分钟 小时 天 月份 星期。这里我设置成了每分钟爬取一次。(我是用mstsc远程连接后运行node coronavirus.js的,这样关闭远程桌面连接后,服务器依然会每分钟爬取一次丁香医生上的新型冠状病毒的全国疫情实时动态。 

const cheerio = require('cheerio');
const puppeteer = require('puppeteer');
const fs = require('fs');
var cronJob = require('cron').CronJob;
new cronJob('0 */1 * * * *',function(){
 update();
},null,true);  //每分钟执行一次
//爬取全国新型肺炎疫情实时动态并写入到指定的.php文件
function update() {
 (async () => {
  const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
  const page = await browser.newPage();
  await page.goto('https://ncov.dxy.cn/');
  const frame = await page.mainFrame();
  const bodyHandle = await frame.$('html');
  const html = await frame.evaluate(body=>body.innerHTML,bodyHandle);
  await bodyHandle.dispose();
  browser.close();
  var $ = cheerio.load(html);
  var $menu_box = $(".statistics___1cFUQ");
  fs.writeFile("coronavirus.php",$menu_box.html(),error=>{
   if(error) {
    console.log("写入文件失败,原因是:"+error.message);
   } else { 
    console.log('更新成功');
   }
  });
 })();
}

查看我的网站 

node爬取新型冠状病毒的疫情实时动态

node爬取新型冠状病毒的疫情实时动态

总结

以上所述是小编给大家介绍的node爬取新型冠状病毒的疫情实时动态,希望对大家有所帮助!

Javascript 相关文章推荐
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
Mar 23 Javascript
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 Javascript
解决jQuery插件tipswindown与hintbox冲突
Nov 05 Javascript
JQuery下拉框应用示例介绍
Apr 23 Javascript
网页右下角弹出窗体实现代码
Jun 05 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
JQuery fileupload插件实现文件上传功能
Mar 18 Javascript
JS经典正则表达式笔试题汇总
Dec 15 Javascript
jquery tmpl模板(实例讲解)
Sep 02 jQuery
vue-cli脚手架-bulid下的配置文件
Mar 27 Javascript
Vue.js中的extend绑定节点并显示的方法
Jun 20 Javascript
vue 检测用户上传图片宽高的方法
Feb 06 #Javascript
vue中对象数组去重的实现
Feb 06 #Javascript
2019最新21个MySQL高频面试题介绍
Feb 06 #Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 #Javascript
node.JS二进制操作模块buffer对象使用方法详解
Feb 06 #Javascript
JavaScript实现左右滚动电影画布
Feb 06 #Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 #Javascript
You might like
phplot生成图片类用法详解
2015/01/06 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
python面向对象 反射原理解析
2019/08/12 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
2014年清明节寄语
2014/04/03 职场文书
模具专业自荐信
2014/05/29 职场文书
体育运动口号
2014/06/09 职场文书
反腐倡廉标语
2014/06/24 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
百家讲坛观后感
2015/06/12 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫