文档章节

用python包装一个翻译工具

嘻嘻哥
 嘻嘻哥
发布于 2015/06/14 21:41
字数 1620
阅读 46
收藏 0

下面附上最近两个版本的改动,v0、v1就不上传了

v2版代码如下:

import urllib.request
import urllib.parse
import json
import random

"""V2 相比V1版本,增加伪装功能-->使用代理服务器"""
#当前不使用代理,可以跳过代理部分
bUseProxy = 0
ipLists = ['183.203.208.166:8118', '114.215.108.155:9999', '218.78.210.190:8080', '124.202.175.70:8118']

def testProxy():
    """测试代理ip是否生效"""
    bUseProxy = 1
    url = 'http://www.whatismyip.com.tw'
    response = openUrlByProxy(url)
    html = response.read().decode('utf-8')
    print(html)
    

def openUrlByProxy(url, data = None):
    """
    url(which can be a request object or a string)
    使用代理(如果使能)打开url地址,返回response对象
    """
    response = 0
    global bUseProxy
    if bUseProxy == 1:
        proxyIp = {"http" : random.choice(ipLists)}
        proxy_support = urllib.request.ProxyHandler(proxyIp)
        opener = urllib.request.build_opener(proxy_support)

        #这种方式是替换系统默认的opener,后续所有打印的url都是通过代理打开
        #urllib.request.install_opener(opener)
        #response = urllib.request.urlopen(url, data)

        #这种方式是由自己创建的代理opener来打开url,不会影响后续的非代理打开
        response = opener.open(url, data)
    else:
        response = urllib.request.urlopen(url, data)
    return response

def parseUrl(strurl, data = None):
    #修改header里的User-Agent,伪装成浏览器访问,下面两种方式均可以
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36"}
    req = urllib.request.Request(strurl, headers = header)
    #req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36")
    #print(req.headers)
    
    #也可以直接省去上面这句Request调用,直接将strurl传给urlopen替换参数req
    #response = urllib.request.urlopen(req, data)

    #v2版本增加了使用代理功能
    response = openUrlByProxy(req, data)
    
    #type(response)  <class 'http.client.HTTPResponse'>
    #print(response.info())#  查看信息
    html = response.read().decode('utf-8')
    #type(html) <class 'str'>
    return json.loads(html)

def baiduTranslate(content, _from_, _to_):
    if (_from_ == 'auto'):
        _from_ = ''
    if (_to_ == 'auto'):
        _to_ = 'zh' if content[0] < chr(127) else 'en'
    data = {}
    data['from'] = _from_
    data['to'] = _to_
    data['query'] = content
    data['transtype'] = 'trans'
    data['simple_means_flag'] = '3'

    data = urllib.parse.urlencode(data).encode('utf-8')

    target = parseUrl("http://fanyi.baidu.com/v2transapi", data)
    return target['trans_result']['data'][0]['dst']

def youdaoTranslate(content, _from_, _to_):
    data = {}
    data['type'] = 'AUTO' if _from_ == 'auto' else _from_ + "2" + _to_
    data['i'] = content
    data['doctype'] = 'json'
    data['xmlVersion'] = '1.6'
    data['keyfrom'] = 'fanyi.web'
    data['ue'] = 'UTF-8'
    data['typoResult'] = 'true'
    data = urllib.parse.urlencode(data).encode('utf-8')
    
    target = parseUrl("http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=http://www.youdao.com/", data)
    return target['translateResult'][0][0]['tgt']

def bingTranslate(content, _from_, _to_):
    """ 自动:auto, 中文:zh, 英文:en """
    if (_from_ == 'auto'):
        _from_ = ''
    if (_to_ == 'auto'):
        _to_ = 'zh' if content[0] < chr(127) else 'en'
        
    data = {}
    data['from'] = '"' + _from_ + '"'
    data['to'] = '"' + _to_ + '"'
    data['texts'] = '["'
    data['texts'] += content
    data['texts'] += '"]'
    data['options'] = "{}"
    data['oncomplete'] = 'onComplete_3'
    data['onerror'] = 'onError_3'
    data['_'] = '1430745999189'
    data = urllib.parse.urlencode(data).encode('utf-8')
    #appid需要去申请,暂时先用网上别人提供的
    strUrl = "http://api.microsofttranslator.com/v2/ajax.svc/TranslateArray2?" + data.decode() + "&appId=%223DAEE5B978BA031557E739EE1E2A68CB1FAD5909%22"

    response = urllib.request.urlopen(strUrl)
    #通过response.info()查看Content-Type: application/x-javascript
    #不能通过json.loads(),到时候查看如何解析,显示使用老土的方法
    str_data = response.read().decode('utf-8')
    tmp,str_data = str_data.split('"TranslatedText":')
    translate_data = str_data[1:str_data.find('"', 1)]
    return translate_data

