python3--googletrans超时报错解决以及翻译工具优化(附源码)

一. 问题:

在写调用谷歌翻译接口的脚本时,老是报错,我使用的的是googletrans这个模块中Translator的translate方法,程序运行以后会报访问超时错误:

httpcore._exceptions.ConnectTimeout: timed out

二. 解决方法:

1.寻找解决方法

经过多方资料查找,最后才知道google翻译对接口进行了更新,之前用的googletrans已经不能用了。但是网上大神已经开发出了新的方法

https://github.com/lushan88a/google_trans_new

在此道一声感谢!

2.使用解决方法

在cmd中输入以下指令即可。

pip install google_trans_new

3.调用

这里用代码举个例子,将语言翻译成中文(简体)

from google_trans_new import google_translator
text=‘’‘Sentences you want to translate into chinese’‘’
aim_lang='zh-CN'
t = google_translator(timeout=10)
translate_text = t.translate(text, aim_lang)

三. 代码(优化)

from google_trans_new import google_translator
from multiprocessing.dummy import Pool as ThreadPool
import time
import re
"""
此版本调用最新版google_trans_new
使用多线程访问谷歌翻译接口
能够翻译len(text)>5000的文本
"""
class Translate(object):
    def __init__(self):
    	#初始化翻译文本路径以及翻译目标语言
        self.txt_file='./test.txt'
        self.aim_language='zh-CN'
        
	#读入要翻译的文本文件
    def read_txt(self):
        with open(self.txt_file, 'r',encoding='utf-8')as f:
            txt = f.readlines()
        return txt
	
	#进行文本处理,此为优化
    def cut_text(self,text):
        #如果只是一行,就切割成5000字一次来翻译
        if len(text)==1:
            str_text = ''.join(text).strip()
            #筛选是一行但是文本长度大于5000
            if len(str_text)>5000:
                #使用正则表达式切割超长文本为5000一段的短文本
                result = re.findall('.{5000}', str_text)
                return result
            else:
                #如果文本为一行但是这一行文本长度小于5000,则直接返回text
                return text
            """
            如果不止一行,加以判断
             (1)每行字符数都小于5000
            (2)有的行字符数小于5000,有的行字符数大于5000
            """
        else:
            result = []
            for line in text:
                #第(1)种情况
                if len(line)<5000:
                    result.append(line)
                else:
                    # 第(2)种情况,切割以后,追加到列表中
                    cut_str=re.findall('.{5000}', line)
                    result.extend(cut_str)
            return result

    def translate(self,text):
        if text:
            aim_lang = self.aim_language
            try:
	            t = google_translator(timeout=10)
	            translate_text = t.translate(text, aim_lang)
	            print(translate_text)
	            return translate_text
            except Exception as e:
                print(e)

def main():
    time1=time.time()
    #开启八条线程
    pool = ThreadPool(8)
    trans = Translate()
    txt = trans.read_txt()
    texts = trans.cut_text(txt)
    try:
        pool.map(trans.translate, texts)
    except Exception as e:
        raise e
    pool.close()
    pool.join()
    time2 = time.time()
    print("一共翻译了 {} 个句子,消耗了 {:.2f} s".format(len(texts),time2 - time1))

if __name__ == "__main__" :
    main()

测试文本我放在了https://wws.lanzous.com/iD2a2jkixvg

可自行下载。

四. 判断思路

中间的判断搞得我都有点乱了,怕注释说不明白,特用visio画了流程图,在此附上我的主要代码逻辑以供参考。
在这里插入图片描述

五. 运行结果

在这里插入图片描述

六. 总结

  • 本篇首先解决了调用googletrans模块的报错问题,然后使用新的google翻译模块编写了代码,并且解决了我这篇文章中翻译文本长度不能大于5000的问题。思路、代码方面有什么不足欢迎各位大佬指正、批评!

Guess you like

Origin blog.csdn.net/a1397852386/article/details/111479024