zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    valgrind的使用
    php开启gzip压缩
    scrapy
    今天几个bug的排查过程
    awk使用多个分割符
    有用的url
    图片延迟加载
    用中间表提高互联网程序的开发效率
    百度技术沙龙
    vs2005/.NET2.0 控件演示之 文件上传 《FileUpload》
  • 原文地址:https://www.cnblogs.com/renshaoqi/p/10420670.html
Copyright © 2011-2022 走看看