def googleTranslate(content, _from_, _to_):
    """ 自动:auto, 中文:zh, 英文:en """
    if (_to_ == 'auto'):
        _to_ = 'zh' if content[0] < chr(127) else 'en'
    data = {}
    data['from'] = _from_
    data['to'] = _to_
    data['text'] = content
    data = urllib.parse.urlencode(data).encode('utf-8')

    target = parseUrl("http://brisk.eu.org/api/translate.php?" + data.decode())
    return target['res']

if __name__ == "__main__":
    select = int(input("请选择翻译工具:1.百度,2.有道,3.必应, 4.谷歌, 5.全部:"))
    content = input('请输入要翻译的内容:')
    data = {}

    """
    data字典里填的数据和url可以在具体的翻译网页,右键点击审查元素(inspect element),然后再点击网络(network)
    然后点击左右的列表项,看右边的预览(preview)是否有结果,如果有结果,则点击预览(preview)旁边的http头(headers)
    最开始的Request URL即我们需要传给urlopen的,然后下面的表单数据(from data)就是需要传给服务器的字典数据结构
    """

    if select == 1:
        print(baiduTranslate(content, 'auto', 'auto'))
    elif select == 2:
        print(youdaoTranslate(content, 'auto', 'auto'))
    elif select == 3:
        print(bingTranslate(content, 'auto', 'auto'))
    elif select == 4:
        print(googleTranslate(content, 'auto', 'auto'))
    elif select == 10000:
        print("百度:" + baiduTranslate(content, 'zh', 'en'))
        print("有道:" + youdaoTranslate(content, 'zh', 'en'))
        print("必应:" + bingTranslate(content, 'zh', 'en'))
        print("谷歌:" + googleTranslate(content, 'zh', 'en'))
    elif select == 10001:
        print("百度:" + baiduTranslate(content, 'en', 'zh'))
        print("有道:" + youdaoTranslate(content, 'en', 'zh'))
        print("必应:" + bingTranslate(content, 'en', 'zh'))
        print("谷歌:" + googleTranslate(content, 'en', 'zh'))
    else:
        print("百度:" + baiduTranslate(content, 'auto', 'auto'))
        print("有道:" + youdaoTranslate(content, 'auto', 'auto'))
        print("必应:" + bingTranslate(content, 'auto', 'auto'))
        print("谷歌:" + googleTranslate(content, 'auto', 'auto'))

最新版上增加了界面操作,代码如下(需要import v2版的包,界面也是边学边用,以前写过其它界面代码,所以学起来比较快)

import tkinter as tk
import TranslateEngine.translation_v2 as te
import threading

