原文地址https://blog.csdn.net/u011541946/article/details/77700074

前面一篇文章介绍了response对象的一些常用API,也已经提到,我们的重点是对response对象的操作。主要的操作就是数据分析和提取,一般来说,数据有很多种,有字段,有图片,有视频,有音频,凡是html页面能支持的content-type都是数据。只是不同场景下,有不同目的。例如,加入你需要在一个图片网站,爬取一些你敢兴趣的图片。或者你需要在一些招聘网站爬取职位信息,或者,你需要从服务器端下载一个文件。这些事情requests都可以帮你做到。本文,就是简单介绍,如何从网页获取一个图片的过程。

1. 设置我们的场景

打开百度图片搜索,输入selenium,然后找到一个selenium的图片,我们需要把这个图片通过requests下载到本地,图片如下。

这里我们假如说要下载第一张图片。

2. 手动获取图片在服务器上的url

点击打开上面红圈这个图片,记录下这个图片在服务器上的路径。你可以右键这个图片-查看图片,获取到这个路径:https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1504662907&di=2bf9d214dfdc9b0243163fb0a20f1228&imgtype=jpg&er=1&src=http%3A%2F%2Fpic.baike.soso.com%2Fp%2F20140415%2Fbki-20140415104220-671149140.jpg

3. 利用requests.get()方法和response.content方法是否能够打印出图片

importrequestsdefdownload_image():

url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1504068152047&di=8b53bf6b8e5deb64c8ac726e260091aa&imgtype=0&src=http%3A%2F%2Fpic.baike.soso.com%2Fp%2F20140415%2Fbki-20140415104220-671149140.jpg'response=requests.get(url)print(response.status_code)print(response.content)if __name__ == '__main__':

download_image()

运行一下,发现请求正确,但是用response.content打印出来是一堆乱码。

200 OK

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xd....后面跟着很多类似的乱码一样的数据

现在问题来了,我们怎么样才能把图片下载到本地,用response.content方法是行不通的。我们知道,图片也是文件格式,图片也是一些二进制代码组成。我们把图片当做普通的文件,然后通过字节流的方法,把图片保存到本地。

4.通过字节流方式保存图片

大概的原理是,一个图片是由字节流数据组成,我们可以把图片分层多个字节流数据,加载到内存,然后复制字节流到一个本地路径,最后组合成一张图片。

importrequestsdefdownload_image():

url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1504068152047&di=8b53bf6b8e5deb64c8ac726e260091aa&imgtype=0&src=http%3A%2F%2Fpic.baike.soso.com%2Fp%2F20140415%2Fbki-20140415104220-671149140.jpg'response= requests.get(url, stream =True)#这里打开一个空的png文件,相当于创建一个空的txt文件,wb表示写文件

with open('selenium.png', 'wb') as file:#每128个流遍历一次

for data in response.iter_content(128):#把流写入到文件,这个文件最后写入完成就是,selenium.png

file.write(data) #data相当于一块一块数据写入到我们的图片文件中

print(response.status_code)if __name__ == '__main__':

download_image()

运行之后,得到请求状态码是200,而且会在当前这个脚本文件同级目录下生成一个selenium.png的图片。如果你要指定图片保存路径,你可以在open('图片完整路径','wb'),通过这样方式,把图片保存到你想要保存的磁盘路径。上面虽然实现了我们的下载图片的目的,但是有一个问题就是,我们使用完了stream之后,没有立马去关闭,这样会造成内存资源紧张,如果是批量下载很多图片,这个方式是不可取的。

5.换一种方式,及时关闭stream

importrequestsfrom contextlib importclosingdefdownload_image_improve():

url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1504068152047&di=8b53bf6b8e5deb64c8ac726e260091aa&imgtype=0&src=http%3A%2F%2Fpic.baike.soso.com%2Fp%2F20140415%2Fbki-20140415104220-671149140.jpg'response= requests.get(url, stream =True)

with closing(requests.get(url, stream=True)) as response:#这里打开一个空的png文件,相当于创建一个空的txt文件,wb表示写文件

with open('selenium1.png', 'wb') as file:#每128个流遍历一次

for data in response.iter_content(128):#把流写入到文件,这个文件最后写入完成就是,selenium.png

file.write(data)if __name__ == '__main__':

download_image_improve()

