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 相关文章推荐
才发现的超链接js导致网页中GIF动画停止的解决方法
Nov 02 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
Nov 28 Javascript
FireFox下XML对象转化成字符串的解决方法
Dec 09 Javascript
JQuery实现鼠标移动到图片上显示边框效果
Jan 09 Javascript
jQuery获取和设置表单元素的方法
Feb 14 Javascript
jquery实现的鼠标拖动排序Li或Table
May 04 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
May 27 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
Jul 20 Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 Javascript
JavaScript SHA-256加密算法详细代码
Oct 06 Javascript
vue中使用gojs/jointjs的示例代码
Aug 24 Javascript
详解Vue的列表渲染
Nov 20 Vue.js
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
十天学会php(1)
2006/10/09 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
python使用urllib模块开发的多线程豆瓣小站mp3下载器
2014/01/16 Python
Python 探针的实现原理
2016/04/23 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
解析Python3中的Import
2019/10/13 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
小学生学习感言
2014/03/10 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书