Serverless实战驾校小程序【考题数据采集】四

magic
2017-12-18 / 0 评论 / 1,236 阅读 / 正在检测是否收录...

Serverless实战驾校小程序【考题练习】四

由于没有数据,这次需要拿一些测试数据放到数据库。 这里想到本地采集,大家可以随意用任何后端语言,Python,PHP,Golang,Java,nodejs等等, 这里我就不用其他语言,使用接近JavaScript语法的,nodejs,采集后生成CSV文件。

主要用到三个库:

  1. 网络库
  2. 解析库
  3. 文件库

这里找到一个采集的地址:
http://www.jiakao.com/cnty/web/km1_tc_new.php?q=1

1. 选择Table 打印这效果

let  table = $('table');

         table.each(function (index, item) {
          let  x = $(this).text();   
          console.log(x)   

选择

2.提取标题

由于数据库,标题title是一个单独字段,这里先把title取出来。
let table = $('table');

      table.each(function (index, item) {
        let x = $(this).find("tr>td").eq(0).text();
        let t = x.split('\n\t');
        console.log(t)
      });

image.png

这里的数据[1]就是标题数据

3. 提取题目内容

image.png

这里不细说了,后面我会放上代码,大家自己看。 无非就是拿到A、b、c、d结果,放到一个对象里面,跟导入的格式一致就行。

4.完成导入

Bmob控制台导入CSV,导入后,效果如下。

image.png

小程序里面,我们测试下。

image.png

放代码

let http = require('http');
let fs = require('fs');
let cheerio = require('cheerio');
let request = require('request');
let iconv = require('iconv-lite');
let i = 0;
let url = "http://www.jiakao.com/cnty/web/km1_tc_new.php?q=1";
//初始url 

function fetchPage (x) {     //封装了一层函数
  startRequest(x);
}


function startRequest (x) {
  //采用http模块向服务器发起一次get请求      
  http.get(x, function (res) {
    let html = '';        //用来存储请求网页的整个html内容
    let titles = [];
    res.setEncoding('binary'); //防止中文乱码

    //监听data事件,每次取一块数据
    res.on('data', function (chunk) {

      html += chunk;
    });
    //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
    res.on('end', function () {
      html = iconv.decode(html, 'gb2312');

      let $ = cheerio.load(html); //采用cheerio模块解析html

      let table = $('table');
      console.log('help,choseList,title,video,type,bType,bModels,bSubjects,pic')
      table.each(function (index, item) {


        let t;
        let d;

        let tArr = [];
        let choseList = [] //{""item"":""6个月""}

        $(this).find("tr>td").each(function (i, items) {
          // t = $(this).eq(0).text().split('\n\t');
          t = $(this).text().split('\n\t');
          if (i == 0) {
            tArr.push(t[1])
          }
          d = $(this).text().trim()

          if (i > 0 && i < 6) {
            if (d.indexOf('A') != -1 || d.indexOf('B') != -1 || d.indexOf('C') != -1 || d.indexOf('D') != -1) {

              let answerStr, answerArr;
              // 获取正确答案
              let okStr = $(this).parent().attr('onclick')
              if (okStr != undefined) {
                answerStr = okStr.substr(25, 3)
                answerArr = answerStr.split(',')
              }


              d = d.split('、');

              if (answerArr[0] == answerArr[1]) {
                choseList.push({ "\"isChose\"": true, "\"item\"": "\"" + d[1] + "\"" })
              } else {
                choseList.push({ "\"item\"": "\"" + d[1] + "\"" })
              }
            }

          }


        })

        console.log(`,"${JSON.stringify(choseList)}",${tArr},,1,413405afba,1,1,`)

      });
    })


  }).on('error', function (err) {
    console.log(err);
  });

}

fetchPage(url);      //主程序开始运行

总结:

Bmob数据库支持CSV导入, 我们把采集到的数据输出为一个CSV即可,然后后台点击导入,采集到数据后,进行处理,分四步。

  1. 拿到标题
  2. 拿到结果
  3. 分析出正确答案
  4. 整理数据格式导出CSV

由于这里100题只是为了做Demo,时间第一,并没有采集图片,如果正式上线,还需要采集图片并上传。时间关系,这一节就到这,有问题可以在下面评论。

21

评论 (0)

取消