K12教育小初高各个版本教材内的章节数据

K12教育小初高各个版本教材内的章节数据

点点

2021-05-10 10:53 阅读 300 喜欢 0

一个“相对”权威的资源网站,然后把这个网站上的所有章节、教材全部爬下来,进行保存数据库,用于我们后续教学方面的基础数据。 先说下结果:算上小学、初中、高中三个学段,所有学科下共计5151本册别,所有册别下所包括的章节共计187123个章节。

简单记录下,一是为了后续可能还会有类似的情况而数据丢了,二是为了其他人可能有类似的情况,方便实现。

相关准备

目标网址:国家教育资源公共服务平台 数据库:mysql 爬虫语言:nodejs 编辑器:sublime text3 浏览器:chrome

思路

首先了解下目标网址下章节信息是如何获得的,如果是异步的话,尝试看能否直接通过调用获取,否则的话就通过html解析内容获得数据。 经过确认后,发现章节信息是从html内的js写死的,根据不同的地址返回不同的章节,所以,只需要把所有的地址拿到,然后访问获得章节即可。 根据学段、学科、出版社进行循环遍历获得所有的册别地址,然后用后续进行轮询。

大体实现

  //根据该函数获得学科、教材、册别等信息
  class getHtml {
constructor(url){
    this.url = url;
}
getContent(){
    return new Promise((resolve,reject)=>{
        request.get(this.url)
        .then( res=>{
            resolve(res.text);
        }).catch(err=>{
            reject(err);
        })
    });
}
//根据内容获得某一部分的地址
getGradeHref(text,index){
    var $ = cheerio.load(text);
    var grades = $('.check_choice_list>li').eq(index).find('p a');
    var arr = [];
    grades.each( (index,item)=>{
        arr.push($(item).attr('href'));
    });
    return arr;
}
//获得
}
//然后通过该函数进行循环获取所有的地址,然后存储到数据库中,目前共计5151条记录。

根据数据库存储的册别地址,一个一个的获取就好了。

  //从国家教育资源公共服务平台获取章节目录信息并进行存储

   var request = require('superagent');

   var cheerio = require('cheerio');

   var fs = require('fs');

  var query = require('simple-mysql-query');
   query({
host : '127.0.0.1',
port : '3306',
user : 'root',
password : 'root',
database : 'test'
  });

 class Fetch{
constructor(){
    this.suc = 0;
    this.current = null;
    this.err = 0;
}
//获得下一个未完成的数据并继续
getNext(){
    var that = this;
    return new Promise((resolve,reject) => {
        query({
            sql : 'select * from chapterurl where done =0 limit 0,1',params : []
        }).then( rs => {
            var rst = rs[0];
            if(rst.length == 0){
                that.current = null;
                resolve(null);
            }else{
                that.current = rst[0].id;
                resolve(rst[0].url);
            }
        }).catch(err=>{
            reject(err);
        })
    });
}
//从页面获得章节信息
fetchArr( url ){
    var that = this;
    return new Promise((resolve,reject)=> {
        if(url){
            request.get(host+url)
            .set({
                'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
                'Accept-Encoding': 'gzip, deflate',
                'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8',
                'Cache-Control': 'no-cache',
                'Connection': 'keep-alive',
                'Cookie': 'UM_distinctid=1667c2776e2ba4-053f6c4dfa889e-8383268-1fa400-1667c2776e367c; USER=40be8854-6a4a-4cdc-95ec-f863add22572; name=value; JSESSIONID=12574E63722E3472694692F8E8F83529; soweb123=so-web06; CNZZDATA1255309935=1698827792-1539679457-http%253A%252F%252Fwww.eduyun.cn%252F%7C1539823023; Hm_lvt_d251d7d8815cdb16dd7b3407d1e80eba=1539681324,1539681583,1539735613,1539824040; CNZZDATA1254936525=38783214-1539681033-http%253A%252F%252Fwww.eduyun.cn%252F%7C1539819962; Hm_lpvt_d251d7d8815cdb16dd7b3407d1e80eba=1539824492',
                'Host': 'so.eduyun.cn',
                'Pragma': 'no-cache',
                'Upgrade-Insecure-Requests': '1',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
            })
            .then( res=> {
                var text = res.text;
                var rs = /booktree.loadtree\((.*)}]\);/.exec(text);
                var get = rs[1]+'}]';
                var arr = JSON.parse(get);
                var arr2 = that.flatt(arr);
                console.log('共计章节数量:'+arr2.length);
                resolve(arr2);
            }).catch(err=>{
                resolve([]);
            })
        }else{
            resolve(null);//null代表结束
        }
    });
}
//数据持久-数据库
store (arr) {
    var that = this;
    //直接一次全部存储
    var sql = 'insert into chapterinfo (bookCatelogId,bookCatelogName,bookId,bookName,isKe,parentId,pubVerID,pubVerName,schoolPhaseId,schoolPhaseName,seqNo,subjectId,subjectName,vNo,zhouCi) values ',
        params = [];
    if(arr === null){
        return -1;//结束
    }else if(arr.length ===  0){
        return new Promise((resolve,reject)=>{
            console.log('本章节虽然可能会成功,但是没有章节数据')
            query({
                sql : 'update chapterurl set done=2 where id=? ',params : [that.current]
            }).then( rs => {
                resolve(1);
            }).catch(err=>{
                resolve(2);
            })
        });
    }
    for(var i =0;i<arr.length;i++){
        var item = arr[i];
        sql += '( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'+(i == arr.length-1 ? '' : ',');
        params = params.concat([item.bookCatelogId,item.bookCatelogName,item.bookId,item.bookName,item.isKe,item.parentId,item.pubVerID,item.pubVerName,item.schoolPhaseId,item.schoolPhaseName,item.seqNo,item.subjectId,item.subjectName,item.vNo,item.zhouCi]);
    }
    return new Promise((resolve,reject) => {
        query([{sql : sql,params : params},{sql : 'update chapterurl set done=1 where id=?',params : [that.current]}]).then( rs => {
            resolve(1);
        }).catch(err=>{
            console.log(err);
            resolve(2)
        });
    });
}
//数组扁平化
flatt (arr) {
    var that = this;
    var newarr = [],flag = true;
    arr.forEach( item => {
        //如果有children就提取出来,放在arr中
        if(item.children && item.children.length > 0){
            var children = item.children;
            item.children = null;
            newarr.push(item);
            newarr = newarr.concat(children);
            flag = false;
        }else{
            newarr.push(item);
        }
    })
    if(flag){
        return newarr;
    }else{
        return that.flatt(newarr);
    }
}
}

