Python 翻译查词接口笔记

Python 翻译查词接口笔记

一个学长想让我用 Python 写个翻译词的接口,调用时给一个中文或英文的词,返回前 5 个翻译,如果翻译数不足 5 就全部返回,在查找 API 时遇到了一些坑,做一些记录。

翻译接口类型

本地型

googletrans

优点:

1,接口使用方便;

2,本地调用,速度比较快;

3,支持多种语言;

缺点:

只能返回一个翻译结果。

下载:
pip install googletrans
使用示例:
from googletrans import Translator

translate = Translator()
result = translate.translate('你好')
print(result.text)

可在本地使用的翻译 api 只有 googletrans。

在线型

金山查词(最适合)

优点:

1,使用方便,api key 很快就能申请下来;

2,中译英速度较快;

3,有多个翻译返回结果。

缺点:

1,只支持中文和英文的互译;

2,英译中速度较慢。

使用说明:

调用接口后的返回格式:XML/JSON 默认XML

传入参数: w : 单词/汉字 type : 返回格式 为空是xml 传入 xml 或者 json key : 您申请到的key

例如:http://dict-co.iciba.com/api/dictionary.php?w=go&key=****

JSON 字段解释(英文)
{
'word_name':'' #单词
'exchange': '' #单词的各种时态
'symbols':'' #单词各种信息 下面字段都是这个字段下面的
'ph_en': '' #英式音标
'ph_am': '' #美式音标
'ph_en_mp3':'' #英式发音
'ph_am_mp3': '' #美式发音
'ph_tts_mp3': '' #TTS发音
'parts':'' #词的各种意思
}

JSON 字段解释(中文)
{
'word_name':'' #所查的词
'symbols':'' #词各种信息 下面字段都是这个字段下面的
'word_symbol': '' #拼音
'symbol_mp3': '' #发音
'parts':'' #汉字的各种翻译 数组
'net_means': '' #网络释义
}

返回结果示例:http://dict-co.iciba.com/api/dictionary.php?w=%E7%85%A7%E7%89%87&key=67390AEB41CA5E64FF2E6D317C2041DE&type=json

{"word_name":"\u7167\u7247","symbols":[{"word_symbol":"zh\u00e0o pi\u00e0n","symbol_mp3":"","parts":[{"part_name":"","means":[{"word_mean":"photograph","has_mean":"1","split":1},{"word_mean":"photoprint","has_mean":"1","split":1},{"word_mean":"pin","has_mean":"1","split":1},{"word_mean":"picture","has_mean":"1","split":1},{"word_mean":"photo","has_mean":"1","split":0}]}],"ph_am_mp3":"","ph_en_mp3":"","ph_tts_mp3":"","ph_other":""}]}
代码示例:
def process_ch2en_request(request_url, form_data):
    try:
        r = requests.get(request_url, params=form_data)
        data = r.json()
    except Exception as e:
        print('request error occurred')
    try:
        symbols = data['symbols'][0]
        parts = symbols['parts'][0]
        means = parts['means']
        words_length = 5
        means_length = len(means)
        if means_length < 5:
            words_length = means_length
        word_means = []
        for i in range(0, words_length):
            word_means.append(means[i]['word_mean'])
        return word_means
    except KeyError as e:
        print(form_data['w'] + " doesn't have appropriate translation")
        return []
注意点:

1,有些单词没有对应的翻译,比如在金山词霸上查 暑假,有翻译,查 放暑假,也有翻译,但在接口中 放暑假 没有对应的翻译;

2,英译中我在 3000 多调用后有时会返回空,但将词放入网址直接翻译返回的 json 是正常的,所以最好还是加上异常处理;

3,中译英和英译中的接口返回数据格式不一样,调用的时候注意区分好;

百度翻译

优点:

1, 文档比较详细;

2,提供多种不同专用领域的翻译接口,比如通用翻译,语种识别,拍照翻译等;(虽然都没试过)

缺点:

1,使用较复杂,有对返回数据的加密处理,需要自己结合文档处理数据;

2,有翻译字符数限制,当月超过 200万 字符需支付超出部分费用;

3,由于是网络调用,多少应该会慢一些;

4,只能返回一个翻译结果。

因为看了百度翻译的文档后知道只能返回一个结果就没有使用,但文档还是挺详细的,使用起来应该还比较简单。

