搭建简单的Node服务器

这篇文章是基于上一篇文章所写的,有需要的话请先访问上一篇文章:
使用NodeJS+Cheerio实现网络爬虫
https://blog.csdn.net/kowloonchen/article/details/104515952

1.配置NodeJS服务器

//从网络上爬取数据
let request = require('request');
let cheerio = require('cheerio');
//获取客户端请求
let http = require('http');
let url = require('url');
//要爬取的数据源地址
let path = 'https://ncov.dxy.cn/ncovh5/view/pneumonia';

let PORT = 8090;
http.createServer(function (req, res) {
	//设置允许跨域访问
	res.setHeader("Access-Control-Allow-Credentials", "true");
    res.setHeader("Access-Control-Allow-Origin", "*");
	//设置返回的数据格式
    res.setHeader("Access-Control-Allow-Headers", "Content-Type"); 
    res.setHeader("content-type", "text/json; charset=utf-8");
   //解析请求的url
	let obj = url.parse(req.url,true);
	let type = obj.query.type;
	
	//收到请求之后开始根据不同的type类型爬取数据
	zhuaqu(path,type,(data)=>{
			res.end(data);
		});
	}).listen(PORT, function () {
     console.log('server is listening on port ' + PORT);
	}
);
//从网络上爬取数据的方法
function zhuaqu(path,type,callback){
	request(path,(err,req)=>{
		if(err){
				callback(err);
		}
		let $ = cheerio.load(req.body.toString());	
		//根据type获得疫情数据
		let data = $('#'+type);
		data = data[0].children[0].data;
		//根据不同的请求类型做不同的数据处理,这里要根据实际情况处理
		if(type=='getAreaStat'){
			data = data.substring(data.indexOf('['));
			data = data.substring(0,data.lastIndexOf(']')+1);	
		}else if(type=='getStatisticsService'){
			data = data.substring(data.indexOf('{')+1);
			data = data.substring(data.indexOf('{'));
			data = data.substring(0,data.lastIndexOf('}catch'));
		}				
		callback(data);
	});	
}

需要注意的是,在配置服务器的时候一定要设置成为允许跨域访问,否则在前端页面上是无法访问的。
配置后之后就可以在前端页面通过Ajax来发送请求到我们的Node服务器了。

2.在前端页面中通过Ajax访问服务器

	//获得国内疫情总数据
  $.get("http://192.168.16.110:8090?type=getStatisticsService", (data) => {
         console.log(data);
   });
  //获得国内疫情
  $.get("http://192.168.16.110:8090?type=getAreaStat", (data) => {
     console.log(data);
  });

3.通过Vue在页面上显示数据

在页面上采用的是bootStrap+Vue的方式来展示数据的。在Vue中获得数据之后,我们再在页面上去显示。

<script>
        //创建Vue对象
        let vue = new Vue({
            el: "#app",    //Vue对象映射的HTML标签为id为app的标签
            data: {       //Vue对象中的数据
                areaStat: [],
                staticService: {}
            },
            methods: {
                //表格的省份折叠处理
                selectShengfen: (e) => {
                    //获得点击的省份ID
                    let shengfen = e.currentTarget.firstElementChild.id;
                    //console.log($("."+shengfen).css("visibility"));
                    if ($("." + shengfen).css("visibility") == "visible") {
                        $("." + shengfen).css("visibility", "collapse");
                    } else {
                        $("." + shengfen).css("visibility", "visible");
                    }
                }
            },
            mounted() {
                //获得国内疫情总数据
                $.get("http://localhost:8090?type=getStatisticsService", (data) => {
                    vue.staticService = data;
                }
                );
                //获得国内疫情
                $.get("http://localhost:8090?type=getAreaStat", (data) => {
                    vue.areaStat = data;
                    getDataList(data);
                }
                );
            }
        });
    </script>

通过Vue遍历出所有的数据,显示在页面上:
这里是用来展示总数据的地方:

<table class="table">
      <tr class="text-center">
            <td scope="row">
                <small>较昨日:{{staticService.currentConfirmedIncr}}</small>
                <h4 style="color:#FF6600">{{staticService.currentConfirmedCount}}</h4>
                <small>现存确诊</small>
            </td>
           <td>
               <small>较昨日:{{staticService.suspectedIncr}}</small>
                <h4 style="color:#FF9900">{{staticService.suspectedCount}}</h4>
                <small>现存疑似</small>
           </td>
           <td>
               <small>较昨日:{{staticService.seriousIncr}}</small>
                <h4 style="color:#FFCC00">{{staticService.seriousCount}}</h4>
                <small>现存重症</small>
            </td>
       </tr>
        <tr class="text-center">
            <td scope="row">
	            <small>较昨日:{{staticService.confirmedIncr}}</small>
	            <h4 style="color:#CC6600">{{staticService.confirmedCount}}</h4>
	            <small>累计确诊</small>
            </td>
            <td>
	            <small>较昨日:{{staticService.deadIncr}}</small>
	            <h4 style="color:#555555">{{staticService.deadCount}}</h4>
	            <small>类似死亡</small>
           </td>
          <td>
              <small>较昨日:{{staticService.curedIncr}}</small>
              <h4 style="color:#00FF66">{{staticService.curedCount}}</h4>
              <small>累计治愈</small>
         </td>
      </tr>
  </table>

这里是用来展示各个省和地区数据的位置:

<table class="table table-hover tableFont">
      <thead class="bg-primary">
           <tr>
                 <th>地区</th>
                 <th>现存确诊</th>
                 <th>累计确诊</th>
                 <th>死亡</th>
                 <th>治愈</th>
           </tr>
     </thead>
     <tbody v-for="(hubei,key) in areaStat">
           <tr class="my-bg-td" @click="selectShengfen">
                 <td scope="row" v-bind:id="hubei.provinceShortName">>{{hubei.provinceShortName}}</td>
                 <td>{{hubei.currentConfirmedCount}}</td>
                 <td>{{hubei.confirmedCount}}</td>
                 <td>{{hubei.deadCount}}</td>
                 <td>{{hubei.curedCount}}</td>
            </tr>
            <tr v-bind:class="hubei.provinceShortName" v-for="city in hubei.cities" v-bind:style="{'visibility': (key==0?'visible':'collapse')}">
                  <td scope="row">{{city.cityName}}</td>
                  <td>{{city.currentConfirmedCount}}</td>
                  <td>{{city.confirmedCount}}</td>
                  <td>{{city.deadCount}}</td>
                  <td>{{city.curedCount}}</td>
             </tr>
      </tbody>
</table>

另外,我们只默认显示一个读取的地市数据,其它地市默认是被折叠起来的,可以通过给省份行添加一个事件来处理:

//表格的省份折叠处理
selectShengfen: (e) => {
    //获得点击的省份ID
    let shengfen = e.currentTarget.firstElementChild.id;
     if ($("." + shengfen).css("visibility") == "visible") {
               $("." + shengfen).css("visibility", "collapse");
     } else {
             $("." + shengfen).css("visibility", "visible");
      }
}

到这里,我们就大功告成了,现在取访问一下,享受成功的喜悦吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值