目录
一、正则表达式概念
1.1、什么是正则表达式?
正则表达式是用来匹配与查找字符串的一个规则;爬虫爬取数据的过程中,需要匹配目标网
站的源代码等,这就需要正则表达式来进行匹配字符串,进而进行爬取。
1.2、基本的正则表达式
/w:匹配字符串(一次)
/b:匹配字符串结尾(一次)
[]:匹配括号中的全部字符,按顺序进行匹配
.:匹配除换行符外的全部字符(一次)
/d:匹配0-9的数字(一次)
+:使前面的匹配字符至少匹配一次或多次
.*:懒惰匹配,匹配最少的可能性
.*?:贪婪匹配,匹配最多的可能性(最常用)
还有一些其它的匹配规则,不常用
二、正则表达式函数
2.0、re.findall(pattern, string, flags=0
):
pattern:匹配的正则表达式,string:要匹配的字符串,flag:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。
使用:获取字符串中所有匹配的字符串,并以列表的形式返回。
2.1、re.finditer(pattern, string, flags=0
):
pattern:匹配的正则表达式,string:要匹配的字符串,flag:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。
使用:匹配字符串中所有满足的字串,返回的是一个迭代器。
返回的迭代器可以使用for循环进行遍历,使用print(遍历变量.group("标志名"))函数进行输出。
2.2 、re.match(pattern,string,flags=0):
pattern:匹配的正则表达式,string:要匹配的字符串,flag:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。;从字符串的开头开始匹配一个模式,如果匹配成功,返回一个匹配成功的对象,否则返回None.
使用:从源字符串的起始位置匹配。
2.3、re.search(pattern, string, flags=0)
:
pattern:匹配的正则表达式,string:要匹配的字符串,flag:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。
使用:在全文中进行检索并匹配,只要全文中有符合正则表达式的,就可以匹配成功。
2.4、re.compile(r"匹配的正则表达式"):
预加载函数,是用来预加载一个正则表达式的,方便我们提前匹配一些重合的正则表达式部分,可以让代码更美观更有逻辑性。
使用:obj = re.compile(r"匹配的正则表达式") ->obj.refinditer(pattern, string, flags=0
)等函数。
三、实操
3.0、导入模块;
import requests # 发起请求的库
import re # 正则表达式的库
3.1、有目标url,与获取的内容要求;
url = "https://movie.douban.com/top250"
比如要获取电影名称;
3.2、准备好反爬措施(简单的);
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}
3.3、发送请求,返回源码,分析源码;
resp = requests.get(url, headers=headers)
pape_content = resp.text
需要获取电影名称,匹配的正则表达式如下:
obj = re.compile(r'<li>.*?<div class="item">.*?<img width="100" alt="(?P<name>.*?)" src=', re.S)
正则表达式分析:
re.S规则是使.号可以匹配换行符。从标签<li>到第一个<div>标签有很多空白的部分(可能是换行符也可能是空白字符),直接使用贪婪匹配全部拿下(.*?是贪婪匹配),<div class="item">到<img width="100" alt="都是我们不需要的,直接贪婪匹配全部拿下,到了需要获取的部分(电影名称)->(?P<自定义标签名,写啥都行>.*?),到" src=' 匹配结束。
3.4、正则表达式匹配源码;
obj = re.compile(r'<li>.*?<div class="item">.*?<img width="100" alt="(?P<name>.*?)" src=', re.S)
3.5、遍历输出匹配结果或者保存进文件或者数据库等;
result = obj.finditer(pape_content)
for x in result:
print(x.group("name"))
3.6、结果现象;
如下图3.6:
图6.1
3.7、源代码。
import requests # 发起请求的库
import re # 正则表达式的库
url = "https://movie.douban.com/top250"
# headers需要替换成自己访问时的,否则会失效
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}
resp = requests.get(url, headers=headers)
pape_content = resp.text
# print(resp.text)
obj = re.compile(r'<li>.*?<div class="item">.*?<img width="100" alt="(?P<name>.*?)" src=', re.S)
result = obj.finditer(pape_content)
# 遍历输出
for x in result:
print(x.group("name"))
获取其它内容,也可以按照以上的模式进行继续提取即可。
四、总结
4.1、正则表达式如何优化?
4.2、代码的模块化?
4.3、如何把爬取到的内容很好保存?
4.4、需要验证的网页如何爬取?
4.5、反爬如何绕过?