前言:
正则表达式有时在写脚本很方便,记录一下自己的学习过程!
正则练习
import re
# key = 'shy lemon'
#输出lemon
# test = re.findall('lemon',key)[0]
# print(test)
# lemon
# 利用正则提取出整个内容
# key = "hello world"
# test = re.findall('(.*)',key)[0]
# print(test)
# hello world
# 提取出数字
# string = '高190'
# test = re.findall('\d+',string)[0]
# print(test)
# 190
#提取出shy.
# key='lemon@shy.edu.com'
# test = re.findall('s.*?\.',key)[0]
# print(test)
#匹配sas和saas
key='saas and sas and saaas'
test = re.findall('sa{1,2}',key)
print(test)
用正则爬取图片
这次就来通过爬取糗图百科的糗图来练习正则表达式
先进行分析
观察到图片链接都是在这个<div class="thumb">
下面的,所以范围就确定了,复制下来
<div class="thumb">
<a href="/article/123149666" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12314/123149666/medium/6SOFQC0SLNI8BBU3.jpg" alt="糗事#123149666" class="illustration" width="100%" height="auto">
</a>
</div>
写出匹配的正则表达式
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
那下面就没有什么可以分析的了,直接写脚本:
import re
import requests
import os
if __name__ == '__main__':
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/80.0.3987.149 Safari/537.36'
}
#创建一个文件夹,保存图片
if not os.path.exists('./img'):
os.mkdir('./img')
page_text = requests.get(url=url,headers=headers).text
#使用正则
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:
#拼接图片地址
src = 'https:'+src
#获取响应的二进制数据
img_data =requests.get(url=src,headers=headers).content
#生成图片名称
img_name = src.split('/')[-1]
img_path = './img/'+img_name
with open(img_path,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功!')
虽说爬取成功了,但是我们爬取的只是一页,如果是多页的话还需要进一步处理,分析一下第二页和第三页的url有什么区别
发现只是数字在变化,那只要我们将url自动变化,这样不就可以请求到多页了,脚本如下:
import re
import requests
import os
if __name__ == '__main__':
#设置一个通用的url模板
url = 'https://www.qiushibaike.com/imgrank/page/%d'
# page_num = 1
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#创建一个文件夹,保存图片
if not os.path.exists('./img'):
os.mkdir('./img')
for page_num in range(1,5):
#对应页码的url
new_url = format(url%page_num)
page_text = requests.get(url=new_url,headers=headers).text
#使用正则
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:
#拼接图片地址
src = 'https:'+src
#获取响应的二进制数据
img_data =requests.get(url=src,headers=headers).content
#生成图片名称
img_name = src.split('/')[-1]
img_path = './img/'+img_name
with open(img_path,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功!')
爬取成功