Python第18课:网络爬虫及class类
时间 2019-01-31 上午10:00
主讲 刘培富
地点 四楼电教室
一、网络爬虫
网络爬虫是利用网络规则,自动获取网页信息的一种程序。换言之,网络爬虫就是代替人工,自动把网页上有价值的内容读出来,存起来。网络爬虫由于自动爬取数据,有选择地收集数据,积累的数据量越来越大,发挥的作用就越来越突出。所以,网络爬虫作为数据采集的一种方式,日益受到人们的重视。
利用python爬数据,可以通过两个包来实现,一个是被比喻为AK47的Scrapy,另一个被比喻为瑞士军刀的requests,下面,以requests为例,讲解爬取数据的方法。
import requests
url='http://www.163.com'
r=requests.get(url)
r.encoding='gb2312'
print(r.text)
以上,即爬到了163网站的首页源码。再经过字符串加工,提取其中有价值的内容。
requests包的功能,远远不止这些,他可以向网页POST用户和密码,模拟用户登陆,并保持session,深入爬取有价值的信息。requests包的功能非常强大,网络上有很多教程,建议大家搜索自学,在此,不再赘述。
注:requests可以通过Anaconda离线安装
二、Clsas类:
在程序开发中,类被频繁使用。类是一个十分重要的概念,学习类的创建、调用,是python的基本功。
什么是类?我的理解是,类是从具体的个例中抽象出来的、具有普遍性的一个虚拟概念。类与实例,是共性与个性的关系。或者说,类好像一个模具,一台机械,可以生产出很多具体的东西来。
下面,通过一些具体的例子,掌握类的创建与使用。
(一)创建一个类
#创建类
class abc(object):
#类的属性:
x=11
__y=22 #变量前面加__代表私有变量
#类的方法:
def __init__(self): #初始化
a=1
b=2
print("init")
def mn(self):
print("mn")
return "ffff"
#创建一个类的对象
a=abc()
print(a.x)#调用x变量
#print(a.__y) 这是错误的,私有变量不可调用
#print(a.__init__()) 这是错误的,私有变量不可调用
a.mn()#执行mn()方法
print(a.mn())#提取mn()方法的运行结果
类的属性,又被称作特征,类的方法,又被称作动作。类就是特征和动作的同一体。创建一个对象,又被称作实例化。这样理解,也是不错的。
(二)创建一个子类
#创建类
class abc(object):
def __init__(self):
print("init")
p=1
def mn(self):
print("mn")
return "ffff"
class abcd(abc):
def xy(self):
print("xy")
p=2
b=abcd()
b.mn()#子类没有找到mn方法,则到父类中找。
print(b.p)
父类和子类创建后,针对用户的调用,首先在本体类中寻找结果,如果找不到,则到父类中寻找(称为类的继承)。如果找到了,就不再到父类中寻找。所以,对于子类和父类共有的属性和方法,互不冲突,只存在优先问题。
pass是空语句,是为了保持程序结构的完整性。 pass 不做任何事情,一般用做占位语句。
(三)类的调用
class Door():
"门的类"
def __init__(self,size,color,type):
"初始化门的数据"
self.size = size
self.color = color
self.type = type
def open(self):
"门打开的方法"
print("这个%s门打开了" %self.type)
def off(self):
"门关闭的方法"
print("这个%s门关闭了" %self.type)
door1 = Door(16,'red','木门')#门的实例化1
door1.open()
door2 = Door(34,'white','铝合金')#门的实例化2
door2.off()
注意self.x变量的使用。
class ABC(object):
x ='x in ABC'
def aa(self, x):
x ='x in aa'
print('aa - x:', x)
print('self.x:', self.x)
t = ABC()
t.aa("")
可见,self.的变量,专指类本身的属性。
(四)类的多继承
一个子类,可以继承一个父类,也可以继承多个父类。
class D:
def bar(self):
print('D.bar')
class C(D):
def bar(self):
print('C.bar')
class B(D):
def bar(self):
print('B.bar')
class A(B, C):
def bar(self):
print('A.bar')
a = A()
a.bar()
执行bar方法时, 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错。
#所以,查找顺序:A本类 --> B父类1 --> D父类1的父类 --> C父类2
在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了。
Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先
当类是经典类时,多继承情况下,会按照深度优先方式查找
当类是新式类时,多继承情况下,会按照广度优先方式查找
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
思考:
str(99),这里,str()是一个函数。
a.strip(),这里,strip()是一个类的方法。
类,是一个抽象的概念,使用时必须实例化。