类
面向对象
首字母大写的名称指的是类。
方法__init__(self.)
class Car():
def __init__(self,make,model,year):#字段:保存在对象里面
self.make=make
self.model=model
self.year=year
def get_descriptive_name(self):#方法:保存在类里面
long_name=str(self.year)+""+self.make+""+self.model
return long_name.title()
my_new_car=Car("audi",'a4',2016)
print(my_new_car.get_descriptive_name())#调用
类成员:字段、方法、属性
class Provience():
country="中国"
#静态字段,属于类,执行时可以通过对象访问,也可以通过类访问
def __init__(self,name):
self.name=name
#普通字段,属于对象,只能通过对象访问
henan=Provience("河南")
print(Provience.country)
print(henan.name)
方法分为三种:
普通方法:保存在类中,由对象调用
静态方法:保存在类中,由类直接调用
类方法:和静态方法比较类似,
使用情景:
正则表达式
是一种用来描述并匹配特定字符串的工具
匹配
字符串
字符串提供的方法为完全匹配,模糊匹配字符串无法做到,这时候采用正则表达式,Python通过re模块来使用正则表达式
#普通字符
#元字符
ret=re.findall('w..l','hello world')
print(ret)
#.代指所有字符 不能匹配换行符 通配符
#尖角符
ret=re.findall('^h...o','hello world')
print(ret)
#从开始匹配
#$ 从结尾开始匹配
ret=re.findall('r.d$','hello world')
print(ret)
#+重复1到无穷次
ret=re.findall('h.l+o','hellllllo world')
print(ret)
#?[0,1]只能取0 1
ret=re.findall('a?b','aaaaabcccabdddb')
print(ret)
#{}可以任意取 加范围
ret=re.findall('a{1,3}b','aaab')
print(ret)
#贪婪匹配 按最大的匹配
#结论*为0到正无穷
#+是一到正无穷
#?等价于0到1
#{}是可以取任意范围
#推荐使用*+?
#[]字符集 匹配其中的一个字符
ret=re.findall('a[a,c]b','aaab')
print(ret)
#字符集:取消元字符的特殊功能
ret=re.findall('a[*]b','aaa*b')
print(ret)#其中*只是一个普通的字符
#但是其中有三个例外【\ ^ -】
ret=re.findall('[a-z]b','aaab')
print(ret)
#^加在中括号内,说明取除了a以外的内容
ret=re.findall('[^a]b','aaabbcbb')
print(ret)
#\最重要的一个 反斜杠后边跟元字符去除其特殊功能
#反斜杠跟普通字符实现特殊功能
\d匹配任何十进制数,相当于类[0—9]
\D匹配任何非数字字符,相当于类[^0-9】
\s匹配任何空白字符 即\t \n \f \r \v
\S
\w匹配任何字符数字字符
\W
\b:匹配一个特殊字符边界,也就是单词和空格间的位置
ret=re.search('a.','afege').group()
print(ret)
ret=re.search('a\.','afege').group()
print(ret)
re模块
macth函数
只在字符串开始匹配
ret=re.match('asd','asdjo,p')
print(ret)
group函数
search函数
#匹配第一个满足条件的结果 返回一个对象(object)可以调用group方法拿到结果
ret=re.search('alex','fafagraalexfwfeg')
print(ret)
print(ret.group())
split
ret=re.split('[a,b]','fagsrgbom')
print(ret)
print(re.search('alex','fafagraalexfwfeg'))
findall函数 所有结果都返回列表里面
http请求
爬虫需要模拟浏览器的操作,才能去获取网页的信息;有些网站需要登录,才能
获取更多的资料;更有些网站登录后需要保存cookie信息才能继续获取更多资料。
解决这些“难题”,需要了解HTTP协议。
1.什么是HTTP协议?
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩
写,是用于从万维网(WWW:World Wide Web )服务器传输超文到本地浏览器的传送协议。在这份协议中:
规定了客户端应该按照什么格式给服务器发送请求
约定了服务端返回的响应结果应该是什么格式
HTTP 协议规定:请求从客户端发出, 最后服务器端响应该请求并返回。
即先从客户端开始建立通信的, 服务器端在没有接收到请求之前不会发
送响应。
2.HTTP请求
HTTP 请求由3部分组成,分别是:
• 请求行
• 请求首部
• 请求体
其中首部和请求体是可选的,即并不是每个请求都需要的。
(1)请求行
请求行是每个请求必不可少的部分,它由3部分组成,分别是请求方法
(method)、请求URL(URI)、HTTP协议版本,以空格隔开。
以上图为例,起始行开头的GET表示请求访问服务器的类型, 称为方法
(method) 。 随后的字符串 /index.htm 指明了请求访问的资源对象,
也叫做请求 URI(request-URI) 。 最后的 HTTP/1.1, 即 HTTP 的版本
号, 用来提示客户端使用的 HTTP 协议功能。
翻译过来就是:这段请求内容的意思是: 请求访问某台 HTTP 服务器上的
/index.htm 页面资源。
HTTP协议中最常用的请求方法有:GET、POST、PUT、DELETE。GET 方
法用于从服务器获取资源,90%的爬虫都是基于GET请求抓取数据。
(2)请求首部
因为请求行所携带的信息量非常有限,以至于客户端还有很多想向服务器要
说的事情不得不放在请求首部(Header),请求首部用于给服务器提供一
些额外的信息,比如 User-Agent 用来表明客户端的身份,让服务器知道你
是来自浏览器的请求还是爬虫,是来自 Chrome 浏览器还是 FireFox。
(3)请求体
请求体是客户端提交给服务器的真正内容,比如用户登录时的需要用用户名和密码,比如文件上传的数据,比如注册用户信息时提交的表单信息。