欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python爬虫调用谷歌翻译接口

程序员文章站 2022-04-15 14:45:50
2019年7月4日15:53:17 (¦3[▓▓] 晚安 谷歌翻译环境 文件列表 使用步骤 修改说明 tool.py 注:用来生成谷歌翻译url中的tk字段 注:用来读取中文txt文件,并翻译生成新的德语txt文件 coding: utf 8 import urllib.request from t ......

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 handlejs.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',
    },
}

参考文献: