爬虫第三课,正则

标题1.cookie和session

1.产生的原有:
由于http是一个无状态的协议,每次请求如果需要之前请求的一些信息,此时必须重发送之前的请求。为了解决这种问题,产生了一种记录状态技术—就是cookie和session。
2、cookie是在客户端记录状态。session是在服务端记录状态。
3、在做爬虫的时候,如果要实现登录,只需要将浏览器中登录后的cookie信息封装到请求头中就可以实现登录了。
4、对于session,会话, 其本来的含义是指有始有终的一系列动作/ 消息。而在web 中, 会话对象用来存储特定用户会话所需的属性及配置信息。
当客户端发送一个cookie,服务器会从这个cookie中找到sessionId,在查找出相应session信心返回给客户端,来进行用户页面的流转。如果通过sessionid来查找session,发现session没有,因为第一次登陆,就会创建一个session。在session有效期内,继续访问该页面,服务器就会直接查找到这个session返回给客户端。
session什么时候失效呢?
当session的失效时间到达时失效,一般是30分钟。

5、cookies 指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。
6.cookie和session一般是配合使用的。当cookie被用户禁用,session怎么使用?
有两种方法:
1.提示他必须开启。
2.使用url重传。—就是将sessionid附带url后面传递给服务器。

标题7.cookie的组成:

	囗Name : 该的名称。一旦创建, 该名称便不可更改。
	囗value : 该cookie 的值。如果值为Unicode 字符, 需要为字符编码。如果值为二进制数据, 则需要使用BASE64 编码。
	囗Domain : 可以访问该cookle 的域名。例如, 如果设置为.zhihu.com , 则所有以zhihu.com 结尾的域名都可以访问该cookie。
	囗MaxAge : 该cookie 失效的时间, 单位为秒, 也常和Expires— 起使用, 通过它可以计算出其有效时间。Max Age 如果为正数, 则该cookie 在Max Age 秒之后失效。如果为负数, 则关闭浏览器时cookie 即失效, 浏览器也不会以任何形式保存该cookie 。
	囗Path : 该cookie 的使用路径。如果设置为/path/ , 则只有路径为/ path / 的页面可以访问该cookie 。如果设置为/ , 则本域名下的所有页面都可以访问该cookieo
	囗Size 字段: 此Cookie 的大小。
	囗HTTP 字段: cookie 的httponly 属性。若此属性为true , 则只有在HTTP 头中会带有此Cookie 的信息, 而不能通过document.cookie 来访问此Cookie。
	囗Secure : 该cookie 是否仅被使用安全协议传输。安全协议有H TTP s 和SSL 等, 在网络上传输数据之前先将数据加密。默认为false。

标题8、会话cookie和持久cookie

会话cookie就是指存储在浏览器内存中的cookie,当浏览器关闭,会话cookie失效。
持久cookie是保存在硬盘上的cookie。
这两中cookie的分类标准主要是通过maxAge或者expires这个cookie的字段来定义的----->为负数,则为会话cookie。

标题9.在爬虫中登录的实现方法有两种:

1.封装登陆后页面中的cookie在请求头中。
2.使用requests的session对象,来做到登录。
	
	session = requests.session()
这个session对象可以记录登录状态。

标题10代理

(一)代理基本原理
代理实际上指的就是代理服务器, 英文叫作proxy server ,它的功能是代理网络用户去取得网络信息。形象地说, 它是网络信息的中转站。在我们正常请求一个网站时, 是发送了请求给web 服务器,web 服务器把响应传回给我们。如果设置了代理服务器, 实际上就是在本机和服务器之间搭建了一个桥, 此时本机不是直接向web 服务器发起请求, 而是向代理服务器发出请求, 请求会发送给代理服务器, 然后由代理服务器再发送给web 服务器, 接着由代理服务器再把web 服务器返回的响应转发给本机。这样我们同样可以正常访问网页, 但这个过程中web 服务器识别出的真实IP 就不再是我们本机的IP 了, 就成功实现了IP 伪装, 这就是代理的基本原理。
(二)代理的作用
1、突破自身IP 访问限制, 访问一些平时不能访问的站点。
2、访问一些单位或团体内部资源: 比如使用教育网内地址段免费代理服务器, 就可以用于对教育网开放的各类FTP 下载上传, 以及各类资料查询共享等服务。
3、提高访问速度: 通常代理服务器都设置一个较大的硬盘缓冲区, 当有外界的信息通过时, 同时也将其保存到缓冲区中, 当其他用户再访问相同的信息时, 则直接由缓冲区中取屮信息传给用户, 以提高访问速度。
4、隐藏真实IP : 上网者也可以通过这种方法隐藏自己的IP , 免受攻击。对于爬虫来说, 我们用代理就是为了隐藏自身IP , 防止自身的被封锁。
(三)代理的分类
1、根据协议区分
根据代理的协议, 代理可以分为如下类别。
FTP 代理服务器:主要用于访问FTP 服务器, 一般有上传、下载以及缓存功能, 端口一般为21 、2121 等。
HTTP 代理服务器:主要用于访问网页, 一般有内容过滤和缓存功能, 端口一般为80 、8080 、3128 等。
SSL/TLS 代理:主要用于访问加密网站, 一般有SSL 或TLS加密功能( 最高支持128 位加密强度) , 端口一般为443 。
RTSP 代理:主要用于访问Real 流媒体服务器, 一般有缓存功能, 端口一般为554 。
Telnet 代理:主要用于telnet 远程控制( 黑客人侵计算机时常用于隐藏身份),端口一般为23 。
POP3/SMTP 代理:主要用于POP3/SMTP 方式收发邮件, 一般有缓存功能, 端口一般为110 / 25 。
SOCKS 代理:只是单纯传递数据包, 不关心具体协议和用法, 所以速度快很多, 一般有缓存功能, 端口一般为1080 。SOCKS 代理协议又分为SOCKS4 和SOCKS5 , 前者只支持TCP ,而后者支持TCP 和UDP , 还支持各种身份验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的SOCKS5 都可以做到, 但SOCKS5 能做到的SOCKS4 不一定能做到。
2、根据匿名程度区分
根据代理的匿名程度, 代理可以分为如下类别。
高度匿名代理: 会将数据包原封不动地转发, 在服务端看来就好像真的是一个普通客户端在访问, 而记录的IP 是代理服务器的IPO
普通匿名代理: 会在数据包上做一些改动, 服务端上有可能发现这是个代理服务器, 也有一定几率追查到客户端的真实伊代理服务器通常会加人的HITP 头有HTTP_VIA 和HTTP_X_FORWARDED FOR 。
透明代理:不但改动了数据包, 还会告诉服务器客户端的真实IPO 这种代理除了能用缓存技术提高浏览速度, 能用内容过滤提高安全性之外, 并无其他显著作用, 最常见的例子是内网中的硬件防火墙。
间谍代理:指组织或个人创建的用于记录用户传输的数据, 然后进行研究、监控等目的的代理服务器。
	
	
	
