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

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

正常来讲,一般拿到这个问题后,语言选型应该是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;
                }
            })
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,573评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,333评论 25 707
  • 愿你在新的一年,变得更强大,因任何理由,以任何手段。 第一天陈奕迅 大傻子相隔遥远 冥冥宿命时代留座 共计1629...
    晖晖晓阅读 234评论 0 0
  • 我们开发项目的过程中通常会碰到一种需求,某个对象包含多种状态变化的可能性,随着状态的变化行为也执行不同的动作。 以...
    伍阿哥阅读 463评论 0 0
  • (一) 有一类朋友,朋友有余,恋人未满。不是缺少点什么,只因为暧昧打破之后,朋友都做不成了。 我喜欢过一个男孩。他...
    豆豆不喜欢吃芹菜阅读 250评论 0 0