使用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("下载完成")
看打印结果
实际下载情况