数据解析之正则
聚焦爬虫的编码流程:
指定url - 发起请求 - 获取响应数据 - 数据解析 - 持久化存储
原理概述:
因为解析的局部数据都在标签之间或者是标签对应的属性中进行存储,所以首先要进行指定标签的定位,然后对标签或者标签对应的属性中存储的数据进行提取(解析)。
先以一个正则提取图片地址的例子引入:
假设有一张图片,其地址写在下面的div标签中,需求是将该地址提取出来,只获取其中的图片路径:ex = <div class="thumb">.*?<img src="(.*?)" alt=.*?</div> (最终只会提取出里面的(.*?))
此时,该正则表示的就是//pic.qiushibaike.com/system/pictures/12172/121721100/medium/DNXDX9TZ8SDU6OK2.jpg。
<div class="context">
<a href="/article/121721100" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12172/121721100/medium/DNXDX9TZ8SDU6OK2.jpg" alt="指引我有前进的方向">
</a>
</div>
因此,采用正则匹配筛选出该页面所有的图片地址,然后通过finall()返回一个存放图片地址的列表,然后请求图片的二进制数据,进行持久化存储:
# 创建文件夹用于保存所有图片
# 如果qiutuLibs文件夹不存在,那么通过mkdir()创建
if not os.path.exists('./baoxiao'):
os.mkdir('./baoxiao')
...
# 采用正则匹配筛选出该页面所有的图片地址
ex = '<div class="content">.*?<img src="(.*?)" alt=.*?</div>'
# 将该表达式作用于page_text,param1表示正则表达式,param2表示作用于哪个对象,param3表示单行匹配,最后findall返回的是列表
img_src_list = re.findall(ex,page_text,re.S)
for src in img_src_list:
# 拼接为一个完整的图片URL
src = url + src
# 请求到图片的二进制数据
img_data = requests.get(url=src,headers=headers).content
# 持久化存储,需要一个固定的文件夹(通过os创建文件夹),并且每张图片需要命名
# 命名的话,根据图片地址最后的组成部分命名,比如//pic.qiushibaike.com/system/pictures/12172/121721100/medium/DNXDX9TZ8SDU6OK2.jpg中把最后部分切分split()出来,根据'/'切分,然后取最后一部分'-1'
img_name = src.split('/')[-1]
# 指定存储路径
imgPath = './baoxiao/' + img_name
最后成功实现:
如果在此基础上增加实现分页爬取功能的话,那么在设置url时,应写为如下内容:
url = 'http://www.baoxiaobaike.com/p/%d' for pageNum in range(1,3): # format()把%d后面的内容替换为字符串形式进行格式化输出 new_url = format(url%pageNum) # 先用通用爬虫提取整张页面数据 page_text = requests.get(url=new_url,headers=headers).text
【补充一部分正则内容】