栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据

Node.js爬虫丁香园网站的新冠疫情数据并且写入数据库mysql中

大数据 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Node.js爬虫丁香园网站的新冠疫情数据并且写入数据库mysql中

一、准备环境

安装好Node.js
新建一个文件夹
新建一个js文件 spider

二、代码时间 1.首先引入相关模块
// 目标是爬取丁香园网站的疫情数据
// 在node端要有一个帮助我请求丁香园网站
const superagent = require('superagent')
const cheerio = require('cheerio')
const mysql =require('mysql')
const path = require('path')
var schedule = require('node-schedule');
//schedule模块用来执行定时任务 
const request=require('request');
2.创建数据库连接
var connection ;

//创建数据库连接
//创建一个函数handleError,负责防止mysql断连

function handleError () {
  connection = mysql.createConnection({
    host:'localhost',
    port:端口号,//安装数据库默认端口号为3306
    user:"Mysql用户名",
    password:"Mysql密码",
    database:"你的数据库名称"
  });
 
  //连接错误,2秒重试
  connection.connect(function (err) {
      if (err) {
          console.log('error when connecting to db:', err);
          setTimeout(handleError , 2000);
      }
  });

  connection.on('error', function (err) {
      console.log('db error', err);
      // 如果是连接断开,自动重新连接
      if (err.code === 'PROTOCOL_CONNECTION_LOST') {
          handleError();
      } else {
          throw err;
      }
  });
}
handleError();//执行函数
3.获取当前时间
//获取当天的时间
var getToday=function(){
var time=new Date();
var year=time.getFullYear();
var day=time.getDate();
if(day<10){
  day='0'+day;
}
var month=time.getMonth()+1;
if(month<10){
  month='0'+month;
}
var date=year+'-'+month+'-'+day;
return date
}
4.第一个执行函数

1.这个定时任务是负责获取丁香园的数据,存入数据库中
2.先用superagent请求页面获得html
3.然后用cheerio解析html,可以通过jQuery的方法操作dom,获得里面的数据
4.获得数据之后,就写入数据库的alldata2数据表

var spider=function(){
  // 1. 请求目标网站
const url = `https://ncov.dxy.cn/ncovh5/view/pneumonia`
superagent
  .get(url)
  .then(res => {
    // console.log(res.text) // 相应的内容
    // 浏览器可以解析html 但是node端不行
    // 2. 去解析html字符串从里面提取对应疫情数据
    const $ = cheerio.load(res.text) // 然后后我们就可以通过jQuery的方法操作dom
    // 获取全国疫情信息数据

    var $getAreaStat = $('#getAreaStat').html()

    // console.log($getListByCountryTypeService1)
    // 使用字符切割 正则匹配 eval函数
    var dataObj = {}

    eval($getAreaStat.replace(/window/g, 'dataObj'))

    //console.log(dataObj)
    // 3. fs写入数据到本地
        var date=getToday();

        var getAreaStat=dataObj.getAreaStat;
        var arr=[]
        getAreaStat.forEach(item => {   
            var provinceCode=item.locationId;
            var result=item.cities;
            //console.log(result);
            if(result.length==0){
              var addSql = 'INSERT INTO alldata2(id,date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead) VALUES(0,?,?,?,?,?,?,?,?,?)';
              var cityCode=provinceCode;
              var province=item.provinceName;
              var city=province;
              var /confirm/ied=item./confirm/iedCount;
              var suspected=item.suspectedCount;
              var cured=item.curedCount;
              var dead=item.deadCount;
              var addSqlParams = [date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead];
              //alldata
              connection.query(addSql, addSqlParams, function (err, result) {
                  if (err) {
                      console.log('[INSERT ERROR-] - ', err.message);
                      return;
                  }
              }); 
            }else{
              result.forEach(res=>{
              var addSql = 'INSERT INTO alldata2(id,date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead) VALUES(0,?,?,?,?,?,?,?,?,?)';
              var cityCode=res.locationId
              var province=item.provinceName;
              var city=res.cityName;
              var /confirm/ied=res./confirm/iedCount;
              var suspected=res.suspectedCount;
              var cured=res.curedCount;
              var dead=res.deadCount;
              var addSqlParams = [date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead];
              //alldata
              connection.query(addSql, addSqlParams, function (err, result) {
                  if (err) {
                      console.log('[INSERT ERROR-] - ', err.message);
                      return;
                  }
              });   
            })
          }
            
        })
      console.log('写入数据成功!')


  })
  .catch(err => {
    throw err
  })
}
5.第二个执行函数

1.读取之前写入alldata2数据表的数据
2.请求高德地图的api获取地理坐标
3.写入location2数据表

