05数据解析—正则
回顾
1、爬虫
2、爬虫的分类:
-
通用爬虫
-
聚焦爬虫
-
增量式爬虫:监测
3、反爬机制
反反爬策略
4、robots,UA监测:UA伪装
5、http和https概念:服务器和客户端进行数据交互的某种形式。
6、常用的头信息:
- User-Agent:请求载体的身份标识
- Connection:close
- content-type
7、https的加密方式:证书秘钥加密
- 证书:是被应用在https的加密操作中的。
- 该证书是有证书认证机构颁布的,证书中包含了公钥(加密方式)。
8、request → get/post:
-
url
-
data/params:对请求参数的封装
-
headers:UA伪装
9、什么是动态加载的数据:由另一个额外的请求请求到的数据。
- ajax
- js
10、如何鉴定页面中是否有动态加载的数据?
- 局部搜索
- 全局搜索
11、对一个陌生网站进行爬取前的第一步
- 确定你要爬取的数据是否为动态加载的!!
数据解析
1、解析:根据指定的规则对数据进行提取。
作用:实现聚焦爬虫。
2、聚焦爬虫的编码流程:
-
指定url
-
发起请求
-
获取响应数据
-
数据解析
-
持久化存储数
3、据解析的方式:
- 正则
- bs4
- xpath
- pyquery(拓展)
4、数据解析的通用原理是什么?
-
数据解析需要作用在页面源码中(一组html标签组成的)
-
html的核心作用:展示数据
-
html是如何展示数据:数据被放置在html标签之中,或者是在属性中
5、通用原理:
-
标签定位
-
取文本or取属性
正则实现的数据解析
需求:爬取糗事百科中糗图数据
我去打开网页的时候,发现糗事百科的网页版本已经没有了,麻了麻了。
所以找了另一个网页,天堂图片网:https://www.ivsky.com/bizhi/
实现过程
1、导入包和反爬机制
import requests
# 反爬
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'
}
2、爬取图片数据
先爬一张图片试试,这里有两个方法
方式1:
url = 'https://img.ivsky.com/img/bizhi/li/202110/02/secrets_of_the_jungle-006.jpg'
img_data = requests.get(url=url,headers=headers).content # content返回的是byte类型的数据
with open('./1.jpg','wb') as fp:
fp.write(img_data)
方式2:
from urllib import request
url = 'https://img.ivsky.com/img/bizhi/li/202110/02/secrets_of_the_jungle-006.jpg'
request.urlretrieve(url,'./2.jpg')
方式1和方式2对于图片数据爬取的操作最大的不同之处:方式2不可以使用UA伪装的机制
urllib就是一个比较老的网络请求的模块,在requests模块没有出现之前,请求发送的操作使用的都是urllib
完整代码
import requests
import re
import os
if __name__=="__main__":
#创建一个文件夹
if not os.path.exists('./qiutuLibs'):
os.mkdir('./qiutuLibs')
url='https://www.qiushibaike.com/imgrank/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
#使用通用爬虫对url对应的一整张页面进行爬取
page_text = requests.get(url=url,headers=headers).text
#需要使用聚焦爬虫将页面中所有图片进行解析
# < div class ="thumb" >
# < a href = "/article/125003930" target = "_blank" >
# < img src = "//pic.qiushibaike.com/system/pictures/12500/125003930/medium/14Z46S72MMC2P4ZC.jpg" alt = "糗事#125003930"
# class ="illustration" width="100%" height="auto" >
# < / a >
# < / div >
ex= '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
img_src_list = re.findall(ex,page_text,re.S)
print(img_src_list)
for src in img_src_list:
#拼接出一个完整的图片url
src ='https:'+src
#请求到了图片的二进制数据
img_data = requests.get(url=src,headers=headers).content
#生成图片名称
img_name=src.split('/')[-1]
#图片最终存储的路径
img_Path='./qiutuLibs/'+img_name
with open(img_Path,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功!!!')