python爬虫基础(3)爬虫进阶知识

本文深入探讨Python爬虫中的Cookie和Session概念及其原理,包括它们的产生原因、工作方式及优缺点。此外,文章还介绍了数据的分类,如结构化、半结构化和非结构化数据,以及JSON数据的相关知识。重点讲解了正则表达式的元字符、re模块的使用方法,如match、search、findall等方法,以及正则表达式的高级特性,如分组、贪婪与非贪婪模式等。
摘要由CSDN通过智能技术生成

一、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的缺陷:

①、不安全
②、cookie本身最大支持4096(4kb)----存储大小受限制

5、session的工作原理

正是因为cookie的缺陷,所以产生了另一种会话机制 ----- session
服务器存储session,基于http协议的无状态特征,
服务器就不知道这个访问的是谁,为了解决这个问题,
cookie就起到了桥的作用。cookie在使用的时候,
将一个叫做sessionid的字段放到cookie中,
将来服务器可以通过这个id字段来查找到地上的那个用户的session。

session的生命周期:

当用户第一次登录时创建(session开始),到session有效期结束(30min)。

6、当我们浏览器关闭,session是否就失效了

不失效,原因,session失效是由生命周期决定的。

7.cookie组成:

name:cookie名称,一旦创建,不可更改。
value:cookie的值。
domain:是cookie可以访问网站域名。
maxage:cookie的失效时间,负数代表永不失效。
path:cookie使用路径
http字段:cookie的httponly,若此属性为true,则只有http头中会带有cookie
secrue:该cookie是否仅被使用安全传输协议
size:cookie的大小

8、会话cookie和持久cookie。

持久化:将内存中的数据存储到硬盘(文件中,数据库)上的过程。
序列化:将对象保存到硬盘上。

会话cookie:保存在内存中的cookie,浏览器关闭,cookie失效。
持久cookie:保存在硬盘上的cookie,浏览器关闭,cookie不失效。

9、用requests实现登录:

(1)

第三讲、正则表达式

一、数据的分类

1、结构化数据

特点:数据以行为单位,每一个数据表示一个实体,每一行数据的属性都是一样的。
举例:关系型数据库中的表就是结构化数据
处理方法:SQL

2、半结构化数据

特点、结构化数据的另一种形式,他并不符合关系型数据的特点,不能用关系型模型来描述,
但是这种数据包含相关标记,有用来分割语义元素及字段进行分层的描述,
因此也被称为自描述结构
举例:xml,html,json
处理方法:正则,xpath,jsonpath,css选择器。

3、非结构化数据

特点:没有固定结构的数据,
举例:文档、图片、音频、视频,
处理方法:常常用二进制形式来做整体保存。

二、json数据

1、json是什么语言的内容

json是js语言中用来用【字符串格式】来保存对象和数组的一种数据结构。

2、js中的数组和对象:

js的数组:var array = [‘aaa’,‘bb’,‘vv’]--------和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)匹配边界:
  ^-----------行首
  $-----------行尾
 (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模块的使用步骤:

#导包
import re
#将正则表达式编译成一个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,匹配开始的位置—缺省,end = -1
  end,匹配结束的位置–缺省,end = -1
)—>match对象

3、findall方法:全文匹配,匹配多次,将每次匹配到的结果放到list中返回。
pattern.findall(
		&emsp;&emsp;'匹配的目标字符串',
		&emsp;&emsp;start,匹配开始的位置--缺省,start = 0
		&emsp;&emsp;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,)

3、分组

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

content = ‘

正则表达式


p = re.compile(r’<(html)><(h1)>(.*)</\2></\1>’)
# print(p.search(content).group())
print(p.findall(content))#[(‘html’, ‘h1’, ‘正则表达式’)]

4、贪婪非贪婪模式

(1)贪婪和非贪婪的却别在于匹配内容的多少。
(2)贪婪使用*来控制匹配次数的。正则默认是贪婪。
(3)非贪婪使用?来控制的。
(4)在表示数量控制元字符后面加一个?,此时就表示这个数量控制符取最小值,也就是非贪婪。

5.匹配模式:

re.S ----.可以匹配换行符
re.I----忽略大小写。

6、万能正则匹配表达式:.*?(尽可能少匹配任意内容)配合re.S

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值