告別網頁搜索!教你用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': '[email protected]; 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': '[email protected]; 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文件,趕快收藏啊,快去試試吧,能擁有自己的翻譯詞典!!!
五、效果展示
先看一下軟件效果,先登錄
各種語言都可以轉換
到此這篇關於告別網頁搜索!教你用python實現一款屬於自己的翻譯詞典軟件的文章就介紹到這瞭,更多相關python翻譯詞典軟件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python爬蟲+Tkinter制作一個翻譯軟件的示例
- Python實戰之設計一個多功能辦公小工具
- python實現登錄與註冊功能
- 基於Python+Tkinter實現一個簡易計算器
- python實現計算器小功能