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

本文阅读 3 分钟
首页 安全分享,WEB安全 正文

在写调用谷歌翻译接口的脚本时,老是报错,我使用的的是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画了流程图,在此附上我的主要代码逻辑以供参考。 img

img

  • 本篇首先解决了调用googletrans模块的报错问题,然后使用新的google翻译模块编写了代码,并且解决了我 这篇文章中翻译文本长度不能大于5000的问题。思路、代码方面有什么不足欢迎各位大佬指正、批评!
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/a1397852386/article/details/111479024
-- 展开阅读全文 --
BUUCTF Web [极客大挑战 2019]Knife
« 上一篇 06-24
安全面试之XSS(跨站脚本攻击)
下一篇 » 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复