python面向对象编程和requests的使用
面向对象简介
一个类占有一个独立的空间,类中的属性叫做类变量,类中的函数,叫做类的方法。
类(Class):也可以成为类对象。类对象中包含了一批实例对象共有的属性和方法。
类变量:定义在类中且在函数体之外的变量。类变量在所有的实例变量中是共享的,类变量修改了,所有实例对象读取到的值都会修改。
实例变量:定义在类的实例方法中的变量,只作为当前实例的属性。
数据成员:类变量或者实例变量,以及用于处理类及其实例对象的相关的数据的统称。
方法:类中定义的函数。包含实例方法,类方法,静态方法。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。其实只是在派生类中添加了同名方法,以至于查询方法时不会再向基类查询
继承:即一个派生类(derived class)继承基类(base class)的属性和方法。继承也允许把一个派生类的对象作为一个基类对象对待。(就是说派生类还可以再派生子类)
实例化:创建一个类的实例,类的具体对象。在实例对象开辟一个空间,并为实例对象添加对类的引用。并没有复制类中的属性和方法到实例对象中。
实例对象:通过类定义的数据结构实例。
三大特征——封装、继承、多态
1、封装(Encapsulation)
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。
class Foo:
def __init__(self, name, age ,gender):
self.name = name
self.age = age
self.gender = gender
def eat(self):
print "%s,%s岁,%s,eat" %(self.name, self.age, self.gender)
def he(self):
print "%s,%s岁,%s,drink" %(self.name, self.age, self.gender)
def shui(self):
print "%s,%s岁,%s,sleep" %(self.name, self.age, self.gender)
a = Foo('Duncan', 22, 'male')
a.eat()
a.he()
a.shui()
b = Foo('Tina', 30, 'female')
b.eat()
b.he()
b.shui()
2、继承(Inheritance)
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
class Animal:
def eat(self):
print "%s 吃 " %self.name
class Cat(Animal):
def __init__(self, name):
self.name = name
self.breed = 'cat'
def cry(self):
print '喵喵..'
class Dog(Animal):
def __init__(self, name):
self.name = name
self.breed = 'dog'
def cry(self):
print '汪汪..'
c1 = Cat('cat_one')
c1.eat()
c2 = Cat('cat_two')
c2.drink()
d1 = Dog('dog_one')
d1.eat()
3、多态(Polymorphism)
让具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容(功能)的函数。
特点:
1、只关心对象的实例方法是否同名,不关心对象所属的类型;
2、对象所属的类之间,继承关系可有可无;
3、多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
4、多态是调用方法的技巧,不会影响到类的内部设计。
class A:
def prt(self):
print "A"
class B(A):
def prt(self):
print "B"
class C(A):
def prt(self):
print "C"
class D(A):
pass
class E:
def prt(self):
print "E"
class F:
pass
def test(arg):
arg.prt()
a = A()
b = B()
c = C()
d = D()
e = E()
f = F()
test(a)
test(b)
test(c)
test(d)
test(e)
test(f)
实例
主函数
if __name__ == '__main__':
s = student()
print(s)
print(id(s))
s.learn()
student类
class student(object):
def __init__(self):
self.number = 202031990532
self.name = "yjp"
def learn(self):
print("正在学习")
def teach(self):
pass
自定义类中需要传入object参数, def init(self) 为自定义类中的构造方法,self为自定义类的参数本体表示,作为自定义类中所有方法的必加参数。
if name == ‘main’ 为主函数中标志, s = student() 为类的实例化,python中采用弱类型定义,通过等号右边的类型来确定等号左边的对象类型。
requests的使用
requests属于第三方库,Python不内置,因此需要我们手动安装。
pip安装
pip install requests
验证安装
在命令行可通过导入import库来测试requests是否安装成功。
导入库成功,说明requests安装成功
基本用法
步骤
1.发送请求
start_url = "https://www.baidu.com/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
}
response = requests.get(start_url,headers=headers).text
确定需要访问的url,以及headers(进行UA伪装,通过浏览器的User-Agent对爬虫进行伪装)
通过requests的get方法进行请求
2.解析响应
通过页面的html代码对所需的内容进行分析,确定所需内容部分的标签
3.解析数据
title = re.findall("<title>(.*?)</title>", response)[0]
4.保存数据
with open("data.txt",'w') as f:
f.write(title)
完整代码
import requests
import re
def main():
start_url = "https://www.baidu.com/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
}
#1.发送请求
response = requests.get(start_url,headers=headers).text
#2.解析响应
#3.解析数据
title = re.findall("<title>(.*?)</title>", response)[0]
#4.保存数据
with open("data.txt",'w') as f:
f.write(title)
if __name__ == '__main__':
main()