Python爬虫中,正则表达式(Regular Expression)是一种强大的文本处理工具,它能用于匹配、查找、替换等操作。在Python中,我们通常使用`re`模块来处理正则表达式。本篇文章将深入探讨如何在Python爬虫中利用正则表达式解析网页数据。
了解几个常用的`re`模块中的标志位(Flag):
1. `re.I`:忽略大小写匹配。例如,使用`^i.*`可以匹配以'i'开头的任何单词,无论其是否大写。
2. `re.M`:多行匹配。这个标志使得`^`和`$`能够分别匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。
3. `re.S`:单行匹配。它使`.`匹配任何字符,包括换行符,这样整个字符串会被视为单行处理。
以下是一个示例,展示了如何使用这些标志位:
```python
string = '''fall in love with you
i love you very much
i love she
i love her'''
re.findall('^i.*', string, re.M)
```
这将返回以'i'开头的所有行。
再看另一个例子,使用`re.S`标志:
```python
string1 = """细思极恐
你的队友在看书
你的敌人在磨刀
你的闺蜜在减肥
隔壁老王在练腰"""
re.findall('.*', string1, re.S)
```
这会匹配并返回整个字符串,包括换行符。
接下来,我们将讨论如何使用正则表达式在Python爬虫中抓取网页中的图片。以下是一个爬取糗事百科中所有图片的例子:
```python
import requests
import re
import urllib
import os
url = 'https://www.qiushibaike.com/pic/page/%d/?s=5170552'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
# 创建名为qiutu的文件夹来存储图片
if not os.path.exists('./qiutu'):
os.mkdir('./qiutu')
# 输入开始页和结束页
start_page = int(input('start>>>'))
end_page = int(input('end>>>'))
for page in range(start_page, end_page + 1):
new_url = url % page
response = requests.get(url=new_url, headers=headers)
page_text = response.text
# 使用正则表达式找到所有图片URL
img_url_list = re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>', page_text, re.S)
# 添加HTTPS协议,并保存图片
for img_url in img_url_list:
img_url = 'https:' + img_url
img_name = img_url.split('/')[-1]
img_path = 'qiutu/' + img_name
urllib.request.urlretrieve(url=img_url, filename=img_path)
print(img_path, '下载成功')
print('over')
```
在这个示例中,我们首先定义了目标URL模板和请求头,然后根据用户输入的页码范围发起HTTP请求。使用正则表达式`<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>`匹配包含图片URL的HTML代码段。接着,为每个找到的图片URL添加HTTPS协议,并将图片保存到本地。
正则表达式在Python爬虫中扮演着至关重要的角色,它可以帮助我们有效地提取和解析网页数据。通过理解正则表达式的模式和标志位,我们可以更灵活地处理各种复杂的数据结构。在实际的网络爬虫项目中,掌握正则表达式的使用技巧是提高效率的关键。希望这个例子能帮助你更好地理解和应用正则表达式在Python爬虫中的实践。