告别网页搜索!教你用python实现一款属于自己的翻译词典软件
作者:武亮宇 发布时间:2023-08-08 17:46:58
标签:python,翻译,软件,词典
一、设计理念
1.先写一个登录的py文件,用python的tkinter库
2.再写一个py文件用于爬取有道翻译输出栏的内容
3.再利用python的tkinter库,完成软件运行的窗口
4.将窗口的返回值与爬取有道翻译的结果接口对一下
5.第二个py文件里import第一个py文件,两个文件相关联
二、代码解析
请求方式为post,要注意from data里的值,这里可以在网页上再输一个想要翻译的内容,观察from data里的值的变化,可以确定'salt'、 ‘sign'、 'lts'这三个值变化
进入网页源代码搜索.js,找到对应的js文件,找到他们的加密规则,最后将获得的response转化为字典,提取结果
class YouDao(object):
a.LoginPage()
def __init__(self):
pass
def crawl(self, content):
# 进入网页源代码搜索.js 点击进入搜索看是否有'salt''sign''lts'这三个 有则证明找的文件正确 全部复制 网页搜js格式化转化 创建js文件
lts = int(time.time() * 1000) # 时间戳转化为毫秒 时间戳转化为时间 站长工具
timestamp = lts + random.randint(0, 10)
# sign: n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
a = "fanyideskweb"
e = content
i = str(timestamp)
d = "Tbh5E8=q6U3EXe+&L[4c@"
sign = hashlib.md5((a+e+i+d).encode('utf-8')).hexdigest()
data = {
'i': content,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': timestamp,
'sign': sign,
'lts': lts,
'bv': 'dd67d51c2bbb03cccdbcfa48735ba27f',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
'Cookie': 'OUTFOX_SEARCH_USER_ID=406040753@221.204.120.171; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcJcdIfpYuE3eNgyi3Dx; OUTFOX_SEARCH_USER_ID_NCOO=902501357.1460881; user-from=http://www.youdao.com/; from-page=http://www.youdao.com/; _ntes_nnid=250706e8175b6796101a34821527eb62,1612611490655; DICT_SESS=v2|qKlfGGGmbVOAOfp40fQy0UWhfPuOMzWRlfk4Qz0LYERTu0flfn4Ul0l50He40fOW0TK6LlWRf6B0w46LYmh46F0JShMTLOfOm0; DICT_LOGIN=1||1612612510172; STUDY_SESS=EtwvT8KhyXqnLv8r0zdde8FcMOICmtZSIsltEiKZiAQq44wPVNN6PupszWYKIkBKfygQdvKlXU7p3aF+p0H6VcZLod3s2Bld6H/EWIphmRS92qG/3vVhSxHFAXq2yJp8QyH/R6RElNstKdVewVkZp+NyGWhzlamzU5dl6aBiyQ2Ybdo8MpdaPQB26wR6JPAU+P6MxCmnJEvne6pPMc9TTJJnThNrM7aj0X5LVpSBvjZ0h3M1drl4ZsmtkumIhrpyk1pBNevj8UEmS52Cj8DFo+yez89Xrbg4rxsvfSmuH21KlOh/Gwx6G1S/X4FQ7qd/Z2lDsk6Qgl21Md/1bCxa/orloi9qObM4N2yVCVhvkDdg5ILQezB8iskCpUa+ESZk; STUDY_INFO=UID_10AE81F6EF9DD9807BAC3FF3FD6407BA|4|1456638755|1612612364854; ___rl__test__cookies=1612663596564',
'Referer': 'http://fanyi.youdao.com/',
}
request = urllib.request.Request('http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule',
method='POST', data=data, headers=headers)
response = urllib.request.urlopen(request)
result_str = response.read().decode('utf-8')
result_dict = json.loads(result_str)
result = result_dict["translateResult"][0][0]["tgt"]
return result
三、软件窗口界面
尤其注意按钮这个地方
self.button = Button(self.window, text=u'查询', command=self.function)
command命令执行function
class Application(object):
def __init__(self):
# 创建一个窗口
self.window = Tk()
# 窗口标题
self.window.title(u'武亮宇翻译词典')
# 设置窗口大小位置
self.window.geometry("280x350+400+150")
# 输入框
self.entry = Entry(self.window)
self.entry.place(x=10, y=10, width=200, height=25) # width=宽度, height=高度
# 查询按钮
self.button = Button(self.window, text=u'查询', command=self.function) # command执行命令的意思 执行这个函数
self.button.place(x=220, y=10, width=50, height=25)
# 翻译结果标题
self.label = Label(self.window, text=u'翻译结果:')
self.label.place(x=10, y=45)
# 翻译框
self.text = Text(self.window, background='#ccc') # 设置背景颜色
self.text.place(x=10, y=75, width=260, height=265)
function这块要把爬虫返回的值和窗口的翻译框做一下接口
def function(self):
# 从输入框中获取用户的值
content = self.entry.get()
# 把值发送给有道服务器进行翻译
youdao = YouDao()
result = youdao.crawl(content)
# 把结果放在翻译框里
self.text.delete(1.0, END) # 每次查询先删除一下
self.text.insert(END, result) # 插入文本最后的位置 导入END库
四、源码展示
import urllib.request # 发送网络请求
import urllib.parse # 参数解析
import time
import random
import hashlib
import json
from tkinter import Tk, Entry, Button, Label, Text, END # Tk(创建窗口), Entry(输入框), Button(按钮), Label(标签), Text(文本框),
# END
import a
class YouDao(object):
a.LoginPage()
def __init__(self):
pass
def crawl(self, content):
# 进入网页源代码搜索.js 点击进入搜索看是否有'salt''sign''lts'这三个 有则证明找的文件正确 全部复制 网页搜js格式化转化 创建js文件
lts = int(time.time() * 1000) # 时间戳转化为毫秒 时间戳转化为时间 站长工具
timestamp = lts + random.randint(0, 10)
# sign: n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
a = "fanyideskweb"
e = content
i = str(timestamp)
d = "Tbh5E8=q6U3EXe+&L[4c@"
sign = hashlib.md5((a+e+i+d).encode('utf-8')).hexdigest()
data = {
'i': content,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': timestamp,
'sign': sign,
'lts': lts,
'bv': 'dd67d51c2bbb03cccdbcfa48735ba27f',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
'Cookie': 'OUTFOX_SEARCH_USER_ID=406040753@221.204.120.171; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcJcdIfpYuE3eNgyi3Dx; OUTFOX_SEARCH_USER_ID_NCOO=902501357.1460881; user-from=http://www.youdao.com/; from-page=http://www.youdao.com/; _ntes_nnid=250706e8175b6796101a34821527eb62,1612611490655; DICT_SESS=v2|qKlfGGGmbVOAOfp40fQy0UWhfPuOMzWRlfk4Qz0LYERTu0flfn4Ul0l50He40fOW0TK6LlWRf6B0w46LYmh46F0JShMTLOfOm0; DICT_LOGIN=1||1612612510172; STUDY_SESS=EtwvT8KhyXqnLv8r0zdde8FcMOICmtZSIsltEiKZiAQq44wPVNN6PupszWYKIkBKfygQdvKlXU7p3aF+p0H6VcZLod3s2Bld6H/EWIphmRS92qG/3vVhSxHFAXq2yJp8QyH/R6RElNstKdVewVkZp+NyGWhzlamzU5dl6aBiyQ2Ybdo8MpdaPQB26wR6JPAU+P6MxCmnJEvne6pPMc9TTJJnThNrM7aj0X5LVpSBvjZ0h3M1drl4ZsmtkumIhrpyk1pBNevj8UEmS52Cj8DFo+yez89Xrbg4rxsvfSmuH21KlOh/Gwx6G1S/X4FQ7qd/Z2lDsk6Qgl21Md/1bCxa/orloi9qObM4N2yVCVhvkDdg5ILQezB8iskCpUa+ESZk; STUDY_INFO=UID_10AE81F6EF9DD9807BAC3FF3FD6407BA|4|1456638755|1612612364854; ___rl__test__cookies=1612663596564',
'Referer': 'http://fanyi.youdao.com/',
}
request = urllib.request.Request('http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule',
method='POST', data=data, headers=headers)
response = urllib.request.urlopen(request)
result_str = response.read().decode('utf-8')
result_dict = json.loads(result_str)
result = result_dict["translateResult"][0][0]["tgt"]
return result
class Application(object):
def __init__(self):
# 创建一个窗口
self.window = Tk()
# 窗口标题
self.window.title(u'武亮宇翻译词典')
# 设置窗口大小位置
self.window.geometry("280x350+400+150")
# 输入框
self.entry = Entry(self.window)
self.entry.place(x=10, y=10, width=200, height=25) # width=宽度, height=高度
# 查询按钮
self.button = Button(self.window, text=u'查询', command=self.function) # command执行命令的意思 执行这个函数
self.button.place(x=220, y=10, width=50, height=25)
# 翻译结果标题
self.label = Label(self.window, text=u'翻译结果:')
self.label.place(x=10, y=45)
# 翻译框
self.text = Text(self.window, background='#ccc') # 设置背景颜色
self.text.place(x=10, y=75, width=260, height=265)
def function(self):
# 从输入框中获取用户的值
content = self.entry.get()
# 把值发送给有道服务器进行翻译
youdao = YouDao()
result = youdao.crawl(content)
# 把结果放在翻译框里
self.text.delete(1.0, END) # 每次查询先删除一下
self.text.insert(END, result) # 插入文本最后的位置 导入END库
def run(self):
self.window.mainloop()
if __name__ == '__main__':
app = Application()
app.run()
# !/usr/bin/nev python
# -*-coding:utf8-*-
import tkinter
import tkinter.messagebox
class LoginPage(object):
def __init__(self):
#声明两个变量
self.win = tkinter.Tk() # 窗口
self.username = tkinter.StringVar()
self.password = tkinter.StringVar()
self.n=2
self.createForm()
def login(self):
if self.username.get()=='新星计划' and self.password.get()=='新星计划':
print('登录成功')
tkinter.messagebox.showinfo(title='登录信息',message='登录成功')
self.win.quit()
elif self.n==0:
print('你没有权限进入该系统')
self.win.quit()
else:
print('登录失败')
print('账号或密码错误,你还有%d次机会'%self.n)
tkinter.messagebox.showerror(title='登录信息',message='登录失败')
self.n-=1
def createForm(self):
self.win.title('登录界面')
self.win.geometry("280x200+400+150")
#创建标签
labelname = tkinter.Label(self.win,text='用户名:',justify=tkinter.RIGHT,width = 100)
labelname.place(x=35,y=50,width=80,height=20)
#创建文本框
entryname = tkinter.Entry(self.win, width=150, textvariable=self.username)
entryname.place(x=110, y=50, width=120, height=20)
#创建密码标签
labelpwd = tkinter.Label(self.win,text='密 码:', justify=tkinter.RIGHT,width=80)
labelpwd.place(x=35, y=80, width=80, height=20)
#创建密码的文本框
entrypwd = tkinter.Entry(self.win, width=150,textvariable=self.password)
entrypwd.place(x=110, y=80, width=120, height=20)
#创建button按钮
buttonOk = tkinter.Button(self.win,text='登录',command=self.login)
buttonOk.place(x=95,y=130,width=50,height=20)
#创建退出的按钮
buttonQuit = tkinter.Button(self.win,text='退出',command=self.win.quit)
buttonQuit.place(x=145,y=130,width=50,height=20)
self.win.mainloop()
if __name__ == '__main__':
lg = LoginPage()
一共两个py文件,赶快收藏啊,快去试试吧,能拥有自己的翻译词典!!!
五、效果展示
先看一下软件效果,先登录
各种语言都可以转换
来源:https://blog.csdn.net/weixin_54733110/article/details/117449191


