Python爬虫学习第三章-2.2-正则的案例:爬取糗事百科中的糗图
这一节主要是使用正则表达式爬取糗事百科中的糗图
首先爬取整张页面,然后解析数据,获得想要的数据即可。在这个案例中是爬取图片。
1、爬取单个页面上的图片:
-
首先是用通用爬虫,指定要爬取的页面的url并进行UA伪装,爬取整张页面信息,发送请求并获取响应数据,以字符串的形式获取整张页面数据。
-
然后使用聚焦爬虫将页面中的图片信息进行解析和提取,查看网页源代码,查看图片的链接地址,再利用正则表达式从爬取到的整张页面的数据中批量提取出图片的地址。
-
通过for循环,根据补全的完整的图片地址用聚焦爬虫获取图片数据,步骤也是发起请求,在这里还要指明图片的保存名称的保存路径,尤其是保存路径,注意写法。
爬取图片的大致:
import requests
if __name__=='__main__':
#如何爬取图片数据
url = 'https://pic.qiushibaike.com/system/pictures/12365/123654720/medium/SQV48MZHN1730FP0.jpg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
#text返回的是字符串形式的数据,content返回的是二进制形式的数据,json返回的是对象类型的数据
img_data = requests.get(url = url,headers =headers).content #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 = 'https://www.qiushibaike.com/imgrank/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
#使用通用爬虫对一整张页面进行爬取
page_text = requests.get(url = url,headers = headers).text #以字符串形式获取整张页面数据
#使用聚焦爬虫将页面中所有的糗图进行解析和提取
#通过源代码可以看出,图片的url在img标签的src中,所以可以批量的对src的属性值发请求,就可以请求到某一张的图片的二进制数据
'''
<div class="thumb">
<a href="/article/123693499" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12369/123693499/medium/M9VS2MPLMJ8FHGNK.jpg" alt="糗事#123693499" class="illustration" width="100%" height="auto">
</a>
</div>
'''
#经观察,图片信息都存放在上边的子标签中,是src的属性值,所以可以定义一个正则表达式获取图片的url
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
img_src_list = re.findall(ex,page_text,re.S) #re.S是单行匹配,re.M是多行匹配,findall返回的是一个列表
#print(img_src_list)
for src in img_src_list:
#img_src_list中的地址不是完整的地址,缺少协议头,所以可以手动复制图片地址进行查看
#https://pic.qiushibaike.com/system/pictures/12369/123693499/medium/M9VS2MPLMJ8FHGNK.jpg
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: #存储二进制的数据用wb
fp.write(img_data)
print(img_name,'下载成功')
在本案例中爬取分页页面图片的代码:
import requests
import re
import os #用来创建文件夹保存图片
if __name__=='__main__':
#创建一个文件夹保存所有的图片
if not os.path.exists('./qiutuLibs'):
os.mkdir('./qiutuLibs')
# https://www.qiushibaike.com/imgrank/page/2/
# https://www.qiushibaike.com/imgrank/page/3/
# 由每一页的url可以总结出url的规律,从而进行分页的爬取
#设置一个通用的url模板
url = 'https://www.qiushibaike.com/imgrank/%d/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
for pageNum in range(1,3):
new_url = format(url%pageNum)#format返回的是一个字符串,new_url就是对应分页的地址
#使用通用爬虫对一整张页面进行爬取
page_text = requests.get(url = new_url,headers = headers).text #以字符串形式获取整张页面数据
#使用聚焦爬虫将页面中所有的糗图进行解析和提取
#经观察,图片信息都存放在上边的子标签中,是src的属性值,所以可以定义一个正则表达式获取图片的url
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
img_src_list = re.findall(ex,page_text,re.S) #re.S是单行匹配,re.M是多行匹配,findall返回的是一个列表
for src in img_src_list:
#img_src_list中的地址不是完整的地址,缺少协议头,所以可以手动复制图片地址进行查看
#https://pic.qiushibaike.com/system/pictures/12369/123693499/medium/M9VS2MPLMJ8FHGNK.jpg
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: #存储二进制的数据用wb
fp.write(img_data)
print(img_name,'下载成功')
注意:
- 爬取整张页面的数据时,获取响应数据是使用text属性。获取图片url的响应数据时,因为图片是二进制数据,所以使用content属性,并且在持久化存储中,写入的时候用的不是w而是wb。
- 从属性中获取的具体的url可能不完整,比如缺少域名,需要手动补全。
- 在爬取单张页面的图片时,为每张图片命名时用到img_name = src.split(’/’)[-1],注意通过/进行切分,[-1]取最后一部分
- 对于存储图片的程序,注意要指明图片的保存路径,如:img_path = ‘./qiutuLibs/’+img_name #图片的路径。
- 注意使用os模块创建存储图片的文件夹和往里面写数据的代码的写法。
- 爬取分页上的图片:使用for循环进行分页的url的转换,注意url模板的使用:
url = 'https://www.qiushibaike.com/imgrank/%d/'
和format的使用方法:new_url = format(url%pageNum)#format返回的是一个字符串,new_url就是对应分页的地址
以及明确哪些需要在for循环内,哪些不需要。 - 使用os模块创建文件夹:
if not os.path.exists('./qiutuLibs'):
os.mkdir('./qiutuLibs')