用正则解析来爬取图片信息
以糗事百科为例。
我们的数据爬取的流程:
–指定url
–发起请求
–获取响应数据
–数据解析
–持久化存储
正则解析的原理就在从整个页面的源码数据中,利用正则表达式,解析出局部想要爬取的数据,然后进行持久化存储。
第一个程序是只考虑首页的图片爬取
1.首先先创建一个文件夹保存所有图片
import requests
import re
import os
#需求:爬取糗事百科中糗图板块下所有的图片
if __name__=='__main__':
#创建一个文件夹,保存所有图片
if not os.path.exists('./qiutulibs1'):
os.mkdir('./qiutulibs1')
2.UA伪装,可使用网页,右键点击检查,进入network,任意网页都可,已下图为例
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
url='https://www.qiushibaike.com/imgrank/page/'#指定url
#使用通用爬虫对url对应的一整张页面进行爬取
page_text=requests.get(url=url,headers=headers).text
#使用聚焦爬虫将页面中所有的糗图进行解析/提取
ex = r'<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 = 'http:'+src
#请求到了图片的二进制数据
img_data=requests.get(url=src,headers=headers).content #获取数据
#生成图片名称
img_name=src.split('/')[-1]#以‘/’切分,-1表示取最后一位
#图片存储路径
imgPath='./qiutulibs1/'+img_name
with open(imgPath,'wb') as fp: #持久化存储
fp.write(img_data)
print(img_name,'下载成功')
刚刚那个程序只考虑了一页的,下面这个程序考虑分页爬取(我这里只爬取了两页,为了节省时间)
import requests
import re
import os
#需求:爬取糗事百科中糗图板块下所有的图片
if __name__=='__main__':
#创建一个文件夹,保存所有图片
if not os.path.exists('./qiutulibs2'):
os.mkdir('./qiutulibs2')
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
#设置一个通用的url模板
url='https://www.qiushibaike.com/imgrank/page/%d/'
for pageNum in range(1,3):#(取1-2)
#对于页码的url
new_url=format(url%pageNum)
#使用通用爬虫对url对应的一整张页面进行爬取
page_text=requests.get(url=new_url,headers=headers).text
#使用聚焦爬虫将页面中所有的糗图进行解析/提取
ex = r'<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 = 'http:'+src
#请求到了图片的二进制数据
img_data=requests.get(url=src,headers=headers).content
#生成图片名称
img_name=src.split('/')[-1]#以‘/’切分,-1表示取最后一位
#图片存储路径
imgPath='./qiutulibs2/%s'%img_name
with open(imgPath,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功')