Cookie,Session,正则表达式

一、Cookie和Session基础知识

  Cookie:客户端本地存储的键值对

  Http访问是不记录状态的,所以要借助sessioncookie来保存访问状态

 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你。 Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 email 网站,都要用到 Cookie。

   具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保

持状态的方案

cookie 和session 的区别:

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。

  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,

      考 虑到安全应当使用session。

  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性 能,

    考虑到减轻服务器性能方面,应当使用COOKIE。

  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个 cookie。

  5. 个人建议:将登陆信息等重要信息存放为SESSION。

        其他信息如果需要保留,可以放在COOKIE中

session的生命周期

Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

 Session什么时候失效?

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。

    Tomcat中Session的默认失效时间为20分钟

  2.调用Session的invalidate方法。

对象及方法 

1) 以键值对的格式写session。

  request.session['键']=值

2) 根据键读取值。

  request.session.get('键', 默认值)

3)清除所有session,在存储中删除值部分。

  request.session.clear()

4)清除session数据,在存储中删除session的整条数据。

  request.session.flush()

5)删除session中的指定键及值,在存储中只删除某个键及对应的值。

  del request.session['键']

6)设置会话的超时时间,如果没有指定过期时间则两个星期后过期。

  request.session.set_expiry(value)

    如果value是一个整数,会话的session_id cookie 将在value秒没有活动后过期。

    如果value为0,那么用户会话的session_id cookie 将在用户的浏览器关闭时过期。

    如果value为None,那么会话的session_id cookie 两周之后过期。

二、正则表达式

爬虫一共就四个主要步骤:

  1. 明确目标 (要知道你准备在哪个范围或者网站去搜索)

  2.  (将所有的网站的内容全部爬下来)

  3.  (去掉对我们没用处的数据),运用正则表达式

  4. 处理数据(按照我们想要的方式存储和使用)

什么是正则表达式?

  正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。

  正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些

特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑

正则表达式是由普通字符特殊字符(元字符)组成的文章模式

常见的元字符:

  前面提到的元字符表示匹配单词的开始和结束。引出其他元字符

常见元字符
源字符 含义
.

匹配除换行符以外的任意一个字符

^

匹配行首

$

匹配行尾

重复匹配0次或1次

*

重复匹配0次或更多次

+

重复匹配1次或更多次

{n,}

重复n次或更多次

{n,m}

重复n~m次

[a-z]

任意字符

[abc]

a/b/c中的任意一个字符

{n}

重复n次



匹配单词的开始和结束

d

匹配数字

w

匹配字母,数字,下划线

s

匹配任意空白,包括空格,制表符(Tab),换行符

W

匹配任意不是字母,数字,下划线的字符

S

匹配任意不是空白符的字符

D

匹配任意非数字的字符

B

匹配不是单词开始和结束的位置

[^a]

匹配除了a以外的任意字符

[^(123|abc)]

匹配除了123或者abc这几个字符以外的任意字符


1、re模块

import re    

# 在前面加上一个r, 可以避免字符转义,输出原字符
str1 = r'c:ac'

print(str1)

# \表示输出特殊字符的原字符
str2 = 'c:\a\b\c'

print(str2)

str3 = r'c:\a\bc'

print(str3)
View Code

2、compile函数:compile 函数用于编译正则表达式,生成一个 Pattern 对象

import re

# 查找连续的数字

pattern = re.compile(r'd+')
str1 = pattern.findall('hello 12345 678')

print(str1)
# >>>['12345', '678']

# 后面的参数是规定文本范围

str2 = pattern.findall('one1two2three3', 0, 8)

print(str2)
# >>>['1', '2']
View Code

3、findall方法:全部匹配,返回列表

  格式:findall(string[,pos[,endpos]])

     其中,string 是待匹配的字符串,pos endpos 是可选参数,指定字符串的起始和终

     点位置,默认值分别是 0 len (字符串长度)

import re

# 测试小例子 compile把正则表达式字符串编译成pattern(变量)对象
# 正则表达式中有转义字符串需要添加前缀r

