天天看點

node.js爬蟲應用——前端程式員的詞典command-translator

雖然聯考英語考了135分,大學英語四級也過了,可到現在,寫了兩年代碼,經常在寫一個變量的時候,想半天也想不出來對應的英文單詞是什麼,總不能很可 (sha) 愛(bi) 的去用拼音吧,最後還是隻能去求助有道了。雖然說打開有道網頁,然後輸入詞語翻譯不算太麻煩,擔保每次都這樣,總覺得不夠友善,也不夠逼格。

 先來看看我現在用的工具好了,首先安裝command-translator:

cnpm i -g command-translator

 然後打開一個指令行直接翻譯:

tl 翻譯
# 輸出如下
translate
interpret
translator
interpreter           

夠簡單了吧,下面來看看怎麼實作的。

 在寫這個工具之前,我也用過一些插件,如果你用Alfred, 那麼你應該已經用過一些翻譯插件了。後來我覺得它顔值沒有自帶的spotlight高,是以就解除安裝了,然後裝了個flashlight, 然而那裡面的插件太少了,有一個有道翻譯插件,然而隻能英文翻譯成中文,要它何用?最後打算自己寫一個,可折騰了兩天後,發現flashlight有問題,似乎是識别不了輸入的中文,大概有道那個插件也是遇到這個問題,才沒有做中文翻譯英文吧。後來想着現在我們一般用vscode比較多,寫個vscode插件也不錯吧。然而vscode插件的指令中好像是帶不了參數,如果用一個指令來啟動插件,然後再輸入要翻譯的詞語,最後再顯示翻譯結果,那還是太難用了。最後想着就寫個指令行裡面的翻譯工具吧,對于前端程式員而言,node肯定是裝了的,就用node來寫。

 其實有了思路後,就很簡單了。首先是要拿到翻譯的結果。直接調用接口的很多,有道官方也有,不過都需要去申請一個key,個人比較反感,就簡單點,直接爬網頁,分析dom。整個程式用了兩個第三方子產品:cheerio處理dom,類似jquery的文法;commander用來簡化指令行互動,TJ大神的大作。

 首先爬取頁面,解析結果,這裡爬的是金山詞霸的頁面,之前寫論文時感覺對于一些專業詞彙,金山翻譯的更準确。幾行代碼就能搞定,這裡直接上代碼好了:

const http = require('http')
const cheerio = require('cheerio')
const baseUrl = "http://www.iciba.com/"
function spider(word){
  return new Promise((resolve,reject)=>{
    http.get(encodeURI(baseUrl+word),res=>{
      let html=''
      res.on('data',data=>html+=data)
      res.on('end',()=>resolve(html))
    })
  })
}
function parse(html){
  const ch = cheerio.load(html)
  const res = []
  ch(".js-base-info .in-base .base-list p span").each((i,el)=>{
    res.push(ch(el).text().replace(new RegExp(';'),''))
  })
  return res
}

module.exports = function(word){
  return new Promise((resolve,reject)=>{
    spider(word).then(html=> resolve(parse(html)))
  })
}           

然後我麼調用導出的方法,傳參為需要翻譯的詞語,中文英文都可以,最後傳回的就是一個數組,為翻譯結果。

 最後要解決的是指令行直接輸入

tl <word>

直接翻譯,這部分代碼寫在一個js檔案中,我把它叫做bin.js, 然後在package,json配置一個key為"tl"的bin,指向bin,js即可。bin,js就是擷取tl後面的參數,然後調用上面導出的那個方法來翻譯,最後把結果列印出來即可,代碼:

#!/usr/bin/env node
const program = require('commander')
const translate = require('./translator')
program.version(require('./package.json').version)
  .action((arg,cmd)=>{
    translate(arg).then((res=[])=>{
      res.forEach(r=>console.log(r)
    })
  })
  .parse(process.argv)
           

OK了,以後翻譯隻需快捷鍵打開終端,輸入

tl <word>

就可以了。

 什麼?你不用node,你是寫java的?都什麼年代了,還不學我,來搞一波前端,當年我可是寫過C艹,後來C艹艹,再後來Android、Java,然後轉前端的。開玩笑啦,看完這篇文章,随便你用什麼語言都能很快寫一個這樣的詞典出來。

 以後如果再看到你身邊的朋友還在打開網頁來翻譯,或者用拼音的,直接把這篇文章丢給他把

原文釋出時間為:2018年05月06日

原文作者:

 孤丶狼丶

本文來源:

開源中國

如需轉載請聯系原作者

繼續閱讀