Python爬蟲調用谷歌翻譯接口_201907

2019年7月4日15:53:17


    (|3[▓▓] 晚安

谷歌翻譯環境

Python 3.6
第三方庫 Execjs (pip install PyExecJS)

文件列表

同目錄下的四個文件:

    - tool.py
    - google_translate.py 
    - input.txt
    - __init__.py


主要有四個文件
    1、tool.py (用來生成谷歌翻譯url中的tk字段)
    2、google_translate.py (用來讀取中文txt文件,并翻譯生成新的德語txt文件)
    3、input.txt(需要翻譯的txt中文文件)
    4、__init__.py(該文件為空文件,用來impot tool.py)
    詳細可以百度"python3 引用同目錄py文件"
    

使用步驟

注:這里是中文文本轉換為德語文本

1、同目錄下創建四個文件,分別將下邊代碼粘貼上去
2、運行 python3 google_translate.py或 python google_translate.py生成output.txt

修改說明

本文件是中文翻譯為德語的,如果要轉換為其他語言
請修改 google_translate.py 文件里的 translate()函數的以下字段。

關于語言代碼和國家的對應,請查看"國家語言代碼對照表"文章。
如:中文 zh-CN
    德語 de
    英語 en

    old_language_code = "zh-CN" # 中文
    new_language_code = "de"  # 德語
    # new_language_code = "en" # 英語

tool.py

注:用來生成谷歌翻譯url中的tk字段
import execjs


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)


google_translate.py

    注:用來讀取中文txt文件,并翻譯生成新的德語txt文件
# -*- coding: utf-8 -*-

import urllib.request
from tool import Py4Js