代理ip:http://ip:port
在requests模块中如何设置代理?
	1.创建一个代理字典
		proxies = {
			'http':代理ip,
			‘https’:'https://ip:port'
		}
	2.用get或者post方法请求时候,增加proxies这个参数就可以了。
		requests.get(proxies=proxies)

标题1、数据的分类

标题1.结构化数据:

	数据以行为单位,一行数据表示一个实体的信息,每一行的数据的属性是相同的。常见关系型数据库中以表存储的数据就是结构化数据。
2.半结构化数据:
	结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层。因此他也被成为自描述的结构。
常见的半结构化数据有:xml,html,json

3.非结构化数据
	没有固定的结构,常见的非结构化数据有:文档,图片,视屏的。
	对于非结构数据,一般我们通过整体存储他的二进制格式来保存。

标题2.json数据。

JSON是JS对象的字符串表达式,他使用文本形式表示一个JS对象的信息,本质是一个字符串。
js的对象就相当于python中的字典
js的数组就相当于Python中的列表
因为json用来存储js的对象或者数组,所以在Python中我们可以将json转化为list或者dict。

解析json的包json:
	json.dumps(python的list或者dict)---->(返回值)---->json字符串。
	json.loads(json字符串)------>(返回值)----->python的list或者dict.
	
	json.dump(list/dict,fp)--->list,或者字典保存到json文件中。
	json.load(fp)--->list/dict:从json文件中读出json数据。

