引入
我们首先回顾一下之前学习的requsets模块实现数据爬取的流程:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
其实,在上述的流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析。因此大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。因此,本次可能将详细介绍三种聚焦爬虫中的数据解析方式。至此我们的数据爬取的流程可以修改为:
- 指定url
- 发起请求
- 获取响应数据
- 数据解析
- 持久化存储
聚焦爬虫
我们之前介绍的是通用爬虫,它用于爬取整张页面信息
聚焦爬虫:聚焦爬虫是建立在通用爬虫的基础之上的,再将我们所需要的数据进行提取(数据解析),从而实现爬取页面中指定的页面内容;
数据解析的分类
- 基于正则实现的数据解析
- 通过bs4实现的数据解析
- 使用xpath实现数据解析(最通用的)
数据解析原理概述
- 解析的局部的文本内容都会在标签之间或者对应的属性中进行储存
- 1 .进行指定标签的定位
- 2.标签或者对应的属性中储存的数据值进行提取(解析)
使用正则表达式进行数据解析
在实现这个我们需求时,先解决一个问题,就是怎样爬取一种图片:
import requests
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Safari/605.1.15'}
url = 'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3187129139,3162464776&fm=26&gp=0.jpg'
# 使用content返回的是二进制形式的图片数据
img_data = requests.get(url=url).content
with open('./qiutu.jpg', 'wb') as fp:
fp.write(img_data)
- 需求:爬取糗事百科中糗图板块下所有的糗图图片
import requests
import re
import os
if __name__ == '__main__':
# 创建一个文件夹用于保存所有的图片
if not os.path.exists('./qiutulibs'):
os.mkdir('./qiutulibs')
url = 'http://www.qiushibaike.com/pic/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Safari/605.1.15'}
# 使用通用爬虫对url对应的一整张页面进行爬取
page_text = requests.get(url=url, headers=headers).text
# 使用聚焦爬虫将页面中所有的糗图进行解析/提取
# 根据网页文本的格式编写正则表达式,提取出图片的url地址
ex = '<div class="thumb">.*?</div>'
# 获得所有图片url的列表
img_src_list = re.findall(ex, page_text, re.S)
for src in img_src_list:
src = 'https' + src # 拼接一个完整的图片地址
img_data = requests.get(url=src, headers=headers).content
# 生成图片名称
img_name = src.split('/')[-1]
imgPath = 'qiutulips/' + img_name
with open(imgPath, 'wb') as fp:
fp.write(img_data)
使用bs4进行数据解析
实现原理
- 实例化一个BeautifuiSoup对象,并且将页面