小小翻译器
一、关键技术
urllib库
1、获取网页信息
# urllib_test01.py
from urllib import request
response = request.urlopen('http://fanyi.baidu.com')
html = response.read()
html = html.decode('utf-8')
print(html)
输出
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>百度翻译</title>
......
req = request.Request('http://fanyi.baidu.com')
response = request.urlopen(req)
html = response.read()
html = html.decode('utf-8')
print(html)
输出
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>百度翻译</title>
......
from urllib import request
request.urlretrieve('http://www.zzti.edu.cn/_mediafile/index/2017/06/24/1qjdyc7vq5.jpg', 'aaa.jpg')
(‘aaa.jpg’, <http.client.HTTPMessage at 0x1ed5027b4e0>)
2、获取服务器响应信息
from urllib import request
f =request.urlopen('http://fanyi.baidu.com')
data = f.read()
print('Status:', f.status, f.reason)
Status: 200 OK
for k, v in f.getheaders(): # 可以看到httpt响应的头信息!
print('%s: %s' % (k, v))
Content-Type: text/html; charset=UTF-8
Date: Mon, 09 Mar 2020 16:30:55 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: yunjiasu
Set-Cookie: BAIDUID=34C7B763CCA69620426A85481F921491:FG=1; expires=Tue, 09-Mar-21 16:30:55 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Tracecode: 18552317720693475338031000
Vary: Accept-Encoding
Yjs-Id: 8b56b17794f42b01-110
Connection: close
Transfer-Encoding: chunked
#-*- coding: UTF-8 -*-
from urllib import request
req = request.Request('http://fanyi.baidu.com')
response = request.urlopen(req)
print('geturl打印信息:%s' % (response.geturl()))
print('****************************************')
print('info打印信息:%s' % (response.info()))
print('****************************************')
print('getcode打印信息:%s' % (response.getcode())) # 返回http状态码!!
geturl打印信息:https://fanyi.baidu.com/
info打印信息:Content-Type: text/html; charset=UTF-8
Date: Mon, 09 Mar 2020 16:34:33 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: yunjiasu
Set-Cookie: BAIDUID=2820773CAD07EC780597BA58D2C2BDFB:FG=1; expires=Tue, 09-Mar-21 16:34:33 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Tracecode: 20735918130605589514031000
Vary: Accept-Encoding
Yjs-Id: 8b56b9febd532afd-110
Connection: close
Transfer-Encoding: chunked
getcode打印信息:200
3、向服务器发送数据
注意:get & post
4、使用 User Agent 隐藏身份
方法一
#-*- coding: UTF-8 -*-
from urllib import request
url = 'http://www.csdn.net/'
head = {}
head['User-Agent'] = """Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"""
req = request.Request(url, headers=head)
response = request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
......
方法二
#-*- coding: UTF-8 -*-
from urllib import request
url = 'http://www.csdn.net/'
req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
response = request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
......
二、源码
1、设计界面
主函数!!!注意布局方法!
from tkinter import *
root = Tk()
root.title('单词翻译器')
root['width'] = 250
root['height'] = 130
Label(root, text = '输入要翻译的内容:', width = 15).place(x = 1, y = 1) # 绝对坐标
Entry1 = Entry(root, width = 20)
Entry1.place(x = 110, y = 1)
Label(root, text = '翻译的结果:', width = 18).place(x=1, y=20) # 绝对坐标(1,20)
s = StringVar()
s.set('大家好,这是测试')
Entry2 = Entry(root, width=20, textvariable = s)
Entry2.place(x = 110, y = 20) # 输入错误,自己都知道改为y = 20才对。。。。。。
Button1 = Button(root, text = '翻译', width = 8)
Button1.place(x = 40, y = 80)
Button2 = Button(root, text = '清空', width = 8)
Button2.place(x = 110, y = 80)
# global former
# former = ''
Button1.bind('<Button-1>', leftClick)
Button2.bind('<Button-1>', leftClick2) # 调用两个 leftClick 事件(下面的函数将定义)!!!
root.mainloop()
我们是谁啊
{‘from’: ‘zh’, ‘to’: ‘en’, ‘trans_result’: [{‘src’: ‘我们是谁啊’, ‘dst’: ‘Who are we’}]}
翻译的结果是:Who are we
2、使用百度翻译开放平台API
import hashlib
m = '2015063000000001apple143566028812345678'
m_MD5 = hashlib.md5(m.encode("utf-8"))
sign = m_MD5.hexdigest()
print('m = ', m)
print('sign = ', sign)
m = 2015063000000001apple143566028812345678
sign = f89f9594663708c1605f3d736d01d2d4
#-*- coding:UTF-8 -*-
from tkinter import *
from urllib import request
from urllib import parse
import json
import hashlib
def translate_Word(en_str):
# simulation browse load host url, get cookie
URL = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
Form_Data = {}
Form_Data['from'] = 'zh'
Form_Data['to'] = 'en'
Form_Data['q'] = en_str
Form_Data['appid'] = '20200309000395526'
Form_Data['salt'] = '1435660288'
Key = '_FLq13OX5RsJUzVttVMI'
m = Form_Data['appid'] + en_str + Form_Data['salt'] +Key
m_MD5 = hashlib.md5(m.encode('utf-8'))
Form_Data['sign'] = m_MD5.hexdigest()
data = parse.urlencode(Form_Data).encode('utf-8')
response = request.urlopen(URL, data)
html = response.read().decode('utf-8')
translate_results = json.loads(html)
print(translate_results)
translate_results = translate_results['trans_result'][0]['dst']
# origin = translate_results['trans_result'][0]['src']
print('翻译的结果是:%s' % translate_results)
return translate_results
def leftClick(event):
en_str = Entry1.get()
print(en_str)
vText = translate_Word(en_str)
s.set(" ")
Entry2 = Entry(root, width=20, textvariable = s)
Entry2.place(x = 110, y = 20) # 输入错误,自己都知道改为y = 20才对。。。。。。
Entry2.config(Entry2, text = vText)
Entry2.insert(0, vText)
def leftClick2(event):
s.set(' ')
Entry2 = Entry(root, width=20, textvariable = s)
Entry2.place(x = 110, y = 20) # 输入错误,自己都知道改为y = 20才对。。。。。。
s.set(' ')
# s.set("")
# Entry2.insert(0, '')