class myTranslator:
    def __init__(self, root):
        self.typeList = []
        self.typeVal = 0
        self.inputEntry = 0

        self.baiduText = ""
        self.youdaoText = ""
        self.googleText = ""
        self.bingText = ""
        
        self.root = root
        self.root.geometry("500x500+700+300")
        self.root.minsize(width=500, height=500)
        self.root.title('富哥的翻译器')
        self.initInputLayout()
        self.initDisplayLayout()
    
    #界面代码同步调用会卡死,加入多线程处理
    def __AsyncCallTranslate(self, *args, **kwargs):
        if (kwargs['name'] == 'baidu'):
            self.baiduText.set(te.baiduTranslate(*args))
        elif (kwargs['name'] == 'youdao'):
            self.youdaoText.set(te.youdaoTranslate(*args))
        elif (kwargs['name'] == 'bing'):
            self.bingText.set(te.bingTranslate(*args))
        elif (kwargs['name'] == 'google'):
            self.googleText.set(te.googleTranslate(*args))
    
    def TranslateButtonCallback(self):
        selectedType = self.typeVal.get()
        _from_, to = ('auto', 'auto') if selectedType[0] == '自' else ('en', 'zh') if selectedType[0] == '英' else ('zh', 'en')
        content = self.inputEntry.get()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'baidu'}).start()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'youdao'}).start()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'bing'}).start()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'google'}).start()
        #self.baiduText.set(te.baiduTranslate(content, _from_, to))
        #self.youdaoText.set(te.youdaoTranslate(content, _from_, to))
        #self.bingText.set(te.bingTranslate(content, _from_, to))
        #self.googleText.set(te.googleTranslate(content, _from_, to))

    def EnterReturnCallback(self, event):
        self.TranslateButtonCallback()

    def initInputLayout(self):
        self.inputFrame = tk.Frame(self.root, height=50)

        self.typeList = ['自  动', '中->英', '英->中']
        self.typeVal = tk.StringVar()
        self.typeVal.set(self.typeList[0])
        tk.OptionMenu(self.inputFrame, self.typeVal, *self.typeList).pack(fill='y', side='left', ipadx=10)

        self.inputEntry = tk.Entry(self.inputFrame)
        self.inputEntry.bind('<Key-Return>', self.EnterReturnCallback)
        self.inputEntry.pack(fill='both', side='left', expand=1)
        self.inputEntry.focus_set()
            
        tk.Button(self.inputFrame, text="翻译", bg='green', command=self.TranslateButtonCallback).pack(fill='y', side='right', ipadx=10)
        self.inputFrame.pack(fill='x')


    def initDisplayLayout(self):
        displayFrame = tk.Frame(self.root)

        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x', pady=5)

        tk.Label(displayFrame, text="百度翻译:", height=1, anchor='w').pack(fill='x')
        self.baiduText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.baiduText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        tk.Label(displayFrame, text="有道翻译:", height=1, anchor='w').pack(fill='x')
        self.youdaoText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.youdaoText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        tk.Label(displayFrame, text="谷歌翻译:", height=1, anchor='w').pack(fill='x')
        self.googleText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.googleText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        tk.Label(displayFrame, text="必应翻译:", height=1, anchor='w').pack(fill='x')
        self.bingText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.bingText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        displayFrame.pack(fill='both', expand=1)


if __name__ == '__main__':
    root = tk.Tk()
    myTranslator(root)
    tk.mainloop()

最后的效果如下:

© 著作权归作者所有

共有 人打赏支持
嘻嘻哥
粉丝 0
博文 6
码字总数 8981
作品 0
厦门
高级程序员
私信 提问
6个最高效的语言处理Python库,你用过几个?

最近一段时间Python已经成为数据科学行业中大火的编程语言,今天技术学派收集了一些较为高效的语言处理Python库。下面分享给大家。 1.NLTK NLTK是构建Python程序以处理人类语言数据的领先平台...

Python燕大侠
06/05
0
0
深入了解Python与黑客的关系,另赠Python黑客视频教程!

网络爱好者总是要掌握编程语言的,这里推荐:python。下面,一文了解黑客们会用到哪些Python技术!尾部免费送教程! 1、为什么是python Python已经成为漏洞开发领域的行业标准,读者会发现大...

Python新世界
07/27
0
0
Python 开发者节省时间的 10 个方法

Python 是一个美丽的语言,可以激发用户对它的爱。所以如果你试图加入程序员行列,或者你有点厌倦C++,Perl,Java 和其他语言,我推荐你尝试Python. Python有很多吸引程序员的功能 ,它易学,...

shezjl
2015/08/16
0
0
国际化复数形式的支持与pygettext的补丁

国际化复数形式的支持与pygettext的补丁 今天把plugs中的论坛进行了一些优化,其中想使用uliweb中早就内置的timesince.py模块。这块需要i18n的支持。于是使用: uliweb i18n -l zh_CN --uli...

zhengyijie
2012/10/08
0
0
国外程序员整理的机器学习资源大全

 英文原文:awesome-machine-learning   本文汇编了一些机器学习领域的框架、库以及软件(按编程语言排序)。   C++   计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的...

chworld
2015/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
30分钟前
2
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
今天
2
0
SpringBoot 整合异步调用方法

1. 在 SpringBoot 主类上使用 @EnableAsync 注解,开启异步调用功能 package com.codingos.springbootdemo;import org.springframework.boot.SpringApplication;import org.springfra......

北漂的我
今天
1
0
0015-如何使用Sentry管理Hive外部表权限

1.文档编写目的 本文档主要讲述如何使用Sentry对Hive外部表权限管理,并基于以下假设: 1.操作系统版本:RedHat6.5 2.CM版本:CM 5.11.1 3.集群已启用Kerberos和Sentry 4.采用具有sudo权限的...

Hadoop实操
今天
3
0
边缘计算与数据中心的发展趋势

导读 Gartner研究表明,人工智能、物联网和5G助力下一代商业创新,由此产生大量数据,2020年前企业将使用超过75亿台联网设备。 在几乎每个方面,社会的节奏都正变得更快。我们希望客户服务问...

问题终结者
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部