var ins = new Fetch();

function gogogo(){
ins.getNext()
.then( url => {
    return ins.fetchArr(url);
})
.then( arr => {
    return ins.store(arr);
})
.then( rs => {
    if(rs === 1){
        console.log('章节存储成功一个');
        gogogo();
    }else if(rs === 2){
        console.log('章节存储失败,切换下一个')
        gogogo();
    }else if(rs === 0){
        console.log('本章节无数据,切换下一个?如果连续出现请检查')
        gogogo();
    }else if(rs === -1){
        console.log('数据库已经清空,章节全部存储结束')
    }
})
.catch(err=> {
    console.log(err);
})
}

gogogo()

由于是一次性工作,大体实现到结果就完了。 如果对实现完全不感兴趣,只想得到结果的,那么请访问这里:https://pan.baidu.com/s/1qgKiap5PIhVXbxRevg0r9g , 密码是: 46ba

转载请注明出处: http://sdxlp.cn/article/zhangjie.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
智能手机已经很普遍了,苹果手机是国内很多人的主流手机,因为拥有强悍的手机性能,还有流畅的使用体验,拥有一大批的果粉,但是很多用户都是第一次使用,所以想要知道苹果手机录屏功能在哪里?
生活中,小伙伴们肯定也遇到了这样的问题。点点给小伙伴们解惑来了。好多天没开电脑啦!正好用到电脑,刚打开就傻眼啦。结果开机进不了系统,蓝屏显示自动修复失败,立马选了启动修复,但可想而知不起作用。主要是不想花钱,嘻嘻。经过几天的折腾,终于,柳暗花明,进入系统。下面给点点分享这几天所查到并使用的方法,以及最后是用什么方法解决的。
现在的智能手机系统一般分为苹果系统与安卓系统,安卓系统的内存本来就比较少,安卓生态较为混乱,开发人员技术水平参差不齐,安卓手机的目录总是很混乱。有些像小编一样有强迫症的人就喜欢清理一些没用的文件或文件夹,还自己手机一点内存。最好是有点底子小伙伴使用呦,如果看不到建议使用手机自带的清理软件。
苹果12app下载不了软件怎么办?IPhone12App Store下载不了东西?在使用IPhone12手机时,出现App Store应用商店无法下载软件的情况时,该怎么解决这种问题呢,苹果12app下载不了软件怎么办,怎么解决IPhone 12Apple Store下载不了东西问题,下面就和点点一起来看看吧!
微信是我们常用的交流工具,我们在平时聊天中会发送图片产生内存过大的问题,很多小伙伴对此非常头疼,那么我们该怎样处理哪,点点告诉小伙伴们在电脑端怎么去查看导出并删除的方法。
手机微信朋友圈中经常会看到很多好友都是只发文字不发图片,但是很多小伙伴们在发朋友圈的时候不知道微信朋友圈怎么发文字不发图片,不知道具体怎么操作?
腾讯公司的微信、QQ都是现在十分常用的社交软件,很多的功能,都是可以相互使用的,可以在工作与生活中,增加很多的便利,有些新用户不知道如何将手机微信表情包发送到QQ.
青少年玩游戏的很多,但大部分都是用家长的手机,玩游戏哪就免不了会充个会员啊!买个装备之类,这就需要钱了,微信的钱就会不知不觉的少掉,家长该怎么处理那?目前青少年模式需要更新微信ios最新版本7.0.17以上的版本才可以使用。