python爬虫工程师 成长之路三 正则表达式与Cooki
文章目录
正则表达式介绍
正则表达式就是描述字符串排列的一种规则,其主要用于字符串的匹配,经常用于找到某一类符合格式要求的数据;在python中我们经常用re模块来实现正则表达式
正则表达式基础
原子
原子是正则表达式最基本的组成单位,正则表达式至少包含一个一个原子,常见的原子有:
- 普通字符
- 非打印字符
- 通用字符
- 原子表
普通字符
普通字符如数字,字母,下划线等都可以作为原子,yes中含有三个原子:y、e、s
hello中含有he,所以匹配成功
非打印字符
非打印字符指的是字符串中用于格式控制的符号常见的有\n换行符,\t制表符
a中有换行,所以匹配成功
通用字符
通用字符:一个原子可以匹配一类字符,人们常用的
常见的通用字符及其意义
字符 | 意义 |
---|---|
\w | 匹配任意一个字母、数字或下划线 |
\W | 匹配除字母、数字和下划线以外的任意一个字符 |
\d | 匹配任意一个十进制数 |
\D | 匹配除十进制数以外的任意一个字符 |
\s | 匹配任意一个空白字符 |
\S | 匹配除空白字符以外的任意一个字符 |
匹配a中含有wpython的部分
原子表
原子表用[]表示,使用原子表可以定义一组地位平等的原子,匹配的时候取原子表中任意一个原子进行匹配,如[abc]str可以匹配字符串‘astr’,‘bstr’,‘cstr’;[^]代表除原子表里的均可以匹配,如 [^abc]str可以匹配[d-z]str,不能匹配
‘astr’,‘bstr’,‘cstr’
元字符
元字符:正则表达式中具有特殊含义的字符;元字符分为任意匹配字符,边界限制元字符,界定符,模式选择符,模式单元等
任意匹配字符
任意匹配字符‘.’,可用于匹配一个除换行符以外的任意字符
边界限制元字符
- 用‘^‘匹配字符串的开始, ‘^abc‘表示可以匹配以abc开头的字符串,其余均不匹配
- 用’$‘匹配字符串的结束,‘$abc‘表示可以匹配以abc结尾的字符串,其余均不匹配
限定符
常见限定符及其含义
限定符 | 含义 |
---|---|
* | 匹配0次、1次或多次前面的原子 |
? | 匹配0次、1次前面的原子 |
+ | 匹配1次或多次前面的原子 |
{n} | 前面的原子恰好出现n次 |
{n,} | 前面的原子至少出现n次 |
{n,m} | 前面的原子至少出现n次,至多出现m次 |
| | 模式选择符 |
() | 模式单元符 |
-
*实例
匹配任意次,可以是0次 -
?实例
匹配0次或1次表示可以匹配不到 -
+实例
匹配一次或多次,不能是0次 -
{n}实例
{n}匹配前面原子恰好出现n次,其余不匹配 -
{n,}实例
{n,}匹配前面原子出现次数大于等于n,小于n的无法匹配 -
{n,m}实例
匹配前面原子出现次数在[n,m]之间
模式选择符
模式选择符’|'可以设置多个匹配模式,匹配时满足任意一个都可以
模式单元符
模式单元符‘()’,可以用()将原子组合成一个整体用于匹配,如(aa)表示把aa当做一个整体进行匹配,此时字符a是无法匹配的
模式修正
在不修改正则表达式前提下,模式修正可以修正正则表达式的含义,从而调整匹配结果。
常见模式修正符及其含义
修正符 | 含义 |
---|---|
I | 匹配时忽略大小写 |
X | 匹配时忽略模式中的空白 |
S | 将字符串看作单行,换行符看做普通字符 |
- I 实例
加I之后忽略字母的大小写 - X 实例
加x后忽略pattern中的空白 - S 实例
加S后可以匹配换行符\n
贪婪模式、懒惰模式
贪婪模式就是尽可能多的匹配,懒惰模式就是尽可能少的匹配。
常见的贪婪模式 .* 匹配任意多个任意字符,非贪婪就在贪婪模式中的*或+后面加?即可。
可以发现贪婪模式尽可能多的匹配结果,非贪婪模式则匹配到第一个结果后就直接返回结果
常用函数
re.match()
用于从源字符串的起始位置匹配一个模式,如果匹配成功则返回匹配的结果,否则返回None,匹配成功后可以使用.span()返回在源字符串中的位置
re.match(pattern,string,flag)
- pattern:匹配的表达式
- string:源字符串
- flag:标志位,可以填写模式修正符
该方法的局限性是只能从起始位置开始匹配
re.search()
用于匹配源字符串是否含有与模式相同的子串,如果匹配成功则返回匹配的结果,否则返回None,匹配成功后可以使用.span()返回在源字符串中的位置
re.search(pattern,string,flag)
- pattern:匹配的表达式
- string:源字符串
- flag:标志位,可以填写模式修正符
该方法可以匹配整个字符串,但只会返回第一次出现的位置
全局匹配函数
re.complie()对正则表达式进行预编译,完成后使用findall()找出所有匹配结果
re.sub()
根据正则表达式来实现替换某些字符串
re.sub(pattern,rep,string,max)
- pattern:正则表达式
- rep:替换后留下的字符串
- string:用于被替换的字符串
- max:最多替换的次数,不填就会全部替换
Cookie介绍
通常来说,我们都是通过HTTP协议访问网页的,HTTP协议一种无状态协议(不能维持会话间的状态);
在HTTP协议中我们登录一个网站后又退出了该网站,就需要重新登录,为了解决该问题引入了cookie和session。
- cookie将所有的会话信息保存在客户端,当我们登录后重新访问同一个网页时会从cookie中读取会话信息来判断会话状态,如是否已经登录
- seesion将所有会话信息存在服务器段,服务器端会给客户端发sessionID等信息,这些信息一般存在cookie中,需要用都的时候从cookie中读取
cookie处理——cookiejar
cookie处理思路:
- 导入cookie处理模块http.cookiejar
- 使用http.cookiejar.CookieJar()创建CookieJar对象
- 使用HTTPCookieProcesscer创建cookie处理器,并将其作为参构建opener对象
- 创建全局默认opener对象
创建好之后打开本地文件中的网页就会登录成功,不会像之前爬取下来的页面没有登录(太复杂了就不累述了)