(一)数据的结构化分类
	一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值。内容一般分为三部分,结构化的数据、半结构化的数据和非机构化数据。
	1.结构化数据:
	可以用统一的结构加以表示的数据。可以使用关系型数据库表示和存储,表现为二维形式的数据,一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行的数据的属性是相同的。
	2.半结构化数据:
	结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层。因此他也被成为自描述的结构。常见的半结构数据有:html,xml和json等、实际上是以树或者图的结构来存储的。
	对于半结构化数据,节点中属性的顺序是不重要的,不同的半结构化数据的属性的个数是不一样的。这样的数据格式,可以自由的表达很多有用的信息,包含自描述信息。所以半结构化数据的扩展性很好,特别适合于在互联网中大规模传播。
	3.非结构化数据
	就是没有固定的结构。各种文档,图片,视频或者音频都属于非结构化数据。
	对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制形式。 
	(二)json数据
	json(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。他基于ECMAScript(w3c制定的JS规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简介和清晰的层次结构使得JSON成为理想的数据交换语言。
		特点:易于阅读、易于机器生成、有效提升网络速度。
	JSON语法规则:在JS语言中,一切都是对象。因此,任何支持的类型都可以通过json来表示。例如字符串、数字,对象,数组。
	Js中对象和数组是比较特殊并且常用的两种类型:
	1.对象表示为键值对{name:’zhangsan’,age:’7’}
	2、数据有逗号分隔[1,2,3,4,5]
	3.花括号保存对象
	4.方括号保存数组。
	json键值对是用来保存js对象的一种方式,和js对象的写法页大同小异,比如:
	{"firstName":"Json","Class":"aid1111"}等价于下面这条js语句:{firstName:"Json",Class:"aid1111"}。
	很多人搞不清楚json和js对象的关系,甚至谁是谁都不清楚。其实可以这么理解:【JSON是JS对象的字符串表达式,他使用文本形式表示一个JS对象的信息,本质是一个字符串。】
	如var obj = {a:"hello",b:"World"}这是一个js对象。注意,键名也是可以用引号包裹的var json = ' {"a":"hello","b":"World"}'这是一个json字符串,本质上是一个字符串。
	JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不想xml那样具有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输的压力大大减低。

标题2.正则表达式

1.元字符
	(1)匹配边界
		^  -----行首
		$  ----- 行尾
	(2)重复次数
		? ----- 0或1
		*  -----  》0
		+  -----  》1
		{n,}-----  》n
		{n,m}----- 》n,《m
		{n} ----- 重复n次
	 (3)各种字符的表示
		[] ---表示单字符
		[abc] ---匹配a、b、c其中的一个。
		[a-z] 
		[0-9a-zA-Z_]
		\d   数字
		\w   数字字母下划线
		\s   空白字符(空格,制表、换行)
		\b   单词的开始和结束
		.    匹配任意字符,除换行符以外。

2、re模块使用的步骤:
(1)pattern =
re.compile(‘正则表达式’)将正则表达式编译成一个pattern对象。
(2)pattern提供一系列的方法,来对文本进行匹配,一般返回一个match对象。
(3)通过使用match对象提供的方法来获取匹配结果。 match对象有以下方法:
match.group(0)----获取匹配结果
match.group()----获取匹配结果
match.span()----获取匹配范围
match.start()—匹配开始位置
match.end()—匹配结束位置
3.pattern对象的方法。 (1)match方法:默认从头开始匹配,只匹配一次,返回一个match对象。 pattern.macth(
‘要匹配的字符串’,必须指定,
start,匹配的开始位置
end,匹配的结束位置。 )---->match对象 (2)serach方法:从任意位置匹配,只匹配一次,返回一个match对象。 pattern.search(
‘要匹配的字符串’,必须指定,
start,匹配的开始位置
end,匹配的结束位置。 )---->match对象

(3)findall:全文匹配,将匹配到的结果放到一个list中返回给我们,多次匹配。 pattern.findall(
‘要匹配的字符串’,必须指定,
start,匹配的开始位置
end,匹配的结束位置。 )---->list
(4)finditer:全文匹配,多次匹配,返回一个包含匹配结果的迭代器。 pattern.finditer(
‘要匹配的字符串’,必须指定,
start,匹配的开始位置
end,匹配的结束位置。 )---->iteror (5)split:切分字符串,按照整个表达式所指定的内容切分。 str.split(’,’)
pattern.split(
‘要切分的字符串’,
切分的次数。不指定就是默认,默认全部切割 )---->list (6)sub:用指定的字符串,替换正则表达式匹配的到目标字符串的内容。
pattern.sub(
repl,替换成什么。
content,替换什么。
count,可以不指定,替换的次数。默认替换所有。
)
repl可以是字符串,也可以是函数。 当repl是函数的时候,这个函数有一下要求:
1,函数必须带一个参数,这个参数是一个match对象。
def func(match):
‘’’
对match对象的操作。
‘’’
print(macth.group())
2.当在sub方法里面传入这个参数时,这个match对象其实就是用正则匹配到的每一个match对象。
3.这个函数是有返回值的,返回值必须是一个字符串,将来是用这个字符串进行替换目标字符串的。

3.正则表达式中的分组。
分组时通过()来表示的,一个括号就表示一个分组。

	分组的作用:
	(1)筛选特定内容。
		取分组内容可以通过match对象的group方法来去。
		group(1)表示取正则表达式中第一个括号的内容,依次类推。
		import re

		content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}'
		pattern = re.compile(r'{name:"(\w+)",age:"(\d+)".+')
		match = pattern.search(content)
		print(match.group(1))#zhangsan
		print(match.group(2))#10
	(2)可以在同一个表达式的后面引用前面的分组表达式。
		 s = "<html><h1>正则表达式</h1></html>"
		
		import re

		s = "<html><h1>正则表达式</h1></html>"
		pattern = re.compile(r'<(html)><(h1)>(.*)</\2></\1>')
		match = pattern.search(s)
		print(match.group(3)))#正则表达式
		
4.正则表达式的模式
	pattern = re.compile(
		'正则表达式',
		‘正则表达式的模式’
	)
	正则表达式的模式有以下几种:
		re.I	使匹配对大小写不敏感
		re.M	多行匹配,影响 ^ 和 $
		re.S	使 . 匹配包括换行在内的所有字符
5.贪婪和非贪婪模式。	
		(1)贪婪是用*控制的
		(2)非贪婪是用?来控制。
		(3)*和?都是作用表示重复次数的元字符的。
		(4)正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪。
		(5)在表示重复的元字符后面加一个?,此时就是非贪婪,取这个重复元字符的最小值。
6.通用匹配正则表达式
	.*? 配合re.S
	import re

	content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}'
	pattern = re.compile(r'.*?"(.*?)".*?"(.*?)".*?')
	match = pattern.search(content)
	print(match)
	print(match.group(1))
	print(match.group(2))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值