文档章节

用python包装一个翻译工具

嘻嘻哥
 嘻嘻哥
发布于 2015/06/14 21:41
字数 1620
阅读 31
收藏 0
点赞 0
评论 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 开发者节省时间的 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
Python 国际化(i18n) 支持

python使用gettext来实现i18n支持。具体参数信息请看gettext module帮助。 python中对于国际化的字符串,只需要外加_()即可。 如: print(('hello world')) 然后根据user选择的语言,创建tra...

用户名已存在
2012/03/12
0
0
国外程序员整理的机器学习资源大全

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

chworld
2015/08/07
0
0
如何在 Fedora 上安装 Pipenv

Pipenv 的目标是将打包界(bundler、composer、npm、cargo、yarn 等)最好的东西带到 Python 世界来。它试图解决一些问题,并简化整个管理过程。 目前,Python 程序依赖项的管理有时似乎是一...

23%
07/11
0
0
Python Fire试用体验

之前用Python写过一些CLI的小工具,在CLI命令行传参处理上,一般都是用argparse,最近看到Google开源的Python Fire(2017-3-2就开源了), 把argparse包装了,可以自动将代码转变成 CLI,开发...

ahlfors
05/24
0
0
使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具

距离上次写使用python一步一步搭建微信公众平台(一)已经有几个月了,当中自已也搭建了一个中英文互译的小应用,可是由于英文翻中文好弄,中文翻译成英文一直有问题,知道是编码的问题,但是...

Kevin_Yang
2014/01/19
0
39
156个Python网络爬虫资源,妈妈再也不用担心你找不到资源了

本列表包含Python网页抓取和数据处理相关的库。 前几天有私信小编要Python的学习资料,小编整理了一些有深度的Python教程和参考资料,从入门到高级的都有,文件已经打包好了,正在学习Pytho...

雁横
05/02
0
0
python实现简体中文和繁体相互转换

1. opencc-python 如果目录上的链接被屏蔽了,请手动复制 https://pypi.python.org/pypi/opencc-python/ 首先介绍opencc的python实现库,它具有安装简单,翻译准确,使用方便等优点。对于我们...

_周小董
05/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
10
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部