使用网络爬虫编写一款翻译程序,最后通过pyinstaller打包为可执行exe程序
进入翻译网站网页开发者模式,在headers中找到from_data数据。获取URL,headers和User-Agent(用户代理),用来伪装浏览器访问。由于from_data数据是json类型的,所以在程序里的from_data数据也应改为json类型。用requests库发送POST请求,并将翻译结果返回给用户。
程序运行效果:
- 相关理论
- 爬虫技术
爬虫:请求网站并提取数据的自动化程序。
爬虫原理:
- 向服务器发起请求:
通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器的响应。
- 获取响应内容:
如果服务器正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)。
- 解析内容:
得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转成JOSN对象进行解析,可能是二进制数据,可以保存或者进一步处理 。
- 保存内容:
保存形式多样,可以保存成文本,也可以保存至数据库,或者保存成特定格式的文件。
-
- Requests库
浏览器发送消息给网址所在的服务器,这个过程就叫做HTPP Request。主要有:GET/POST两种类型函数,另外还有HEAD/PUT/DELETE/OPTIONS。GET和POST的区别就是:请求的数据GET是在url中,POST则是存放在头部。
本实验用到的是Request 库中的POST函数,它向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源或二者皆有。
-
- Tkinter库介绍
Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口。Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macintosh系统里Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
Tkinter包含了若干模块。Tk接口被封装在一个名为 _tkinter 二进制模块里( tkinter 的早期版本)。 这个模块包含了Tk的低级接口。因而它不会被程序员直接应用。它通常表现为一个共享库(或DLL文件),但在一些版本中它与Python解释器结合在一起。
在Tk接口的附加模块中,Tkinter包含了一些Python模块,保存在标准库的一个子目录里。称为 tkinter。 其中有两个重要的模块。一个是Tkinter自己,另一个叫做Tkconstants:前者自动导入后者,所以你如果使用Tkinter,仅仅导入一个模块就可以。
Place函数(以坐标为准的布局方案;和它用法相 同的函数还有grid和pack)
Title函数(返回"标题化"的字符串)
Geometry函数(获取几何对象的中心点)
Label函数()折叠
Text函数 ()
Button函数 (展现不同样式的按钮)
代码如下:
import requests
import tkinter as tk
root = tk.Tk()
root.title('python自制翻译软件')
root.geometry('400x200')
l1 = tk.Label(root,text='请输入翻译内容:',fg="red",font=("楷体", 20))
l1.place(x=200, y=0, anchor='n')
t1 = tk.Text(root,width=56,height=5)
t1.place(x=200, y=30, anchor='n')
def translate():
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {
'i': t1.get(0.0,'end'),
'from':'zh',
'to':'en',
'smartresult': 'dict',
'client': 'fanyideskweb',
'doctype': 'json',
'version': '2.1',
'keyfrom':'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
response = requests.post(url,data=data).json()
r = response['translateResult'][0][0]['tgt']
t1.delete(0.0,'end')
t1.insert('end',r)
b1 = tk.Button(root,text='中英互译',width=8,font=("楷体"),command=translate)
b1.place(x=100, y=105, anchor='n')
def translate():
url = 'http://fy.iciba.com/ajax.php?a=fy'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
data = {
'f': 'zh-CN',
't': 'ja',
'w': t1.get(0.0,'end')
}
response = requests.post(url, data=data, headers = headers).json()
r = response["content"]['out']
t1.delete(0.0, 'end')
t1.insert('end', r)
b2 = tk.Button(root,text='中→日',width=8,font=("楷体"),command=translate)
b2.place(x=200, y=105, anchor='n')
def translate():
url = 'http://fy.iciba.com/ajax.php?a=fy'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
data = {
'f': 'ja',
't': 'zh-CN',
'w': t1.get(0.0,'end')
}
response = requests.post(url, data=data, headers = headers).json()
r = response["content"]['out']
t1.delete(0.0, 'end')
t1.insert('end', r)
b3 = tk.Button(root,text='日→中',width=8,font=("楷体"),command=translate)
b3.place(x=300, y=105, anchor='n')
def translate():
url = 'http://fy.iciba.com/ajax.php?a=fy'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
data = {
'f': 'zh-CN',
't': 'de',
'w': t1.get(0.0,'end')
}
response = requests.post(url, data=data, headers = headers).json()
r = response["content"]['out']
t1.delete(0.0, 'end')
t1.insert('end', r)
b4 = tk.Button(root,text='中→德',width=8,font=("楷体"),command=translate)
b4.place(x=100, y=150, anchor='n')
def translate():
url = 'http://fy.iciba.com/ajax.php?a=fy'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
data = {
'f': 'de',
't': 'zh-CN',
'w': t1.get(0.0,'end')
}
response = requests.post(url, data=data, headers = headers).json()
r = response["content"]['out']
t1.delete(0.0, 'end')
t1.insert('end', r)
b5 = tk.Button(root,text='德→中',width=8,font=("楷体"),command=translate)
b5.place(x=200, y=150, anchor='n')
def clean():
t1.delete(0.0,'end')
b6 = tk.Button(root,text='清除',width=8,font=("楷体"),command=clean)
b6.place(x=300, y=150, anchor='n')
root.mainloop()