爬虫-day03

一、cookie和session

1、什么是cookie?
	cookie是指网站为了鉴别用户身份,进行会话跟踪而存储在客户端本地的数据。
2、什么是session?
	本来的含义是指有始有终的一些列动作,而在web中,session对象用来在服务器存储特定用户会话所需要的属性及信息。
3、cookie和session产生的原因:
	cookie和session他们不属于http协议范围,由于http协议是无法保持状态,但实际情况,我们有需压保持一些信息,作为下次请求的条件,所有就产生了cookie和session。
4、cookie的原理:
	由服务器产生,当浏览器第一次登录,发送请求到服务器,服务器返回数据,同时生成一个cookie返回给客户端,客户端将这个cookie保存下来。
	当浏览器再次访问,浏览器就会自动带上cookie信息,这样服务器就能通过cookie判断是哪个用户在操作。
	
	cookie的缺陷:
		1、不安全--保存在客户端。
		2、cookie本身最大支持4096(4kb)---存储大小受限。
5、session的工作原理。
	正是因为cookie的缺陷,所有产生了另外一种保持状态的方法---session。
	服务器存储session,基于http协议的无状态特征,所以服务器就不知道这个访问者是谁。为了解决这个问题,cookie就起到了桥的作用。cookie在使用的过程中,将一个叫做sessionid的字段放到cookie中,将来服务器可以通过这个id字段来查找到地上那个用户的session。
	
	session的生命周期:当用户第一次登陆时创建(生命开始),到session有效期结束(30min)。
	
6、当我们浏览器关闭,session是否就失效了?
	不失效,原因,session失效使用生命周期决定的。
7、cookie组成:
	name:cookie名称,一旦创建,不可更改。
	value:该cookie的值
	domain:者cookie可以访问网站域名。
	maxage:cookie的失效时间。负数是永不失效。
	path:这个使用路径
	http字段:cookie的httponly,若次属性为true,则只有http头中会带此cookie。
	secrue:该cookie是否仅被使用安全传输协议。
	size:cookie的大小
	
8、会话cookie和持久cookie。
	持久化:将内存中的数据存储到硬盘(文件中,数据库)上的过程。
	序列化:将对象保存到硬盘上。
	
	会话cookie:保存在内存中cookie,浏览器关闭,cookie失效。
	持久cookie:保存在硬盘上的cookie。
9、用requests实现登陆:
(1)只需要将【登陆后的】cookie字段封装在请求头中。
(2)使用requests的session对象登陆
	session对象可以记录登陆状态。
	使用步骤:
	#session:记录登陆状态
	se = requests.Session()
	data = {
		'email':'13016031459',
		'password':'12345678',
	}
	#此时se对象就保存了登陆信息
	se.post(base_url,data = data,headers = headers)
	------------------------------------------
	index_url = 'http://www.renren.com/971682585/profile'
	#用se对象来进行个人首页的访问,就可以了
	response = se.get(index_url,headers=headers)
	if '鸣人' in response.text:
		print('登陆成功!')
	else:
		print('登陆失败!')

第三讲 正则表达式

一、数据的分类

1、结构化数据
	特点:数据以行为单位,每一个数据表示一个实体。每一行数据的属性都是一样的。
	举例:关系型数据库中的表就是结构化数据。
	处理方法:sql
2、半结构化数据
	特点:结构化数据的另一种形式。他并不符合关系型数据的特点,不能用关系型模型来描述。但是这种数据包含相关标记,有用来分割语义元素以及字段进行分层的描述。
	因此也被称为自描述结构。
	举例:xml,html,json
	处理方法:正则,xpath,jsonpath,css选择器。
3、非结构化数据:
	特点:没有固定结构的数据。
	举例:文档、图片、音频、视频。
	处理方法:常常用二进制形式来做整体保存。

二、json数据

1、json是什么语言的内容?
	json是js语言中用来用【字符串格式】来保存对象和数组的一种数据结构。
	json数据本质上是字符串。
2、js种数组和对象:
	js的数组:var array  = ['aaa','bb','cc']----和python列表对应
	js的对象:var obj = {name:'zhangsan',age:10}---和python字典对应。
		name = obj.name
3、json数据的解析方法:
	json模块:
	对json字符串的操作“:
		json.loads(json_str)--->python的list或者dict
		json.dumps(python的list或者dict) --->json_str
	------
	对json文件的操作:
		json.load(fp)--->从json文件中读出json数据,返回一个python的list或者dict
		json.dump(python的list或者dict,fp)---》python的list或者dict保存到fp所对应的的文件中。