def open_url(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
    req = urllib.request.Request(url=url, headers=headers)
    response = urllib.request.urlopen(req)
    data = response.read().decode('utf-8')
    return data


def translate(content, tk):
    if len(content) > 4891:
        print("翻譯的長度超過限制!!!")
        return

    content = urllib.parse.quote(content)

    old_language_code = "zh-CN"
    # new_language_code = "en" # 英語
    new_language_code = "de"  # 德語
    url = "https://translate.google.cn/translate_a/single?client=webapp&" \
          "sl=%s&tl=%s&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&clearbtn=1&otf=1&" \
          "pc=1&ssel=3&tsel=3&kc=2&tk=%s&q=%s" % (old_language_code, new_language_code, tk, content)

    result = open_url(url)

    end = result.find("\",")
    if end > 4:
        print(result[4:end])
        return result[4:end]


def get_old_text_list():
    key_str_list = list()
    with open("input.txt", "r") as fo:
        lines = fo.readlines()

    for line in lines:
        if "'" in line and ":" in line and "," in line:
            line_list = line.split("'")
            line_str = line_list[-2]
            if line_str != "React Admin":
                key_str_list.append(line_str)
                print(line_str)
    return key_str_list


def get_new_text_list(key_str_list):
    js = Py4Js()

    value_str_list = list()
    key_value_dict = dict()
    for key in key_str_list:
        content = key

        if content == 'q!':
            break

        tk = js.getTk(content)
        value = translate(content, tk)
        value_str_list.append(value)

        key_value_dict[key] = value
    print(key_str_list)
    print(value_str_list)
    print(key_value_dict)
    return value_str_list, key_value_dict


def output_new_text(key_str_list, value_str_list, key_value_dict):
    with open("input.txt", "r") as fo:
        lines = fo.readlines()

    with open("output.txt", "w") as fw:
        for line in lines:
            for key in key_str_list:
                if key in line:
                    line = line.replace(key, key_value_dict[key])
                    fw.write(line)


def main():
    key_str_list = get_old_text_list()
    value_str_list,key_value_dict = get_old_text_list(key_str_list)

    output_new_text(key_str_list, value_str_list, key_value_dict)


if __name__ == "__main__":
    main()


inpupt.txt

    注:需要翻譯的txt中文文件
export default {
    application: {
        name: 'React Admin',
    },
    ajaxTip: {
        success: '成功',
        error: '失敗',
        noAccess: '無權訪問此資源',
        notFound: '訪問資源不存在',
        serverBusy: '服務器繁忙',
        timeOut: '超時',
    },
    menu: {
        menus: '菜單&權限',
        codeGenerator: '代碼生成',
        home: '首頁',
        document: '文檔',
        page404: '404頁面不存在',
        login: '登錄',
        example: '示例',
        userCenter: '用戶中心',
        users: '用戶列表',
        userEdit: '用戶編輯',
        roles: '角色列表',
        modifyPassword: '修改密碼',
        setting: '設置',
        logout: '退出登錄',
        ajax: 'ajax請求',
        antDesign: 'Ant Design 官網',
        google: '谷歌官網',

        component: '組件',
        tableRowDraggable: '表格行可拖拽',
        asyncSelect: '異步下拉',
        formElement: '表單元素',
        formItemLayout: '表單布局',
        formUtil: '表單相關工具',
        inputClear: '可清空Input',
        listPage: '列表頁',
        modal: '彈框',
        noData: '暫無數據',
        operator: '操作',
        pagination: '分頁組件',
        permission: '權限',
        popPrompt: '彈框輸入',
        queryBar: '查詢條',
        queryItem: '查詢條件',
        tableAnimate: '表格動畫高階組件',
        tableDragColumn: '表頭拖拽高階組件',
        tableDragRow: '表格行可拖拽高階組件',
        tableEditable: '可編輯表格',
        tableRightClick: '表格行右鍵高階組件',
        toolBar: '工具條',
        userAvatar: '用戶頭像',
    },
    login: {
        title: '歡迎登錄',
        submit: '登錄',
        userName: '用戶名',
        password: '密碼',
        userNameEmptyTip: '請輸入用戶名!',
        passwordEmptyTip: '請輸入密碼!',
    },
    setting: {
        navigationLayout: '導航布局',
        topSideMenu: '頂部+左側導航',
        topMenu: '頂部導航',
        sideMenu: '左側導航',
        tabsSetting: 'Tab頁導航設置',
        tabsShow: '顯示Tab頁導航',
        pageSetting: '頁面設置',
        showHead: '顯示頭部',
        fixedHead: '頭部固定',
        menuSetting: '菜單設置',
        keepMenuOpen: '保持菜單展開',
        keepPage: '保持頁面狀態',
        fullScreen: '全屏顯示',
        exitFullScreen: '退出全屏',
        selectPrimaryColor: '選擇主題顏色',
    },
    tabs: {
        refresh: '刷新',
        refreshAll: '刷新全部',
        close: '關閉',
        closeOthers: '關閉其他',
        closeAll: '關閉所有',
        closeLeft: '關閉左側',
        closeRight: '關閉右側',
    },
    errorPage: {
        needLogin: '您還未登錄!',
        pageNotFound: '您訪問的頁面不存在!',
        redirectTo: '跳轉到',
        orReturn: '或者返回',
        previousStep: '上一步',
    },
};

--

output.txt

    注:最終生成文件
 {
    application: {
        name: 'React Admin',
    },
    ajaxTip: {
        success: 'Erfolg',
        error: 'Misserfolg',
        noAccess: 'Nicht berechtigt, auf diese Ressource zuzugreifen',
        notFound: 'Zugriffsressourcen sind nicht vorhanden',
        serverBusy: 'Server ausgelastet',
        timeOut: 'Timeout',
    },
    menu: {
        menus: 'Menü \u0026 Berechtigungen',
        codeGenerator: 'Codegenerierung',
        home: 'Zuhause',
        document: 'Dokument',
        page404: '404 Seite existiert nicht',
        login: 'Einloggen',
        example: 'Beispiel',
        userCenter: 'Benutzerzentrum',
        users: 'Benutzerliste',
        userEdit: 'Benutzerbearbeitung',
        roles: 'Rollenliste',
        modifyPassword: 'Passwort ?ndern',
        setting: 'Einstellung',
        logout: 'Abmelden',
        ajax: 'Ajax-Anfrage',
        antDesign: 'Offizielle Website von Ant Design',
        google: 'Googles offizielle Website',

        component: 'Komponente',
        tableRowDraggable: 'Tabellenzeilen k?nnen gezogen werden',
        asyncSelect: 'Asynchroner Pulldown',
        formElement: 'Formularelement',
        formItemLayout: 'Formularlayout',
        formUtil: 'Formularbezogene Werkzeuge',
        inputClear: 'Kann Eingabe l?schen',
        listPage: 'Listenseite',
        modal: 'Einschussfeld',
        noData: 'Noch keine Daten',
        operator: 'Bedienung',
        pagination: 'Paging-Komponente',
        permission: 'Erlaubnis',
        popPrompt: 'Bullet-Box-Eingabe',
        queryBar: 'Abfrageleiste',
        queryItem: 'Abfragebedingung',
        tableAnimate: 'übergeordnete Komponenten für die Tabellenanimation',
        tableDragColumn: 'Header, der High-End-Komponenten zieht',
        tableDragRow: 'Tabellenzeilen k?nnen übergeordnete Komponenten ziehen',
        tableEditable: 'Bearbeitbares Formular',
        tableRightClick: 'Klicken Sie mit der rechten Maustaste auf die übergeordnete Komponente in der Tabellenzeile',
        toolBar: 'Symbolleiste',
        userAvatar: 'Benutzeravatar',
    },
    login: {
        title: 'Willkommen anmelden',
        submit: 'Einloggen',
        userName: 'Benutzername',
        password: 'Passwort',
        userNameEmptyTip: 'Bitte geben Sie Ihren Benutzernamen ein!',
        passwordEmptyTip: 'Bitte geben Sie Ihr Passwort ein!',
    },
    setting: {
        navigationLayout: 'Navigationslayout',
        topSideMenu: 'Navigation oben + links',
        topMenu: 'Top Navigation',
        sideMenu: 'Linke Navigation',
        tabsSetting: 'Einstellungen für die Registerkartennavigation',
        tabsShow: 'Registerkartennavigation anzeigen',
        pageSetting: 'Seite einrichten',
        showHead: 'Anzeigekopf',
        fixedHead: 'Kopffixierung',
        menuSetting: 'Menüeinstellung',
        keepMenuOpen: 'Lassen Sie das Menü ge?ffnet',
        keepPage: 'Seitenstatus beibehalten',
        fullScreen: 'Vollbildanzeige',
        exitFullScreen: 'Beenden Sie den Vollbildmodus',
        selectPrimaryColor: 'W?hlen Sie die Themenfarbe',
    },
    tabs: {
        refresh: 'Aktualisieren',
        refreshAll: 'Aktualisieren Sie alle',
        close: 'Schliessen',
        closeOthers: 'Andere schlie?en',
        closeAll: 'Alles schlie?en',
        closeLeft: 'Links schlie?en',
        closeRight: 'Nach rechts schlie?en',
    },
    errorPage: {
        needLogin: 'Du bist nicht eingeloggt!',
        pageNotFound: 'Die von Ihnen besuchte Seite existiert nicht!',
        redirectTo: 'Springe zu',
        orReturn: 'Oder zurück',
        previousStep: 'Vorheriger Schritt',
    },
}

參考文獻:
https://blog.csdn.net/yingshukun/article/details/53470424

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380