面向零基础小白的爬虫系列(六):正则表达式


“爱”的宣言:本系列的目的是帮助一些零基础小白能够快速上手爬虫。因为作者本人也是一个刚入门不久的零基础小白,深知自学(乱学 )的痛苦。本系列的知识可能不会像一些大佬的文章那般系统,但仍希望能帮助到一些小伙伴,同时,也希望能结识一些小伙伴。


本系列可能会有多篇,为了方便您的阅读,下面给出各文章之间的超链接传送门。

系列文章链接(未完待续):
PyCharm自定义背景图片、更换主题
面向零基础小白的爬虫系列(一):字符串
面向零基础小白的爬虫系列(二):列表与元组
面向零基础小白的爬虫系列(三):字典
面向零基础小白的爬虫系列(四):库
面向零基础小白的爬虫系列(五):循环语句与条件语句
面向零基础小白的爬虫系列(七):Beautiful Soup(美丽的汤)


一、前言

众所周知,爬虫的基本思路为:

①发送请求
②获取响应
③解析响应、定位并提取目标数据
④保存数据

我在刚开始学的时候,第三步是花费时间最多的地方。学习了一段时间,学了四种方法,分别是正则表达式、Beautiful Soup 、Xpath和PyQuery。接下来这几篇文章(包括这篇但不限于这篇文章),我会来逐步来分享我对这几种方法的理解。

在渐渐熟练这四种方法之后,我个人的习惯是优先考虑Beautiful Soup 、Xpath,Xpath为第一考虑对象,我感觉它是最方便的,嘿嘿嘿。

那么今天就先来看看,正则表达式。

本系列文章,代码运行展示,将使用PyCharn进行运行。

扫描二维码关注公众号,回复: 13122615 查看本文章

二、正则表达式

先给大家安利一篇文章吧,《Python正则表达式,这一篇就够了!》
这篇文章也是我在初学正则表达式时,比较受益的一篇文章。
如果是第一天学习的小白,可能看起来会有点摸不着头脑,那么我在这里就带你看一下简化版,并且用一个小实例,带你快速上手。

1、正则表达式常见符号及其作用

'.' 还是比较厉害的,可以匹配除了换行符以外的任何一个字符,如,中文、英文、数字、标点符号等等。

怎么理解替代作用呢?

如:

text = '输出python字符'

这里的python就可以使用6个点替代,即'输出......字符'

同理,英文、数字、标点符号等等也是这般实现替代的

看到这里,你可能会想,这样的目的是啥呀,有啥用啊。刚开始学可能就会这样想,我也这样想过。因为这是例子,是为了方便我们理解,如果是一个爬虫项目呢,解析出来的网页,那里的数据,可不是自己一点一点输入就能解决的。


星号‘*’ 也是很了不得的呢,它可以表示它前面的一个子表达式0次到无数次。

如:

text = '你真的好帅帅帅帅帅'

这里有五个帅字,那如果使用‘*’来表示呢?

'你真的好帅*'

即使后面还有一百个帅字,可能形容你的程度都还不够,依然可以只使用*就可以表示啦。


如果把上面的'.''*'组合在一起,会发生什么呢?

magic!

'.'可以替换几乎任意的字符'*' 可以表示前面那个子表达式0到无数次,那么我们可不可以认为'.*'能够表达几乎任意长度的任意字符呢?我感觉是可以的!
如:

text = '你真的好nm"handsome"1+1=2帅'

这个够离谱了吧
但它就可以简单表示为:

'你真的好.*帅'

'?'的作用与‘*’的作用相似,但是它只能表示它前面那个子表达式0次或1次。

如:

text_1 = '你好帅帅呀'
text_2 = '你好帅帅帅呀'
'你好帅?呀'

这时候能和text-1成功匹配,也就是说,能够表示text_1,而不能匹配text_2,这也就是‘?’‘*’的小区别。

