使用Requests爬取网页图片并保存

目标

爬取糗事百科上的“热图”的图片并保存在一个新建文件夹当中
使用Requests爬取网页图片并保存_第1张图片

过程

一、获得当前网页

使用的是requests爬虫,在使用requests库爬取网页中有介绍。

import requests

r = requests.get('https://www.qiushibaike.com/imgrank/')#获取网页链接
rtext = r.text
#rtext #打开用来查看是否获取成功

使用Requests爬取网页图片并保存_第2张图片

二、解析网页并提取图片

这里使用正则表达式,在正则表达式中有介绍。
首先,我们浏览器打开要爬取的网页,审查元素,定位到图片位置
使用Requests爬取网页图片并保存_第3张图片
使用Requests爬取网页图片并保存_第4张图片
通过观察,所有图片都位于 class=thumb的div的img 下
我们将这片代码拿出来观察

<div class="thumb">

<a href="/article/123937399" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12393/123937399/medium/KPE3TKKQTDJZN383.jpg" alt="糗事#123937399" class="illustration" width="100%" height="auto">
a>
div>

设计正则表达式

ex = '<div class="thumb"> .*?div>'
import re

ex = '
.*?' imglist = re.findall(ex,rtext,re.S)#搜索字符串;用于解析的都用re.S

三、保存图片

需要用到os库,创建一个文件夹qiutulist,将爬取出来的图片保存进去,但是需要注意保存图片的名字不能重复。

import os

if not os.path.exists('./qiutulibs'):
    os.mkdir('./qiutulibs')#如果该目录不存在,则创新一个

for src in imglist:
    src = 'http:'+src#拼接成一个完整的链接
    imgdata = requests.get(src).content#请求到了图的二进制数据
    
    #生成图片名称
    imgname = src.split('/')[-1]
    
    #图片存储路径
    imgpath = './qiutulibs/'+imgname
    
    with open(imgpath,'wb') as fp:
        fp.write(imgdata)
        print(imgname,'下载成功!')

split()函数语法:str.split(str="",num=string.count(str))[n]
参数说明:
str:表示为分隔符,默认为空格,但是不能为空(’’)。若字符串中没有分隔符,则把整个字符串作为列表的一个元素
num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量
[n]:表示选取第n个分片

另外 with open() as fp 的用法

整合

import requests
import re

import os#文件

#创建文件夹,用来保存所有图片
if not os.path.exists('./qiutulibs'):
    os.mkdir('./qiutulibs')
    
r = requests.get('https://www.qiushibaike.com/imgrank/')
rtext = r.text

ex = '
.*?' imglist=re.findall(ex,rtext,re.S) #img for src in imglist: src = 'http:'+src#拼接成一个完整的链接 imgdata = requests.get(src).content#请求到了图的二进制数据 #生成图片名称 imgname = src.split('/')[-1] #图片存储路径 imgpath = './qiutulibs/'+imgname with open(imgpath,'wb') as fp: fp.write(imgdata) print(imgname,'下载成功!')

使用Requests爬取网页图片并保存_第5张图片
使用Requests爬取网页图片并保存_第6张图片

==============================================================================

进阶

实现多页爬取

上述方法智能爬取一页的图片,但该系列有13页,这就需要分页爬取
使用Requests爬取网页图片并保存_第7张图片

分析

第二页链接:https://www.qiushibaike.com/imgrank/page/2/
第三页链接:https://www.qiushibaike.com/imgrank/page/3/

并且https://www.qiushibaike.com/imgrank/page/1/也能打开第一页链接
由此,可以设置一个模板链接,拼接到后面的数字

url='https://www.qiushibaike.com/imgrank/page/'

for pagenum in range(1,13):
    pagen = 'pagenum'#这里要注意字符串的转化,否则会报错
    rurl = format(url+pagen)#对应页码的url
    #把上述代码的解析都放在这个循环里

实现

#分页爬取

import requests
import re

import os#文件

#创建文件夹,用来保存所有图片
if not os.path.exists('./qiutulibs'):
    os.mkdir('./qiutulibs')

#设置一个通用url模板
url='https://www.qiushibaike.com/imgrank/page/'
#pagenum = 2  https://www.qiushibaike.com/imgrank/page/1/

for pagenum in range(1,13):
    pagen = 'pagenum'
    rurl = format(url+pagen)#对应页码的url

    r = requests.get(rurl)
    r.encoding='utf-8'
    rtext = r.text

    #解析操作
    ex = '
.*?' imglist=re.findall(ex,rtext,re.S) #img for src in imglist: src = 'http:'+src#拼接成一个完整的链接 imgdata = requests.get(src).content#请求到了图的二进制数据 #生成图片名称 imgname = src.split('/')[-1] #图片存储路径 imgpath = './qiutulibs/'+imgname with open(imgpath,'wb') as fp: fp.write(imgdata) print(imgname,'下载成功!')

使用Requests爬取网页图片并保存_第8张图片

你可能感兴趣的:(爬虫,python)