爬虫应用场景

搜索引擎,它无时无刻不在爬虫,用于供给用户关键字更多的选择
推荐引擎,爬取大量数据来实现个性化推荐
机器学习的数据样本,可以爬取相关数据来训练模型
数据分析,数据分析本身需要大量数据才能有效分析

正则表达式

css实际上最细只能细化到一个标签中的内容,但是正则表达式可以取到我们想要的字符,过滤掉不需要的字符,可操作性更高了。

re包

match(匹配对象,正则表达式) 返回boolean,匹配成功true,匹配失败false
group 匹配正则表达式中的圆括号,从外往里面匹配
例如 a(bc):group(0)对应abc,group(1)对应bc

特殊字符

^ $ * ? + {2} {2,} {2,5} |
[]``[^] [a-z]
\s \S \w \W
[\u4E00-\u9FA5] () \d

^ 字符

以什么字符开头
ps:只能匹配整个字符串的第一个字符为首

  1. ^b指定以b开头
  2. .代表一个字符
  3. .*代表任意多个字符
  4. regex = "^b.*"
  1. line = "bobby123"
  2. regex = "^b.*"
  3. if re.match(regex,line):
  4. print(true)

$ 字符

以什么字符结尾
ps:中文可能会不识别

  1. .*3$ 任意多字符开头,以3结尾

?字符

用于实现非贪婪
贪婪
什么是贪婪?下面案例就是所谓的贪婪匹配模式,一个正则表达式它会从右往左开始匹配,从右往左读正则表达式可以发现输出的就是bb。简单一句话,从右往左匹配正则表达式就是贪婪的。

  1. import re
  2. line = "boooobby123"
  3. regex = ".*(b.*b).*"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(1))
  6. 输出 bb

非贪婪
非贪婪就是让它从正则表达式的左边往右边读取,怎么做,在原先贪婪的基础上加上两个问号,如果不加后一个问号,它就会采取最贪婪的方式,匹配到boooobb,一直到最后一个b,所以我们需要在不需要贪婪的字符前加一个问号,让它别“太贪“

  1. import re
  2. line = "boooobby123"
  3. regex = ".*?(b.*b).*"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(1))

+字符

+字符和字符做一个区别理解,+号是规定至少出现一次,是任意次数

  1. import re
  2. line = "boooobbby123"
  3. regex = ".*(b.+b).*"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(1))
  6. 输出 bbb

{ }字符

*号是匹配所有,{ }花括号则是可以允许定制,显示一个字符或者几个字符。记一下该字符是写在目标字符的后面

  1. import re
  2. line = "boooobbby123"
  3. regex = ".*(b.{1}b).*"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(1))
  6. 输出 bbb

{2}字符

出现两次以上,对匹配模型切片

{2,5}字符

匹配大于等于,小于等于。闭区间

|字符

或的作用,这里面是有优先级关系的,比如下面这个案例,两者都符合的情况下,左边的比右边的优先级高

  1. import re
  2. line = "bobby123"
  3. regex = "bobby123|bobby"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(0))
  6. 输出 bobby123

[ ] 字符

正则表达式会匹配中括号里面的字符,以中括号中间的任意字符开头,

  1. import re
  2. line = "bobby123"
  3. regex = "[b,c,d,e]obby123"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(0))
  6. 输出 bobby123

[^] 字符

[^1] 匹配不等于1的字符串

[0-9] 字符

匹配0-9的字符串
多拼接语法格式 [A-Za-z0-9] 可以发现并没有用逗号隔开等等,而是直接拼接

\s字符

匹配空格。只匹配单空格

  1. import re
  2. line = "你 好"
  3. regex = "你\s好"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(0))
  6. 输出:你

\S字符

匹配除了空格之外的。只匹配单字符

  1. import re
  2. line = "你们好"
  3. regex = "你\s好"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(0))
  6. 输出:你

\w字符

字母+下划线+数字

\W字符

非(字母/下划线/数字)

[\u4E00-\u9FA5]字符

匹配所有中文字符

  1. import re
  2. line = "study in 南京大学"
  3. regex = ".*?([\u4E00-\u9FA5]+大学)"
  4. match_obj = re.match(regex,line)
  5. print(match_obj.group(1))

\d字符

数字类型

综合案例

需要注意:-这个字符很敏感,尽量放在头尾不要放在中间,可能会报错

  1. import re
  2. line = "XXX出生于2001/6/1"
  3. # line = "XXX出生于2001-6-1"
  4. # line = "XXX出生于2001年06月01日"
  5. # line = "XXX出生于2001-06"
  6. regex = ".*出生于(\d{4}[-/年]\d{1,2}([-月/]\d{1,2}|[-月/]$|$))"
  7. match_obj = re.match(regex,line)
  8. print(match_obj.group(1))

不妨多几个空格拆分以下看看结构,注意拆分只能用于看清正则结构,并不能被编译器编译。尤其是后面的“或结构“模型可以重点看看

  1. regex = ".*出生于(\d{4}[-/年]\d{1,2} ([-月/]\d{1,2} | [-月/]$ | $))"