这时候看,是不是感觉'?'比较菜呀,感觉活都要被抢了,实则不然,它与‘*’各有千秋。


贪婪匹配('.*'):贪婪,顾名思义,它会尽可能多的匹配满足条件的内容
非贪婪匹配('.*?'):与贪婪相反,它会可能少的匹配满足条件的内容

下面看一下例子(如果函数或者一些字符看不懂,没事的,主要看贪婪与非贪婪的区别)

import re
text = '你好 521 帅呀'
res_1 = re.match('你好.*(\d+).*帅呀', text)
res_2 = re.match('你好.*?(\d+).*帅呀', text)
print('这是贪婪模式的结果:', res_1.group(1))
print('这是非贪婪模式的结果:', res_2.group(1))

输出:

这是贪婪模式: 1
这是非贪婪模式: 521

注意:正则表达式,内容两端有''

2、re模块中的findall函数

re模块是python的标准库,不需要额外进行安装。
findall函数的作用是把符合条件的数据全部匹配,返回列表,注意嗷,返回的是一个列表嗷,既然是列表,那么批量获取,最简单暴力的方法就是进行遍历。

findall函数的结构:re.findall(pattern,string,flags=0)
pattern表示正则表达式string表示需要进行匹配的字符串,flags表示正则表达式的修饰符。
常见的修饰词:

修饰符 作用
re.I 使匹配对大小写不敏感
re.S 使 . 匹配包括换行在内的所有字符

3、实战对抗

开始之前,需要导入一个第三方库requests
打开cmd,输入 pip install requests

实战对抗
首先,打开需要进行爬取的目标网页:4k汽车壁纸
接着,导入需要用到的库

import requests
import re

然后进行爬虫第一步,发送请求

url = 'https://pic.netbian.com/4kqiche/'
response = requests.get(url=url)
print(response)

在这里插入图片描述
响应为200,说明允许访问。
接着进行爬虫第二步:获取响应
在这里插入图片描述
得到的这个是啥呀,好多啊。
在这里插入图片描述
其实就是这个页面的源代码。
这样我们就可以顺利地进行爬虫第三步:定位并提取数据
我们今天用正则表达式来解决它。
在这里插入图片描述
我发现这些链接就是汽车图片对应的链接。那么就是要提取这些链接。
那我就从节点开始动手,先把这些链接所在的节点提取出来。

在这里插入图片描述
右击检查,即可发现一个链接,顺着节点写就好啦。
在这里插入图片描述

构造正则表达式

'<div.*?<div.*?<div.*?<u1.*?<li.*?<a.*?<img.*?src="(/up.*?jpg)"'

进行验证

import requests
import re

url = 'https://pic.netbian.com/4kqiche/'
response = requests.get(url=url)
text= response.text
images = re.findall('<div.*?<div.*?<div.*?<ul.*?<li.*?<a.*?<img.*?src="(/up.*?jpg)"', text, re.S)
#  进行遍历
for image in images:
    print(image)

在这里插入图片描述
只有一个结果,为啥呀,因为我门定位的太准确,精确定位到这一个,如果需要获取很多,就要对正则表达式进行修改。

'<li.*?<a.*?<img.*?src="(/up.*?jpg)"'

把li节点之前的去掉就好了,再来看一下结果
在这里插入图片描述
全部拿到了。

爬虫第四步:保存结果 ,可以看我的第一个爬虫项目呀,也是这个页面,更有详细教你怎么爬取高清图和多页爬取,当然,使用的也是正则表达式哟。

文章链接:《正则表达式–简单爬虫实例–美女图片篇》

三、Blogger’s speech

如有不足,还请大佬评论区留言或私信我,我会进行补充。

感谢您的支持,希望可以点赞,关注,收藏,一键三连哟。

作者:远方的星
CSDN:https://blog.csdn.net/qq_44921056
腾讯云:https://cloud.tencent.com/developer/column/91164
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。

猜你喜欢

转载自blog.csdn.net/qq_44921056/article/details/115065217