基于先前系統(tǒng)導(dǎo)出漢字庫的拼音獲取

基于先前系統(tǒng)導(dǎo)出漢字庫的拼音獲取

正常來講,一般拿到這個問題后,語言選型應(yīng)該是Python吧,但是考慮到項目全棧JS,又考慮到后續(xù)的兼容性,所以就選了JavaScript,本來挺簡單的,因為存在異步的問題,還是有一些小曲折的,代碼邏輯極其簡單,不多作注釋了。

具體講講獲取方法,找到一個提供異步提交獲取漢字讀音的網(wǎng)站上作循環(huán)提交,但是我根據(jù)Chrome Tools里的請求信息,實在構(gòu)造不好請求(https請求),一直提交失敗,好在chrome支持將請求復(fù)制為curl命令,又好在JavaScript天然支持執(zhí)行bash或cmd的原生命令,所以技術(shù)路線已經(jīng)很明顯了,根據(jù)拿到的curl,替換掉查詢部分值,構(gòu)造好命令字符串后,JavaScript調(diào)用接口執(zhí)行命令,獲得返回值,提取Payload部分,判斷是否多音字等,一系列處理后存入數(shù)據(jù)庫,一個字和它每個讀音為一條記錄。

好在網(wǎng)站不校驗我這種無良做法。所以不太需要人為干預(yù)獲取過程。

字庫2W+,最初直接獲取全部結(jié)果集+一個循環(huán)讀取+直接請求,電腦喜聞樂見地死掉了,后來改為使用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;
                }
            })
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,917評論 25 709
  • 愿你在新的一年,變得更強(qiáng)大,因任何理由,以任何手段。 第一天陳奕迅 大傻子相隔遙遠(yuǎn) 冥冥宿命時代留座 共計1629...
    暉暉曉閱讀 297評論 0 0
  • 我們開發(fā)項目的過程中通常會碰到一種需求,某個對象包含多種狀態(tài)變化的可能性,隨著狀態(tài)的變化行為也執(zhí)行不同的動作。 以...
    伍阿哥閱讀 535評論 0 0
  • (一) 有一類朋友,朋友有余,戀人未滿。不是缺少點什么,只因為曖昧打破之后,朋友都做不成了。 我喜歡過一個男孩。他...
    豆豆不喜歡吃芹菜閱讀 293評論 0 0

友情鏈接更多精彩內(nèi)容