var spider2=function(){
 var date=getToday();
  var strings="SELECT * FROM `alldata2` WHERe date='"+date+"'"
  connection.query(strings,  function (err, result) {
  if (err) {
      console.log('[INSERT ERROR-] - ', err.message);
      return;
  }else{
      //console.log(result);
      const sleep = function (ms){
          return new Promise(resolve => setTimeout(resolve, ms))
        }
        const requestData = async function(){
          for(var i=0;i 
6.为两个执行函数创建定时任务 
var runSchedule =function (cb) {
    // cron风格的配置:每天上午2点05分执行一次第一个函数
    schedule.scheduleJob('0 5 2 * * *', function () {
        var time=new Date();
        var year=time.getFullYear();
        var day=time.getDate();
        var month=time.getMonth()+1;
        console.log('spider定时任务执行一次'+year+'年'+month+'月'+day+'日');
            cb && cb();
    });
}

//可以按照cron的格式设置
var runSchedule2 =function (cb) {
    // cron风格的配置:每天上午2点10分执行一次第二个函数
    schedule.scheduleJob('0 10 2 * * *', function () {
      var time=new Date();
        var year=time.getFullYear();
        var day=time.getDate();
        var month=time.getMonth()+1;
        console.log('spider2定时任务执行一次'+year+'年'+month+'月'+day+'日');
          cb && cb();
    });
}
 runSchedule(spider);
 runSchedule2(spider2);

 console.log('定时任务已启动');
7.全部代码
// // 目标是爬取丁香园网站的疫情数据
// 在node端要有一个帮助我请求丁香园网站
const superagent = require('superagent')
const cheerio = require('cheerio')
const mysql =require('mysql')
const path = require('path')
var schedule = require('node-schedule');
//schedule模块用来执行定时任务 
const request=require('request');
// superagent.get(url).then()
var connection ;

//创建数据库连接
function handleError () {
  connection = mysql.createConnection({
    host:'localhost',
    port:端口号,//安装数据库默认端口号为3306
    user:"Mysql用户名",
    password:"Mysql密码",
    database:"你的数据库名称"
  });
 
  //连接错误,2秒重试
  connection.connect(function (err) {
      if (err) {
          console.log('error when connecting to db:', err);
          setTimeout(handleError , 2000);
      }
  });

  connection.on('error', function (err) {
      console.log('db error', err);
      // 如果是连接断开,自动重新连接
      if (err.code === 'PROTOCOL_CONNECTION_LOST') {
          handleError();
      } else {
          throw err;
      }
  });
}
handleError();

//获取当天的时间
var getToday=function(){
var time=new Date();
var year=time.getFullYear();
var day=time.getDate();
if(day<10){
  day='0'+day;
}
var month=time.getMonth()+1;
if(month<10){
  month='0'+month;
}
var date=year+'-'+month+'-'+day;
return date
}



var spider=function(){
  // 1. 请求目标网站
const url = `https://ncov.dxy.cn/ncovh5/view/pneumonia`
superagent
  .get(url)
  .then(res => {
    // console.log(res.text) // 相应的内容
    // 浏览器可以解析html 但是node端不行
    // 2. 去解析html字符串从里面提取对应疫情数据
    const $ = cheerio.load(res.text) // 然后后我们就可以通过jQuery的方法操作dom
    // 获取全国疫情信息数据

    var $getAreaStat = $('#getAreaStat').html()

    // console.log($getListByCountryTypeService1)
    // 使用字符切割 正则匹配 eval函数
    var dataObj = {}

    eval($getAreaStat.replace(/window/g, 'dataObj'))

    //console.log(dataObj)
    // 3. fs写入数据到本地
        var date=getToday();

        var getAreaStat=dataObj.getAreaStat;
        var arr=[]
        getAreaStat.forEach(item => {   
            var provinceCode=item.locationId;
            var result=item.cities;
            //console.log(result);
            if(result.length==0){
              var addSql = 'INSERT INTO alldata2(id,date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead) VALUES(0,?,?,?,?,?,?,?,?,?)';
              var cityCode=provinceCode;
              var province=item.provinceName;
              var city=province;
              var /confirm/ied=item./confirm/iedCount;
              var suspected=item.suspectedCount;
              var cured=item.curedCount;
              var dead=item.deadCount;
              var addSqlParams = [date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead];
              //alldata
              connection.query(addSql, addSqlParams, function (err, result) {
                  if (err) {
                      console.log('[INSERT ERROR-] - ', err.message);
                      return;
                  }
              }); 
            }else{
              result.forEach(res=>{
              var addSql = 'INSERT INTO alldata2(id,date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead) VALUES(0,?,?,?,?,?,?,?,?,?)';
              var cityCode=res.locationId
              var province=item.provinceName;
              var city=res.cityName;
              var /confirm/ied=res./confirm/iedCount;
              var suspected=res.suspectedCount;
              var cured=res.curedCount;
              var dead=res.deadCount;
              var addSqlParams = [date,province,provinceCode,city,cityCode,/confirm/ied,suspected,cured,dead];
              //alldata
              connection.query(addSql, addSqlParams, function (err, result) {
                  if (err) {
                      console.log('[INSERT ERROR-] - ', err.message);
                      return;
                  }
              });   
            })
          }
            
        })
      console.log('写入数据成功!')


  })
  .catch(err => {
    throw err
  })
}

//spider();


var spider2=function(){
 var date=getToday();
  var strings="SELECT * FROM `alldata2` WHERe date='"+date+"'"
  connection.query(strings,  function (err, result) {
  if (err) {
      console.log('[INSERT ERROR-] - ', err.message);
      return;
  }else{
      //console.log(result);
      const sleep = function (ms){
          return new Promise(resolve => setTimeout(resolve, ms))
        }
        const requestData = async function(){
          for(var i=0;i 
三、启动程序 

在文件夹空白处,按住键盘ctrl键+鼠标右键 打开cmd命令行:
输入

cnmp i //安装依赖 也就是开头说的库
node spider //安装完所有依赖,执行程序,不关闭cmd就会一直每天爬取了

四、数据表格式


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/278320.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号