驾校答题小程序实战全过程【连载】——4.题目采集与测试
2018-11-19 本文已影响29人
大王12
由于没有数据,这次需要拿一些测试数据放到数据库。 这里想到本地采集,大家可以随意用任何后端语言,Python,PHP,Golang,Java,nodejs等等, 这里我就不用其他语言,使用接近JavaScript语法的,nodejs,采集后生成CSV文件。
主要用到三个库:
- 网络库
- 解析库
- 文件库
这里找到一个采集的地址:
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,时间第一,并没有采集图片,如果正式上线,还需要采集图片并上传。