猜你喜欢
- vue组件通信的方式,这是在面试中一个非常高频的问题,我刚开始找实习便经常遇到这个问题,当时只知道回到props和 $emit,后来随着学习
- 下面提供生成XML的Google SiteMap代码[ASP版本]。这个代码是生成全站文件链接的地图:<%Server.S
- 操作系统:Windows10 64bitPython版本:3.8.0下载地址:https://www.python.org/download
- 在main.js中按需引入import { Toast} from 'vantVue.use(Toast)页面中的methods中使
- 1.什么是gRPCgRPC是rpc框架中的一种,是rpc中的大哥是一个高性能,开源和通用的RPC框架,基于Protobuf序列化协议开发,且
- 前言help(argparse)查看说明文档,“argparse - Command-line parsing libr
- 本文以实例形式实现了python监控linux性能以及进程消耗性能的方法,具体实现代码如下:# -*- coding: utf-8 -*-&
- python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib
- 前言本文用Python实例阐述了一些关于进程、线程和协程的概念,由于水平有限,难免出现错漏,敬请批评改正。前提条件熟悉Python基本语法熟
- Postman生成okhttp代码依赖<dependency>  
- 代码如下:# -*- coding: utf-8 -*-#!/usr/bin/python# filename: todo.py# code
- 飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累。实现
- 写在最前面:这个我打算分几次写,由于我们通过selenium拿到的图片会很模糊,所以使用Tesseract识别之前要对图片先进行处理。第一步
- 限制访问可以基于某种权限,某些检查或者为login视图提供不同的位置,这些实现方式大致相同。一般的方法是直接在视图的 request.use
- 本文实例讲述了PHP完全二叉树定义与实现方法。分享给大家供大家参考,具体如下:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1)
- 引子之前clubot使用的pyxmpp2的默认mainloop也就是一个poll的主循环,但是clubot上线后资源占用非常厉害,使用str
- python的numpy库集成了很多的函数。利用其中的函数可以很方便的解决一些数学问题。本篇介绍如何使用python的numpy来求解积分。
- 本文实例分析了JS重载实现方法。分享给大家供大家参考,具体如下:重载是面向对象语言里很重要的一个特性,JS中没有真正的重载,是模拟出来的(因
- Flask提供的模板引擎为Jinja2,易于使用,功能强大。模板仅仅是文本文件,它可以生成任何基于文本的格式(HTML、XML、CSV、La
- 前言本文主要给大家介绍了关于golang分页算法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧示例代码如下://