Python--爬虫--re(正则表达式)入门

目录

一、正则表达式概念

二、正则表达式函数

三、实操

四、总结


一、正则表达式概念

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、反爬如何绕过?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值