python3 googletrans超时报错问题及翻译工具优化方案 附源码


Posted in Python onDecember 23, 2020

一. 问题:

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

Traceback (most recent call last): File "E:/PycharmProjects/MyProject/Translate/translate_test.py", line 3, in <module> result=translator.translate('안녕하세요.') File "D:\python3\lib\site-packages\googletrans\client.py", line 182, in translate data = self._translate(text, dest, src, kwargs) File "D:\python3\lib\site-packages\googletrans\client.py", line 78, in _translate token = self.token_acquirer.do(text) File "D:\python3\lib\site-packages\googletrans\gtoken.py", line 194, in do self._update() File "D:\python3\lib\site-packages\googletrans\gtoken.py", line 54, in _update r = self.client.get(self.host) File "D:\python3\lib\site-packages\httpx\_client.py", line 763, in get timeout=timeout, File "D:\python3\lib\site-packages\httpx\_client.py", line 601, in request request, auth=auth, allow_redirects=allow_redirects, timeout=timeout, File "D:\python3\lib\site-packages\httpx\_client.py", line 621, in send request, auth=auth, timeout=timeout, allow_redirects=allow_redirects, File "D:\python3\lib\site-packages\httpx\_client.py", line 648, in send_handling_redirects request, auth=auth, timeout=timeout, history=history File "D:\python3\lib\site-packages\httpx\_client.py", line 684, in send_handling_auth response = self.send_single_request(request, timeout) File "D:\python3\lib\site-packages\httpx\_client.py", line 719, in send_single_request timeout=timeout.as_dict(), File "D:\python3\lib\site-packages\httpcore\_sync\connection_pool.py", line 153, in request method, url, headers=headers, stream=stream, timeout=timeout File "D:\python3\lib\site-packages\httpcore\_sync\connection.py", line 65, in request self.socket = self._open_socket(timeout) File "D:\python3\lib\site-packages\httpcore\_sync\connection.py", line 86, in _open_socket hostname, port, ssl_context, timeout File "D:\python3\lib\site-packages\httpcore\_backends\sync.py", line 139, in open_tcp_stream return SyncSocketStream(sock=sock) File "D:\python3\lib\contextlib.py", line 130, in __exit__ self.gen.throw(type, value, traceback) File "D:\python3\lib\site-packages\httpcore\_exceptions.py", line 12, in map_exceptions raise to_exc(exc) from None httpcore._exceptions.ConnectTimeout: timed out

二. 解决方法:

 1.寻找解决方法

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

https://github.com/lushan88a/google_trans_new

在此道一声感谢!

2.使用解决方法

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

pip install google_trans_new

三. 代码(优化)

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()

测试文本我放在了:http://xiazai.3water.com/202012/yuanma/test.rar

可自行下载。

四. 运行结果

python3 googletrans超时报错问题及翻译工具优化方案 附源码

五. 总结

本篇首先解决了调用googletrans模块的报错问题,然后使用新的google翻译模块编写了代码,并且解决了我这篇文章中翻译文本长度不能大于5000的问题。

Python 相关文章推荐
Python Web开发模板引擎优缺点总结
May 06 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
Python File(文件) 方法整理
Feb 18 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
elasticsearch python 查询的两种方法
Aug 04 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
使用Python实现牛顿法求极值
Feb 10 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
python软件都是免费的吗
Jun 18 Python
python音频处理的示例详解
Dec 23 #Python
python 实现客户端与服务端的通信
Dec 23 #Python
python实现excel公式格式化的示例代码
Dec 23 #Python
python 基于opencv实现图像增强
Dec 23 #Python
python接口自动化框架实战
Dec 23 #Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 #Python
python实现发送QQ邮件(可加附件)
Dec 23 #Python
You might like
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
深入理解Vuex 模块化(module)
2017/09/26 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python选择排序算法实例总结
2015/07/01 Python
python如何实现int函数的方法示例
2018/02/19 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
殡葬服务心得体会
2014/09/11 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
小学教师自我评价
2015/03/04 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书