4 发送POST请求
4.3 用poster获取有道在线翻译
参考有道翻译:http://fanyi.youdao.com/
通过Fiddler工具可以获取到
请求的URL地址为:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
提交的请求体参数
i=hello&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=16002154063071&sign=37d97277cb051e71959e772b91309b2b<s=1600215406307&bv=7e14dfdb6b3686cc5af5e5294aaded19&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME
其中,关键参数:
i:要翻译的单词
salt:盐值
sign:签名
盐值和签名是后台反爬虫的机制
使用poster来模拟发送post请求
但是会出现 {"errorCode":50} 错误,因为服务器有反爬虫机制
只要盐值和签名不同,就会报错
经过网上大神指点,把translate_o改为translate即可
4.4 用python实现简单的在线翻译程序
from urllib import request, parse
import ssl
import random
# 常用User-Agent列表
ua_list = [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
]
# 加载一个页面
def loadPage(url, word):
# 在ua_list列表中随机选择一个UserAgent
userAgent = random.choice(ua_list)
headers = {
'User-Agent': userAgent
}
# 发起一个请求
req = request.Request(url, headers = headers)
# 创建未经过验证的上下文的代码
context = ssl._create_unverified_context()
data = {
'i': word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16002154063071',
'sign': '37d97277cb051e71959e772b91309b2b',
'lts': '1600215406307',
'bv': '7e14dfdb6b3686cc5af5e5294aaded19',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
data = parse.urlencode(data).encode('utf-8')
# 打开响应的对象
response = request.urlopen(req, context=context, data=data)
# 获取响应的内容
html = response.read()
# 对获取到的unicode编码进行解码
content = html.decode('utf-8')
return content
import json
def fanyi(word):
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
content = loadPage(url, word)
jsondicts = json.loads(content)
return jsondicts['translateResult'][0][0]['tgt']
if __name__ == '__main__':
word = input('请输入要翻译的单词:')
result = fanyi(word)
print('翻译的结果为:', result)
5.1 面向对象和面向过程5 Python面向对象
面向过程:C、汇编、Basic、Pascal
面向对象:C++、Java、Python、PHP、……
面向过程基于计算机的角度出发考虑问题
面向对象是从人(第三者)的角度出发考虑问题
比如:学生上学
面向过程
起床 洗刷刷 穿衣打扮 出门,往教室方向走 if 遇到十字路口: while 红灯亮: 等待绿灯 走到教室 while 上课时间未到: 等待上课 开始上课 while 下课时间未到: 等待下课 走出教室 吃饭 睡觉 |
面向对象
定义一个学生类 定义学生类的属性:姓名、年龄、专业、年级、…… 定义学生类的方法:吃饭()、睡觉()、上学()、放学()、…… 定义一个教室类 定义教室类的属性:位置、容量、…… 定义教室类的方法:开门()、关门() 定义学生类的对象:zhangsan 定义教室类的对象:417 zhangsan.上学(417) |
总结:
面向对象:适合组织大规模的软件开发
面向过程:底层、快捷、高效
5.2 什么是对象
天上飞的:飞机、大炮、鸟、鹰、……
地上跑的:鸡鸭鹅、猪牛羊
水里游的:鱼虾蟹、……
抽象的概念:项目、规范、原理、方法、……
世界上万事万物都是对象
5.3 区分类和对象
思考:
1 狗是类 狗是对象
2 张三是类 张三是对象
结论:对象更具体、类更抽象
一个类中可以包含多个对象
类是某一种对象的集合(总称)
面向对象编程
5.4 Python中声明类和创建对象
声明类:使用关键字 class
约定规矩:类名首字母必须大写
# 声明一个类
class Dog:
pass
创建类的对象
dog1 = Dog()
print(dog1) # ain__.Dog object at 0x000002AEA3FDFA58>
print(type(dog1)) # s '__main__.Dog'>
Dog是类,dog1是Dog的对象
我们是面向对象的编程,实际上是使用dog1进行编程
5.5 属性
属性是对象所拥有的特征
设置属性
# 声明一个类
class Dog:
pass
dog1 = Dog()
# 设置狗的属性
dog1.name = '旺财'
dog1.age = 13
dog1.sex = 'male'
# 读取狗的属性
print(dog1.name)
print(dog1.age)
print(dog1.sex)
如果想要查看类的属性和方法,可以通过dir() 函数查看
dog1 = Dog()
print(dir(dog1))
# 设置狗的属性
dog1.name = '旺财'
dog1.age = 13
dog1.sex = 'male'
print(dir(dog1))
发现属性是临时添加上去的
如果希望属性是固定在类中的,需要把这些属性写到类的实现代码中
class Dog:
name = '' # 姓名
age = 0 # 年龄
sex = 'female' # 性别
dog1 = Dog()
print(dir(dog1))
dog2 = Dog()
print(dir(dog2))
5.6 方法
方法是类的对象的一系列的操作
需要在类中定义方法
def 方法名(方法的参数): 方法的实现代码 方法的返回值 |
注意:方法名首字母必须小写
class Dog:
# 狗叫的方法
def bark(self):
print('旺')
dog1 = Dog()
dog1.bark()
方法可以传递参数
class Dog:
# 狗叫的方法
def bark(self):
print('旺')
def eat(self, something):
print('狗吃' + something)
dog1 = Dog()
dog1.bark()
dog1.eat('骨头')
给方法加上返回值
class Dog:
name = ''
# 狗叫的方法
def bark(self):
print('旺')
def eat(self, something):
print('狗吃' + something)
def setName(self, name):
self.name = name
def getName(self):
return self.name
dog1 = Dog()
dog1.bark()
dog1.eat('骨头')
dog1.setName('旺财')
print(dog1.getName())
5.7 __init__
__init__是Python自带的方法,需要至少一个参数self
__init__的作用是初始化,创建类的对象的时候,需要做的准备工作
(连接网络、打开文件、连接数据库)
当类的对象被创建的时候,该方法就会被调用
class Dog:
# 初始化
def __init__(self, name, age):
self.name = name
self.age = age
dog1 = Dog('旺财', 8)
print(dog1.name)
print(dog1.age)
dog2 = Dog('小花', 12)
print(dog2.name)
print(dog2.age)
5.8 __del__
删除对象的时候清理用的,调用者使用del关键字时候触发
class Dog:
# 初始化
def __init__(self, name, age):
self.name = name
self.age = age
# 销毁
def __del__(self):
print('__del__')
self.name = ''
self.age = 0
dog1 = Dog('旺财', 8)
print(dog1.name)
print(dog1.age)
del dog1 # 主动触发 __del__
print('over') # 程序结束
5.9 封装
面向对象的三大特征:封装、继承、多态
属性的公有和私有
Python中描述私有属性和私有方法,通过前置下划线来表示
1 _xxx:单前置下划线
2 __xxx:双前置下划线
3 __xxx__:双前置双后置下划线。类的内部已经定义好了
描述私有,一般使用双前置下划线
class Dog:
# 初始化
def __init__(self, name, age):
self.__name = name
self.__age = age
def getName(self):
return self.__name
# 返回对象本身的描述字符串
def __str__(self):
return 'name:%s, age:%s' % (self.__name, self.__name)
dog1 = Dog('旺财', 8)
#print(dog1.__name) # 在外部不能直接访问__name属性
print(dog1.getName())
print(dog1)
5.10 继承
子类继承父类
class 子类(父类): 子类的实现的代码 |
父类的所有的非私有属性和方法,子类中都会继承,并可以直接使用
# 父类
class Animal:
def eat(self):
print('Animal eat')
# 子类
class Dog(Animal):
pass
dog1 = Dog()
dog1.eat()
子类可以重写父类的方法
# 父类
class Animal:
def eat(self):
print('Animal eat')
# 子类
class Dog(Animal):
def eat(self):
print('Dog eat')
dog1 = Dog()
dog1.eat()
还可以在子类方法中调用父类的方法
# 父类
class Animal:
def eat(self):
print('Animal eat')
# 子类
class Dog(Animal):
def eat(self):
super().eat() # 调用父类的eat()方法
print('Dog eat')
dog1 = Dog()
dog1.eat()
子类还可以派生它的子类
# 子类的子类
class HabaDog(Dog):
def eat(self):
print('HabaDog eat')
dog2 = HabaDog()
dog2.eat()
Python中的约定:
如果一个类没有继承任何类,将默认继承object类
如下两种写法效果相同
# 父类
class Animal:
def eat(self):
print('Animal eat')
# 父类
class Animal(object):
def eat(self):
print('Animal eat')
在Python3中,建议使用后者
5.11 多态
不同事物,对同一个操作所表现出来的多种形态
外科医生、厨师、演员。Cut
动手术、切菜、下班
Python的多态比较简单(与Java比起来)
# 父类
class Animal(object):
def eat(self):
print('Animal eat')
class Dog(Animal):
def eat(self):
print('Dog eat')
class Man(Animal):
def eat(self):
print('Man eat')
class Woman(Animal):
def eat(self):
print('Woman eat')
# 函数
def doEat(obj):
obj.eat()
dog1 = Dog()
man1 = Man()
woman1 = Woman()
doEat(dog1)
doEat(man1)
doEat(woman1)
doEat()函数中,理论上可以传递任意的参数。如果该参数的对象没有eat()方法,怎么办?
考虑使用 isinstance() 函数。判断是否为某个类的对象
print(isinstance(dog1, Dog)) # True
print(isinstance(dog1, Animal)) # True
print(isinstance(a1, Animal)) # True
print(isinstance(a1, Dog)) # False
print(isinstance('hello', Animal)) # False
可以在doEat()函数中,添加isinstance(),判断输入的obj是否为Animal的对象,只有是Animal对象时,才能调用eat()方法
# 函数
def doEat(obj):
# obj只有为Aniaml类或子类对象才有eat方法
# isinstance判断是否为某个类或子类的对象
# 参数1 obj 对象
# 参数2 type 类(类型)
if isinstance(obj, Animal):
obj.eat()