正则解析
实战案例-糗图图片爬取
- 通过图片地址爬取一张图片:糗图图片
url = 'https://pic.qiushibaike.com/system/pictures/12464/124644653/medium/OCDQRBU16H6YGDS6.jpg'
# content返回的的是二进制的图片数据
img_data = requests.get(url=url).content
with open('qioutu.jpg', 'wb') as fp:
fp.write(img_data)
提取每张图片的‘img src’,里面包含了图片地址信息
正则表达式的编写过程:目的——提取img src
# 1、将一张图片所在的class‘thumb’源码复制过来
<div class="thumb">
<a href="/article/124644870" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12464/124644870/medium/SNAEZ8KNQITTKXBF.jpg" alt="糗事#124644870" class="illustration" width="100%" height="auto">
</a>
</div>
# 2、写正则表达式
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
# 3、将正则表达式作用于源码即可提取所有图片地址形成一个列表
爬取图片到本地(还未进行分页操作)
def get_pic():
# 创建存储图片的文件夹,若存在该文件夹则不执行
if not os.path.exists('./qioutupics'):
os.mkdir('./qioutupics')
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.131 Safari/537.36'
}
# 使用通用爬虫对URL对应的一整张页面进行爬取
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) # 打印要在return前面
for src in img_src_list:
src = 'https:' + src # 拼接全图片地址
img_data = requests.get(url=src, headers=headers).content
img_name = src.split('/')[-1]
imgPath = './qioutupics/' + img_name
with open(imgPath, 'wb') as fp:
fp.write(img_data)
print(img_name, '下载成功!')
# return img_src_list
分页操作
从第1,2,3页网址可以发现规律def get_pic(pagenum=None):
# 创建存储图片的文件夹,若存在该文件夹则不执行
if pagenum is None:
pagenum = [1, 1]
if not os.path.exists('./qioutupics'):
os.mkdir('./qioutupics')
url = 'https://www.qiushibaike.com/imgrank/page/%d/' # 网页地址
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/'
'92.0.4515.131 Safari/537.36'
}
for page in range(pagenum[0], pagenum[1]):
new_url = format(url % page)
# 使用通用爬虫对URL对应的一整张页面进行爬取
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) # 打印要在return前面
for src in img_src_list:
src = 'https:' + src # 拼接全图片地址
img_data = requests.get(url=src, headers=headers).content
img_name = src.split('/')[-1]
imgPath = './qioutupics/' + img_name
with open(imgPath, 'wb') as fp:
fp.write(img_data)
print(img_name, '下载成功!')
# return img_src_list
get_pic(pagenum=[1, 3]