运行之后,也会在当前脚本文件所在目录生成一个selenium1.png文件。contextlib.closing()函数是实现在一个代码块之后自动关闭,这里的代码块,就是我们请求下载图片的过程。这篇,已经实现了限定的图片url下载,如果是爬虫,肯定是大量图片下载。上面图片下载可以提取出来,重构成一个方法,在实际爬虫中调用。当然,爬虫中,很多是变量,图片请求url是变量,图片名称和保存路径也是变量。这里不继续讨论,爬虫实现的过程了。

python requests下载图片_Python requests库如何下载一个图片资源相关推荐

  1. python requests下载图片_Python使用urllib库、requests库下载图片的方法比较

    我们知道,使用Python制作一个爬虫程序,requests库是一个不错的选择,requests发送网络请求非常简单,比较使用urllib库,使用requests库可以大大减少代码量,它还可以定制请求 ...

  2. python requests下载图片_python读取图片大小Python Requests模块快速入门

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似.它比 urllib 更加方便,可以节约我们大量的工作,它比 urllib 更加 Pythoner. 安装 Re ...

  3. python requests是什么_python requests库学习

    Requests python的request库官方介绍就是让HTTP服务人类,所以从这点我们就可以知道request库是为了让我们更加方便的进行http相关的各种操作 我们学习request有什么用 ...

  4. 工信部python证书多少钱_python requests SSL证书问题

    错误信息如下: requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_ser ...

  5. python 批量下载图片_Python 批量下载图片示例

    使用Python find函数和urllib下载图片. A:#!/usr/bin/env python import time import urllib i = 0 url = ['']*10 na ...

  6. python 批量下载网页图片_Python实现多线程批量下载图片

    <派森>(Python)3.13 win32 英文安装版 类型:编程工具大小:21M语言:英文 评分:8.7 标签: 立即下载 爬取图片可真的是一个可遇不可求的机会. 有需求就会动力. 目 ...

  7. python requests 代理超时_python requests 超时与重试

    一 源起: requests模块作为python爬虫方向的基础模块实际上在日常实际工作中也会涉及到,比如用requests向对方接口url发送POST请求进行推送数据,使用GET请求拉取数据. 但是这 ...

  8. python绘制蚊香形_Python requests发送post请求的一些疑点

    前言 在Python爬虫中,使用requests发送请求,访问指定网站,是常见的做法.一般是发送GET请求或者POST请求,对于GET请求没有什么好说的,而发送POST请求,有很多朋友不是很清楚,主要 ...

  9. python pdf处理 图片_python PDF文件合并、图片处理

    一.合并多个PDF文件 实例: #导入模块import codecs import os import PyPDF2 as PyPDF2 #建立一个装pdf文件的数组 files = list()#遍 ...

最新文章

  1. 决策智能(Decision Intelligence)二三事
  2. 结合泛函极值_泛函极值及变分法教程.doc
  3. 英学者研究60亿次通话记录发现:好友再多也没用,最好朋友就4个
  4. 国家“十三五”重点出版规划获批
  5. jquery中跳出each循环
  6. android 功能防抖,一款简单的消息防抖框架
  7. idea打开ini文件以记事本方式修改
  8. LiveVideoStackCon 2017 Day 1 专场回顾 —— 多媒体与浏览器专场
  9. CF401C-Team【构造】
  10. 【LeetCode】【HOT】98. 验证二叉搜索树(递归)
  11. 某电子工厂老板感叹创业开厂人生
  12. 关于读研和生信学科的思考
  13. Verilog 7人投票表决器
  14. 流畅的python 18章
  15. python二级考试大纲小学生_Python语言二级考试大纲
  16. VC 模拟鼠标和键盘输入
  17. Linux命令-su-用户
  18. 芯片的IR drop是什么
  19. 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“
  20. Android依赖arr包 gradle7.0

热门文章

  1. 【云计算】盘点2017中国云计算产业的十个难忘瞬间!
  2. 下载安装Java教程
  3. Python中getopt函数用法
  4. ActiveMQ 原理与应用
  5. 程序员诉苦:“绩效考核”成了优秀员工的标签,绩效满分=成功?
  6. 长文对话实录:国内物联网10年沉浮,AIoT技术如何破局?| AIoT+智慧城市峰会...
  7. 自己动手实现微信自动回复机器人
  8. hadoop fs -ls后出现No such file or directory解决
  9. Vagrant相关错误
  10. 全新风格、高颜值高冷、高动力强劲——MINIWARE的体感螺丝刀套装测评