美文网首页
基于先前系统导出汉字库的拼音获取

基于先前系统导出汉字库的拼音获取

作者: 环零弦 | 来源:发表于2017-08-06 11:00 被阅读0次

基于先前系统导出汉字库的拼音获取

正常来讲,一般拿到这个问题后,语言选型应该是Python吧,但是考虑到项目全栈JS,又考虑到后续的兼容性,所以就选了JavaScript,本来挺简单的,因为存在异步的问题,还是有一些小曲折的,代码逻辑极其简单,不多作注释了。

具体讲讲获取方法,找到一个提供异步提交获取汉字读音的网站上作循环提交,但是我根据Chrome Tools里的请求信息,实在构造不好请求(https请求),一直提交失败,好在chrome支持将请求复制为curl命令,又好在JavaScript天然支持执行bash或cmd的原生命令,所以技术路线已经很明显了,根据拿到的curl,替换掉查询部分值,构造好命令字符串后,JavaScript调用接口执行命令,获得返回值,提取Payload部分,判断是否多音字等,一系列处理后存入数据库,一个字和它每个读音为一条记录。

好在网站不校验我这种无良做法。所以不太需要人为干预获取过程。

字库2W+,最初直接获取全部结果集+一个循环读取+直接请求,电脑喜闻乐见地死掉了,后来改为使用LIMIT方式一条一条获取,外层一个Interval 500ms检查一次上次请求完事儿没,完事儿了就获取下一个字,再请求这个字的读音,这么做时间慢一些(乐观时间估计:20000 / 2 / 60 /60 = 2.78h),但起码不影响电脑的使用,而且也算得上无良届的良心做法了。

var mysql = require('mysql');
var exec = require('child_process').exec;
var trunk1 = 'curl "https://zhongwenzhuanpinyin.51240.com/web_system/51240_com_www/system/file/zhongwenzhuanpinyin/data/?ajaxtimestamp=1501983414997" -H "pragma: no-cache" -H "origin: https://zhongwenzhuanpinyin.51240.com" -H "accept-encoding: gzip, deflate" -H "accept-language: zh-CN,zh;q=0.8" -H "user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" -H "content-type: application/x-www-form-urlencoded" -H "accept: */*" -H "cache-control: no-cache" -H "authority: zhongwenzhuanpinyin.51240.com" -H "cookie: zwzyp_wenzi=0; zwzyp_jiange=1; zwzyp_shengdiao=0; Hm_lvt_fbe0e02a7ffde424814bef2f6c9d36eb=1501837611,1501933953,1501933982,1501982487; Hm_lpvt_fbe0e02a7ffde424814bef2f6c9d36eb=1501982487" -H "referer: https://zhongwenzhuanpinyin.51240.com/" --data "zwzyp_zhongwen="';
var trunk2 = '&zwzyp_shengdiao=0&zwzyp_wenzi=0&zwzyp_jiange=1&zwzyp_duozhongduyin=1" --compressed';
var limitBase = -1;
var runFlag = true;
var conn = mysql.createConnection({
    host: '192.168.1.240',
    user: 'root',
    password: 'root',
    database:'db_test',
    port: 3306
});
conn.connect();

setInterval(function(){
    if(runFlag) {
        runFlag = false;
        limitBase = limitBase + 1;
        var statement = 'SELECT * from xt_hanziku_copy LIMIT ' + limitBase + ', ' + 1;
        // console.log(statement);
        conn.query(statement, function(err, rows, fields) {
            if (err) console.log(err);
            if(rows.length !== 0) {
                var _hanzi = rows[0].hanzi;
                queryCallback(_hanzi);
                console.log(limitBase + '    ' + _hanzi);
            } else {
                console.log('Finished!');
            }
        });
    }
}, 500);

// conn.end();

function queryCallback (hanzi2) {
    var payload = encodeURI(hanzi2);
    var realPayload = trunk1 + payload.replace(/%/g,'"%"').substring(1) + trunk2;
    // console.log(realPayload);
    var child_suf = exec(realPayload,(error, stdout, stderr) => {
        if (error) console.log(error);
        handdler (hanzi2, stdout);
    });
}

function handdler (hanzi3, stdout) {
    stdout = stdout.substring(142, stdout.length - 18).trim();
    var leftPos = stdout.indexOf('(');
    var resultArray = [];
    if(leftPos !== -1) {
        resultArray.push(stdout.substring(0, leftPos));
        var tmpArray = stdout.substring(leftPos + 1, stdout.length - 1).split('、');
        for(var count = 0; count < tmpArray.length; ++count){
            resultArray.push(tmpArray[count]);
            if(count + 1 === tmpArray.length) {
                getArray(resultArray, hanzi3);
            }
        }
    } else {
        conn.query('INSERT INTO db_result VALUES ("' + hanzi3 + '","' + stdout + '")', function(err, result) {
                if(err) console.log(err);
                runFlag = true;
            })
    }
}

function getArray(a, b) {
    var hash = {},
    len = a.length,
    result = [];
    for (var i = 0; i < len; i++){
        if (!hash[a[i]]){
            hash[a[i]] = true;
            conn.query('INSERT INTO db_result VALUES ("' + b + '","' + a[i] + '")', function(err, result) {
                if(err) throw err;
                if(i === len) {
                    runFlag = true;
                }
            })
        }
    }
}

相关文章

  • 基于先前系统导出汉字库的拼音获取

    基于先前系统导出汉字库的拼音获取 正常来讲,一般拿到这个问题后,语言选型应该是Python吧,但是考虑到项目全栈J...

  • 在jupyter中用python自己写策略回测的基本思路

    1、k线数据的获取和保存股票和期货k线数据的获取途径:1.1 从通达信里面下载:【系统】-【数据导出】-【高级导出...

  • 制作汉字库

    1、 用这个软件制作汉字库 生成的汉字库(逐行式) 2、 得到汉子库文件,且将汉字库后缀改为.bin 3、 将汉子...

  • iOS 索引功能

    简介UITableView索引功能是常见的,主要是获取中英文的首字母并排序,系统自带获取首字母 类似获取拼音的第三...

  • 获取通讯库中外文首字排序(弱鸡篇)

    要做的东西正如标题所述,在网上搜一下不难发现有两位大佬已经写过相关的模块,php根据汉字获取拼音(php基于拼音搜...

  • 强制系统获取的定位地点为中文

    系统语言为英文时,定位默认返回英文或拼音,系统语言是中文时才返回中文。 需求: 强制系统获取的定位地点为中文。 此...

  • iOS 中文转拼音

    需求:获取中文的拼音 一.系统方法 优点:调用简单缺点:多音字,不能识别,比如长沙-->会被识别成zhangsha...

  • 通过Java反射机制使用系统隐藏API

    对于基于系统平台开发应用的开发者来说,在一些应用场景下常常需要我们获取系统隐藏API来处理问题,下面我们以获取系统...

  • vue+elementUI导出数据为WORD

    导出为WORD: 获取要导出的数据; 将获取到的数据渲染到一个容器中

  • 流文件导出直接下载

    文件的异步导出,此处是采用post的方法导出excel 调用接口获取流文件之后获取数据,进行下载处理 文件下载ok

网友评论

      本文标题:基于先前系统导出汉字库的拼音获取

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