pattern = re.compile(r'we')

# 使用pattern对象查找文本中的数据
# findall表示全局查找匹配 返回列表

str1 = pattern.findall('we are work well')

print(str1)

>>>[''we]
View Code

4、match方法:从起始位置开始查找,一次匹配

  格式:match(string[,pos[,endpos]]) 

    其中,string 是待匹配的字符串,pos endpos 是可选参数,指定字符串的起始和终点

    位置,默认值分别是 0 len (字符串长度)。因此,当你不指定 pos endpos 时,

    match 方法默认匹配字符串的头部。

    当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None

import re

pattern = re.compile(r'd+')

# 因为match是从开始匹配,如果开始匹配不到则返回None

str1 = pattern.match('one1two2')

print(str1)
# >>>None

str2 = pattern.match('one13579two2', 2, 10)

print(str2)
# >>>None

str3 = pattern.match('one13579two2', 3, 10)

print(type(str3), str3)
# >>><class '_sre.SRE_Match'> <_sre.SRE_Match object; span=(3, 8), match='13579'>

# 将match匹配到的内容 使用group从中拿出来

print(str3.group())
# >>>13579
# 获取字符串的开始位置、结束位置
print(str3.start())    # >>>3
print(str3.end())    #>>>8
print(str3.span())    #>>>(3, 8)
View Code

5、search方法:从任何位置开始查找,一次匹配

  格式:search(string[,pos[,endpos]])

    其中,string 是待匹配的字符串,pos endpos 是可选参数,指定字符串的起始和终点

    位置,默认值分别是 0 len (字符串长度)

    当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None

import re

pattern = re.compile(r'd+')
str1 = pattern.search('one1two2three34four')

print(str1,type(str1))
# >>><_sre.SRE_Match object; span=(3, 4), match='1'> <class '_sre.SRE_Match'>
print(str1.group())
# >>>1

str2 = pattern.search('one12twothree34four', 10, 30)

print(str2, type(str2))
# >>><_sre.SRE_Match object; span=(13, 15), match='34'> <class '_sre.SRE_Match'>
print(str2.group())
# >>>34
View Code

6、finditer方法:全部匹配,返回迭代器

  finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。

  但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。

import re

pattern = re.compile(r'd+')

# 使用finditer进行查找 返回的是迭代器

result_iter = pattern.finditer('hello 123456 789')

print(result_iter, type(result_iter))
# >>><callable_iterator object at 0x0000017C5FC781D0> <class 'callable_iterator'>

# 使用遍历拿出获取到的迭代器数据

for ml in result_iter:
    print(ml.group())
View Code

7、split方法:分割字符串,返回列表

  格式:split(string[,maxsplit])

    split 方法按照能够匹配的子串将字符串分割后返回列表,其中,maxsplit 用于指定最大

    分割次数,不指定将全部分割。

import re

pattern = re.compile(r'[s\,;]+')

# 将字符串文本按指定的字符进行分割 返回列表

str1 = pattern.split('a,b;;c  d')

print(str1)
# >>>['a', 'b', 'c', 'd']
View Code

8、sub方法:替换

import re

pattern = re.compile(r'(w+) (w+)')

# 声明需要替换的字符串

str1 = 'hello 123, hello 456'

# 匹配并且替换匹配到的字符

str2 = pattern.sub('hello world', str1)

print(str2)
# >>>hello world, hello world
View Code

9、[u4e00-u9fa5]:匹配中文

  在某些情况下,我们想匹配文本中的汉字,有一点需要注意的是,中文的 unicode 编码范围

  主要在 [u4e00-u9fa5]这里说主要是因为这个范围并不完整,比如没有包括全角(中文)

  标点,不过,在大部分情况下,应该是够用的。

# 匹配中文

pattern = re.compile(r'[u4e00-u9fa5]+')

# str1 = pattern.findall(str1)

# print(str1)
# >>>['世界', '你好']

str2 = pattern.finditer(str1)

for i in str2:
    print(i.group())
View Code
原文地址:https://www.cnblogs.com/renshaoqi/p/10420670.html