调用谷歌翻译API

在平时使用谷歌翻译的过程中,经常会遇到需要批量翻译大量文本的情景,这种时候需要调用谷歌翻译的API

首先可以使用python库googletrans

pip install googletrans
#使用方法
from googletrans import Translator
translator = Translator(service_urls=['translate.google.cn'])
source = '我还是不开心!'
text = translator.translate(source,src='zh-cn',dest='en').text
print(text)

"i'm still not happy!"

但是在面对大规模需要翻译的句子时就会很慢,所以可以使用协程的方法。
这里我们使用了基于gevents库的grequests库。
仔细看了下googletrans库的核心代码,发现主要是构造一个url,然后发起get请求,得到一个json的结果,从中提取出翻译结果。
构造url的过程需要一个token,根据某些规则生成,所以为了方便还是调用googletrans的部分函数。

具体的参考代码如下:
这里是将德语(de)翻译成英语(en),代码中需要相应修改。

import grequests
import logging
import json
from googletrans import Translator
from googletrans.utils import format_json

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
translator = Translator(service_urls=['translate.google.cn'])

logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',filename='log.txt')
logger = logging.getLogger()


def exception_handler(request, exception):
    logger.warning('exception when at %s :%s',request.url,exception)


def work(urls):
    reqs = (grequests.get(u,verify=True, allow_redirects=True, timeout=4) for u in urls)
    res = grequests.map(reqs, exception_handler=exception_handler,size=20)
    return res

def totaltranslate():
    file2 = open('de2en_en.txt',mode='a',encoding='utf-8')

    with open('de.txt',mode='r',encoding='utf-8') as f:
        urls = []
        num = 0
        for line in f:
            num+=1

            line = line.strip()
            token = translator.token_acquirer.do(line)
            url="https://translate.google.cn/translate_a/single?client=t&sl=de&tl=en&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=3&tsel=0&kc=1&tk={0}&q={1}".format(token,line)
            urls.append(url)

            if len(urls) >= 50:
                res = work(urls)
                for r in res:
                    if hasattr(r,'status_code'):
                        if r.status_code == 200:
                            try:
                                a=format_json(r.text)
                                target = ''.join([d[0] if d[0] else '' for d in a[0]])
                                source = ''.join([d[1] if d[1] else '' for d in a[0]])
                            except Exception as e:
                                logger.error('when format:%s',e)
                                logger.error('%s\n%s',r.text)
                                source = ''
                                target = ''
                            if len(source) != 0 and len(target) != 0:
                                file2.write(target+'\n')
                            else:
                                file2.write('\n')
                        else:
                                file2.write('\n')
                urls = []
                logger.info('finish 50 sentence, now at %s',num)
    file2.close()

def sentencetranslate(line):
    line = line.strip()
    text = translator.translate(line,src='de',dest='en').text
    return text

def completetranslate():
    file1 = open('de2en_en.txt',mode='r',encoding='utf-8')
    file2 = open('new_de2en_en.txt',mode='a',encoding='utf-8')
    i = 1
    with open('de.txt',mode='r',encoding='utf-8') as f:
        for line in f:
            t = file1.readline()
            if len(t) == 1:#'only \n'
                text = sentencetranslate(line)
                file2.write(text+'\n')
            else:
                file2.write(t)
            i += 1
            if i%100 == 0:
                print(i)
    file1.close()
    file2.close()


if __name__ == "__main__":
    totaltranslate()
    completetranslate()

totaltranslate()以及翻译了大部分的句子,但是可能因为某些原因有一些句子没有翻译,所以还需要completetranslate()来补全翻译结果。

在grequests.map()中size设置为20的情况下,平均每秒翻译20句。

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

推荐阅读更多精彩内容

  • 废话少说 从速卖通抓取了一些评论想进行一些简单的文本分析,但是因为速卖通是一个跨境电商平台,上边的评论基本都是小语...
    想酷却酷不起来阅读 30,127评论 8 23
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,884评论 25 707
  • 欲 是蛇 吐信 蜿蜒探索 遇洞则入 外力不可拔 性执着 欲 是苹果 红润 甘甜解渴 入口即化 内心不可挡 喜琢磨 ...
    陈言著诗随云飞阅读 264评论 0 1
  • 好不容易度过了极其忙碌的12月,清醒过来后才发现,原来2016已经过去了、、、前段时间不分白天黑夜的忙碌,到这两天...
    红绿乘蓝阅读 377评论 0 0