(有道翻译)[http://fanyi.youdao.com/openapi]

优点:

1,使用简单,没有对数据加密处理;

缺点:

1,请求频率限制是每小时 1000 词,超过限制会被封禁;

2,词典翻译只支持中英文互译;

3,字符长度不能超过 200 个字符;

4,只返回一个翻译结果。

也是看了只返回一个翻译结果就没再使用。。。

Google翻译

优点:

1,支持多种自然语言;

2,支持多种编程语言,Python,Java,C#,GO等等;

3,文档很详细;

缺点:

1,文档虽然很详细但还是挺复杂的……不知道看哪里…;

2,申请免费试用需要填写 visa 卡;

3,好像是只返回一个翻译结果;

4,使用的时候也有限额;

5,返回结果有加密,需要按照文档处理。

同样也是因为只返回一个结果放弃了。。。(更重要的也是穷学生没有 visa 信用卡……)。

待尝试

因为 Google translate 的接口只返回一个结果,但网页版的 Google 翻译可以有多个返回结果,并且有标有星级显示相关度,应该可以写爬虫通过网页版 Google 翻译进行多返回结果的翻译,但速度应该会很慢……

个人代码实现(金山查词接口):

import requests
import csv
import xlrd

my_key = '***'
look_up_type = 'json'

def process_ch2en_request(request_url, form_data):
    try:
        r = requests.get(request_url, params=form_data)
        data = r.json()
    except Exception as e:
        print('request error occurred')
    try:
        symbols = data['symbols'][0]
        parts = symbols['parts'][0]
        means = parts['means']
        words_length = 5
        means_length = len(means)
        if means_length < 5:
            words_length = means_length
        word_means = []
        for i in range(0, words_length):
            word_means.append(means[i]['word_mean'])
        return word_means
    except KeyError as e:
        print(form_data['w'] + " doesn't have appropriate translation")
        return []

def process_en2ch_request(request_url, form_data):
    try:
        r = requests.get(request_url, params=form_data)
        data = r.json()
    except Exception as e:
        print('request error occurred')
    try:
        symbols = data['symbols'][0]
        parts = symbols['parts'][0]
        means = parts['means']
        words_length = 5
        means_length = len(means)
        if means_length < 5:
            words_length = means_length
        word_means = []
        for i in range(0, words_length):
            word_means.append(means[i])
        return word_means
    except KeyError as e:
        print(form_data['w'] + " doesn't have appropriate translation")
        return []

def jinshan(word, lan2lan):
    request_url = 'http://dict-co.iciba.com/api/dictionary.php?'
    form_data = {'w': word, 'key': '***',
                 'type': 'json'}
    if(lan2lan=='en2ch'):
        word_means = process_en2ch_request(request_url, form_data)
    elif(lan2lan=='ch2en'):
        word_means = process_ch2en_request(request_url, form_data)
    return word_means

def translate2csv(file2store, original_word, lan2lan):
    word_means = jinshan(original_word, lan2lan)
    with open(file2store, 'a', encoding='utf-8') as csv_file:
        writer = csv.writer(csv_file)
        for word_mean in word_means:
            writer.writerow([original_word, word_mean])

def translate_csv2csv(csv2read, csv2write, lan2lan):
    with open(csv2read, 'r', encoding='utf8') as csv_file:
        reader = csv.reader(csv_file)
        for row in reader:
            if row[0].isdigit():
                original_word = row[1]
                translate2csv(csv2write, original_word, lan2lan)

def translate_xls2csv(xls2read, csv2write, lan2lan):
    workbook = xlrd.open_workbook(xls2read)
    booksheet = workbook.sheet_by_index(0)
    rownum = booksheet.nrows
    for i in range(0, rownum):
        cell_1 = booksheet.cell_value(i, 0)
        if isfloat_str(cell_1):
            original_word = booksheet.cell_value(i, 1)
            print(original_word)
            translate2csv(csv2write, original_word, lan2lan)

def isfloat_str(str_number):
    try:
        int(str_number)
        return True
    except ValueError:
        return False

def translate_txt2csv(txt2read, csv2write, lan2lan):
    with open(txt2read, 'r', encoding='GBK') as f:
        for line in f:
            word_in_line = line.split()
            print(word_in_line)
            original_word = word_in_line[1]
            translate2csv(csv2write, original_word, lan2lan)

if __name__ == '__main__':
    translate_csv2csv('test.csv', 'test_store.csv', 'ch2en')

如果大家有更合适的 api 接口或者更合适的代码实现希望可以评论帮忙一块修改一下(ノ ̄▽ ̄)

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