基础篇2 浅试Python爬虫爬取图片(二) 使用JSON解析

使用pythono爬取图片

上一章基础篇2 浅试Python爬虫爬取图片我们使用的是解析HTML中a标签的下载链接获取的图片

1.分析页面请求响应的数据

我们发现目标网站加载图片的方式为瀑布流加载,所以我们使用HTML分析的时候只能拿到有限的图片
在这里插入图片描述
例如我们将页面滚动条下移至底部的时候触发继续加载的事件,页面继续获取图片资源。
所以我们可以尝试能否直接拿到这段时间浏览器返回的数据
老规矩浏览器F12,切换到网络功能区域,过滤选择XHR
在这里插入图片描述
ok,到这里就出现了。
复制请求到地址栏试一下
在这里插入图片描述

正常返回json数据,其中包含目标下载的downloads路径。

2.尝试请求json数据并且解析目标数据

# -*- coding:UTF-8 -*-
import requests,json

res = requests.get('https://unsplash.com/napi/photos?page=5&per_page=12')
# 将返回的数据解析成json
data = json.loads(res.text)
# 遍历
for item in data:
  print(item)

打印结果如下
在这里插入图片描述在这里插入图片描述我们需要解析到links下的download属性数值

  • 在遍历的时候直接访问links->download
print(item["links"]["download"])

成功获取目标数据,打印结果如下
在这里插入图片描述

3.整合一下

# -*- coding:UTF-8 -*-
import requests,json
from contextlib import closing

class getImgByJson(object):
  def __init__(self) -> None:
    self.target = 'https://unsplash.com/napi/photos?page=5&per_page=12' # 请求的目标json数据
    self.urls = []  # 解析的图片下载路径
    self.names = [] # 图片名称

  def geturl(self):
    res = requests.get(self.target)
    # 将返回的数据解析成json
    data = json.loads(res.text)
    # 遍历
    for item in data:
      self.urls.append(item["links"]["download"]) #将下载链接存储起来
      self.names.append(item["slug"])

  def download(self,url,name):
    # 下载
      with closing(requests.get(url)) as r: # 获取图片信息
        with open('%s.jpg' % name ,'ab+') as f:  # 创建一个.jpg文件
          for chunk in r.iter_content(chunk_size=1024): # 写入二进制图片信息
            if chunk:
              f.write(chunk)
              f.flush

# 运行
getimg = getImgByJson() # 获取实例
getimg.geturl() # 解析下载路径
# 下载
print("图片下载中")
for i in range(len(getimg.urls)):
  print("正在下载:"+getimg.names[i]+'.jpg')
  getimg.download(getimg.urls[i],getimg.names[i])
print("下载完成")

看打印结果
在这里插入图片描述
实际下载情况
在这里插入图片描述

这里我们也是发现的问题,部分图片没有名称,这时我们就得在获取图片名称的时候判断一下获取的信息是否为空,为空的时候我们可以依照上一张截取字符串的方法处理,避免图片名为空造成的程序异常。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值