4、json的意义:
	json作为数据格式进行传输,具有较高的效率
	json不像xml那样具有严格的闭合标签,所以json作为数据传输的时候,他的数据有效占比(有效数据和总数据的比)比xml高很多。
	在相同流量下,json比xml作为数据传输,传输的数据更多。

三、正则表达式

1、元字符
	(1)匹配边界:
		^ ----行首
		$-----行尾
	(2)重复次数
		?----0次或1次
		*----->=0
		+---- >=1
		{n,}--->=n
		{n,m}--->=n,<=m
		{n}----n次
	(3)各种字符的表示
		[]----匹配括号中一个字符,单字符
		[abc]--匹配a或者b或者c
		[a-z0-9A-Z]
		\d---数字
		\w---数字字母下划线
		\s---空白字符:换行符、制表符、空格
		\b---单词边界
		.----除换行符以外的任意字符。
2、re模块的使用。
	python中re模块是用来做正则处理的。
(1)re模块的使用步骤:
	#1导包
	import re
	#2将正则表达式编译成一个pattern对象
	pattern = re.complie(
				r'正则表达式',
				'匹配模式'
				)
	r表示元字符。
	#3、用pattern对象来使用相应的方法来匹配内容。

(2)pattern对象的方法:
	1.match方法:默认从头开始,只匹配一次,返回一个match对象。
	pattern.match(
		'匹配的目标字符串',
		start,匹配开始的位置--缺省,start = 0
		end,匹配结束的位置--缺省,end = -1
	)--->match对象
	
	match对象的属性:
		match.group()---获取匹配内容。
		match.span()--匹配的范围
		match.start()---开始位置
		match.end()---结束位置
			这些方法都可以带一个参数0,但是不能写1,1来表示取分组。
			match.group(0)---获取匹配内容。
			match.span(0)--匹配的范围
			match.start(0)---开始位置
			match.end(0)---结束位置
			match.groups()--将所有分组的内容,按顺序放到一个元组中返回
	2、search方法:从任意位置开始匹配,只匹配一次,返回一个match对象
		pattern.search(
			'匹配的目标字符串',
			start,匹配开始的位置--缺省,start = 0
			end,匹配结束的位置--缺省,end = -1
		)--->match对象
	
	3、findall方法:全文匹配,匹配多次,将每次匹配到的结果放到list中返回。
		pattern.findall(
			'匹配的目标字符串',
			start,匹配开始的位置--缺省,start = 0
			end,匹配结束的位置--缺省,end = -1
		)--->list	
		
		
	4、finditer方法:全文匹配,匹配多次,返回一个迭代器。
		pattern.finditer(
			'匹配的目标字符串',
			start,匹配开始的位置--缺省,start = 0
			end,匹配结束的位置--缺省,end = -1
		)--->list	
		finditer主要用匹配内容比较多的情况下。


	5、split:切分,按照正则所表示内容进行切分字符串,返回切分后的每个子串
		pattern.split(
			'要切分的字符串',
			'切分字数',默认是全部分。
		)--->list
	6、sub方法:用指定字符串,替换正则表达所匹配到的内容。
		pattern.sub(
			repl,#替换成什么
			content,替换什么
			count,替换次数,默认替换所有
		)--->替换后的字符串。
		
		repl替换内容可以使函数:
			函数要求:
				1.函数必须有参数,参数就是正则匹配目标字符串所得到的每个match对象。
				2、这个函数必须要有返回值,返回值必须是字符串,这个字符串将来就作为替换的内容。
		
		#zhangsan:3000,lisi:4000
		#涨工资每个人涨1000
		content = 'zhangsan:3000,lisi:4000'
		p = re.compile(r'\d+')
		result = p.sub(add,)

	7、分组
		分组在正则表达式中使用()来表示的,一个括号就是一个分组。
		分组的作用:
		(1)筛选特定内容
		(2)可以在同一个表达式中应用前面的分组:
			\1引用第一分组
		(3)findall配合分组
			import re

			content = '<html><h1>正则表达式</h1></html>'
			p = re.compile(r'<(html)><(h1)>(.*)</\2></\1>')
			# print(p.search(content).group())
			print(p.findall(content))#[('html', 'h1', '正则表达式')]
	8、贪婪非贪婪模式
		(1)贪婪和非贪婪的却别在于匹配内容的多少。
		(2)贪婪使用*来控制匹配次数的。正则默认是贪婪。
		(3)非贪婪使用?来控制的。
		(4)在表示数量控制元字符后面加一个?,此时就表示这个数量控制符取最小值,也就是非贪婪。
	
	9.匹配模式:
		re.S ----.可以匹配换行符
		re.I----忽略大小写。

	10、万能正则匹配表达式:.*?(尽可能少匹配任意内容)配合re.S
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值