• PYTHON实现GOOGLE翻译,免费多线程使用谷歌翻译接口


    文章说明

    本文实现的方式大部分源码是从借鉴别人的博客,再他们的基础上修复了不能翻译的问题和其他的一些bug。但是原文找不到了,没法粘贴原文地址了,非常抱歉。

    本文章解决的问题有:

    1. 翻译不来,在之前基础上对需要翻译的文字进行urlEncode,实现方式
      parse.quote(self.text)
    2. 结果处理,切片合成。过长文字谷歌翻译会自动切片,翻译的结果会变成多段。

    3. 修改之前的翻译代码结构,更好的封装,方便调用。
    4. 使用多线程跑翻译任务。

    本文不介绍如何爬虫解析谷歌接口,如需要可以翻看别人博客,很多介绍爬虫过程。

    代码实现

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    '''
    @File    :  google_trans.py    
    @Time    :  2020/5/15 9:29
    @Author  :  hxluo
    @Version :  1.0
    @Contact :  465801795@qq.com
    @Desc    :  google translate
    '''
    # import lib
    import requests
    import json
    from bs4 import BeautifulSoup
    import execjs 
    from urllib import parse
     
    class Py4Js():
     
        def __init__(self):
            self.ctx = execjs.compile(""" 
            function TL(a) { 
            var k = ""; 
            var b = 406644; 
            var b1 = 3293161072; 
            var jd = "."; 
            var $b = "+-a^+6"; 
            var Zb = "+-3^+b+-f"; 
            for (var e = [], f = 0, g = 0; g < a.length; g++) { 
                var m = a.charCodeAt(g); 
                128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), 
                e[f++] = m >> 18 | 240, 
                e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, 
                e[f++] = m >> 6 & 63 | 128), 
                e[f++] = m & 63 | 128) 
            } 
            a = b; 
            for (f = 0; f < e.length; f++) a += e[f], 
            a = RL(a, $b); 
            a = RL(a, Zb); 
            a ^= b1 || 0; 
            0 > a && (a = (a & 2147483647) + 2147483648); 
            a %= 1E6; 
            return a.toString() + jd + (a ^ b) 
        }; 
        function RL(a, b) { 
            var t = "a"; 
            var Yb = "+"; 
            for (var c = 0; c < b.length - 2; c += 3) { 
                var d = b.charAt(c + 2), 
                d = d >= t ? d.charCodeAt(0) - 87 : Number(d), 
                d = b.charAt(c + 1) == Yb ? a >>> d: a << d; 
                a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d 
            } 
            return a 
        } 
        """)
     
        def getTk(self, text):
            return self.ctx.call("TL", text)
    class Translate_as_google(object):
        def __init__(self, to_language, this_language='auto', read=False):
            '''
                to_language:要翻译成的语言
                this_language:要转换的文字,默认为auto自动
                read:在指定位置生成text的朗读文件
            '''
            self.this_language = this_language
            self.to_language = to_language
            self.read = read
     
        def open_url(self, url):
            '''请求'''
            headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
            req = requests.get(url=url, headers=headers , timeout=8)
     
            return req
     
        def buildUrl(self):
            '''封装请求url
                sl:要转换的文字 tl:转换的结果类型 q要输入的文字'''
            baseUrl = 'http://translate.google.cn/translate_a/single'
            baseUrl += '?client=webapp&'
            baseUrl += 'sl=%s&' % self.this_language
            baseUrl += 'tl=%s&' % self.to_language
            baseUrl += 'hl=zh-CN&'
            baseUrl += 'dt=at&'
            baseUrl += 'dt=bd&'
            baseUrl += 'dt=ex&'
            baseUrl += 'dt=ld&'
            baseUrl += 'dt=md&'
            baseUrl += 'dt=qca&'
            baseUrl += 'dt=rw&'
            baseUrl += 'dt=rm&'
            baseUrl += 'dt=ss&'
            baseUrl += 'dt=t&'
            baseUrl += 'ie=UTF-8&'
            baseUrl += 'oe=UTF-8&'
            baseUrl += 'clearbtn=1&'
            baseUrl += 'otf=1&'
            baseUrl += 'pc=1&'
            baseUrl += 'srcrom=0&'
            baseUrl += 'ssel=0&'
            baseUrl += 'tsel=0&'
            baseUrl += 'kc=2&'
            baseUrl += 'tk=' + str(self.tk) + '&'
            baseUrl += 'q=' + parse.quote(self.text)
            return baseUrl
     
        def read_go(self, args):
            '''朗读截取
            upload:下载到路径及文件名称
            return_language:返回的语言类型
            '''
            upload, return_language = args[0], args[1]
            read_translate_url = 'http://translate.google.cn/translate_tts?ie=UTF-8&q=%s&tl=%s&total=1&idx=0&textlen=3&tk=%s&client=webapp&prev=input' % (
                self.text, return_language, self.tk)
            data = self.open_url(read_translate_url) #请求的返回所有数据
            with open(upload, 'wb') as f:
                f.write(data.content)
     
        def translate(self,text):
            '''翻译截取'''
            self.text = text
            js = Py4Js()
            self.tk = js.getTk(self.text)
     
            if len(self.text) > 4891:
                raise ("翻译的长度超过限制!!!")
            url = self.buildUrl()
            # print(url)
            _result = self.open_url(url)
            data = _result.content.decode('utf-8')
     
            tmp = json.loads(data)
            jsonArray = tmp[0]
            result = None
            for jsonItem in jsonArray:
                if jsonItem[0]:
                    if result:
                        result = result + " " + jsonItem[0]
                    else:
                        result = jsonItem[0]
            return result
     
    if __name__ == '__main__':
     
       
        text1 = "2019% ?= &:,? ;# [ Famous ] @ {}|*()^%$#@! Famous Brand Mens Suits Wedding Groom Plus Size 4 XL 3 Pieces ( Jacket + Vest + Pant )  Slim Fit Casual Tuxedo Suit Male"
        text2 = "Inflatable Mattress Air Cushion Car Backseat Bed Sleep with 2 Pillows & & & & &&& Pump"
        text3 = """[ New 2020 upgrade , intelligent digital display , see the power ] [ High - performance lithium battery , #placeholder15 hour fast charge , 50 - 60 minutes for full charge , 5 W high power ] [ multi - purpose , can shave head , shave , with hair clipper , nose hair clipper , cleansing brush head can also manage hair , nose hair and depth Clean the face ] [ Waterproof design , the whole body can be washed , the blade can be washed directly with a faucet after cleaning with a brush , easy to clean and hygienic ] [ Supports USB charging , can be charged in the car , or you can use a mobile phone charging head , charging treasure , Charging of USB interface such as computer , convenient and fast ] [ Genuine guarantee , after - sale guarantee : 30 - day free trial , I don't like to return directly ; 365 - day quality issues , direct replacement , no maintenance ] " " " Warm reminder : If someone is working on the page Order , please participate in the order , so that the shipment will be faster ! ! !"""
        ts = Translate_as_google('ja', 'en') # 目标语言:日语
        result = ts.translate(text1)
        print(result)
        print(ts.translate(text2))
      print(ts.translate(text3))

    代码运行结果:

    2019%?=&:、?  ;#[有名] @ {} | *()^%$#@! 有名ブランドメンズスーツ結婚式新郎プラスサイズ4 XL 3ピース(ジャケット+ベスト+パンツ)スリムフィットカジュアルタキシードスーツ男性
     
    インフレータブルマットレスエアクッション車の後部座席ベッドスリープ2枕&&&&&&&ポンプ
     
    [新しい2020アップグレード、インテリジェントデジタルディスプレイ、電力を確認] [高性能リチウム電池、#placeholder15時間の高速充電、フル充電で50〜60分、5 Wの高電力] [多目的、ヘッドを剃る、剃る、 バリカン、鼻バリカン、クレンジングブラシヘッドで髪、鼻毛、深さを管理することもできます[顔をきれいにする]防水設計、全身を洗うことができ、ブレードはブラシで洗った後、蛇口で直接洗うことができます。 掃除が簡単で衛生的] [USB充電をサポートし、車内で充電可能、または携帯電話の充電ヘッド、宝物を充電、コンピュータなどのUSBインターフェースの充電、便利で高速] [本物の保証、アフターセールス 保証:30日間の無料試用。直接戻るのは好きではありません。  365日間の品質問題、直接交換、メンテナンス不要] "" "温かいリマインダー:誰かがページオーダーで作業している場合は、注文に参加して、発送を迅速化してください!!!

    支持的国家

    _language = {
     'afrikaans': 'af',
     'arabic': 'ar',
     'belarusian': 'be',
     'bulgarian': 'bg',
     'catalan': 'ca',
     'czech': 'cs',
     'welsh': 'cy',
     'danish': 'da',
     'german': 'de',
     'greek': 'el',
     'english': 'en',
     'esperanto': 'eo',
     'spanish': 'es',
     'estonian': 'et',
     'persian': 'fa',
     'finnish': 'fi',
     'french': 'fr',
     'irish': 'ga',
     'galician': 'gl',
     'hindi': 'hi',
     'croatian': 'hr',
     'hungarian': 'hu',
     'indonesian': 'id',
     'icelandic': 'is',
     'italian': 'it',
     'hebrew': 'iw',
     'japanese': 'ja',
     'korean': 'ko',
     'latin': 'la',
     'lithuanian': 'lt',
     'latvian': 'lv',
     'macedonian': 'mk',
     'malay': 'ms',
     'maltese': 'mt',
     'dutch': 'nl',
     'norwegian': 'no',
     'polish': 'pl',
     'portuguese': 'pt',
     'romanian': 'ro',
     'russian': 'ru',
     'slovak': 'sk',
     'slovenian': 'sl',
     'albanian': 'sq',
     'serbian': 'sr',
     'swedish': 'sv',
     'swahili': 'sw',
     'thai': 'th',
     'filipino': 'tl',
     'turkish': 'tr',
     'ukrainian': 'uk',
     'vietnamese': 'vi',
     'yiddish': 'yi',
     'chinese_simplified': 'zh-CN',
     'chinese_traditional': 'zh-TW',
     'auto': 'auto'
        }

    多线程跑翻译任务

    if __name__ == '__main__':
        import time
        import multiprocessing
        data_path = "../../data/last-ori/en-ja-all.csv"
        tgt_path = "../../data/last-ori/en-ja-all-tr.csv"
        pool = multiprocessing.Pool(processes=5) # 5个现场
        with open(data_path,'r',encoding="utf-8") as rd,open(tgt_path, 'w', encoding="utf-8") as wd:
        #     # time.sleep(1)
            for line in rd:
                line = line[:-1]
                if not line:continue
                count = count + 1
                str_li = line.split(" :&: ")
                result =  pool.apply(ts.translate,  args=(str_li[0],))
                print(count,", ",result)
                wd.write(str_li[0] + " :&: " + result + "
    ")
        pool.close()
        pool.join()

    谷歌服务器对过频繁请求翻译接口的ip会加入黑名单,所以多线程请求谷歌接口的时候,要注意控制好频率,频率太快了不是你不行就是她不行!


    版权声明:本文为lhxez6868原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    本文链接:https://blog.csdn.net/lhxez6868/article/details/106141728
  • 相关阅读:
    C++ STL 一般总结(转载)
    Python高级语法总结
    Adaboost 算法的原理与推导——转载及修改完善
    简化版SMO算法标注
    【转载】机器学习算法基础概念学习总结
    C++中添加配置文件读写方法
    Python中scatter()函数--转载
    python 之 strip()--(转载)
    zabbix邮件报警脚本(Python)
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/tjp40922/p/14118088.html
Copyright © 2020-2023  润新知