美文网首页微信小程序开发Bmob后端云-让移动开发更简单Android开发经验谈
驾校答题小程序实战全过程【连载】——4.题目采集与测试

驾校答题小程序实战全过程【连载】——4.题目采集与测试

作者: 大王12 | 来源:发表于2018-11-19 11:52 被阅读29次

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

    主要用到三个库:

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

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

    一、 选择Table 打印这效果

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

    二、提取标题

    由于数据库,标题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)
          });
    
    2.png

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

    三、提取题目内容

    3.png

    四、完成导入

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


    4.png

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


    5.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即可,然后后台点击导入,采集到数据后,进行处理,分四步:
    拿到标题
    拿到结果
    分析出正确答案
    整理数据格式导出CSV
    由于这里100题只是为了做Demo,时间第一,并没有采集图片,如果正式上线,还需要采集图片并上传。

    相关文章

      网友评论

        本文标题:驾校答题小程序实战全过程【连载】——4.题目采集与测试

        本文链接:https://www.haomeiwen.com/subject/mumofqtx.html