原文地址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方法是否能够打印出图片

import requests

def download_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.通过字节流方式保存图片

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

import requests

def download_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

import requests
from contextlib import closing def download_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库如何下载一个图片资源的更多相关文章

  1. python requests库学习笔记(上)

    尊重博客园原创精神,请勿转载! requests库官方使用手册地址:http://www.python-requests.org/en/master/:中文使用手册地址:http://cn.pytho ...

  2. Python requests库的使用(一)

    requests库官方使用手册地址:http://www.python-requests.org/en/master/:中文使用手册地址:http://cn.python-requests.org/z ...

  3. Python——Requests库的开发者接口

    本文介绍 Python Requests 库的开发者接口,主要内容包括: 目录 一.主要接口 1. requests.request() 2. requests.head().get().post() ...

  4. 使用python requests库写接口自动化测试--记录学习过程中遇到的坑(1)

    一直听说python requests库对于接口自动化测试特别合适,但由于自身代码基础薄弱,一直没有实践: 这次赶上公司项目需要,同事小伙伴们一起学习写接口自动化脚本,听起来特别给力,赶紧实践一把: ...

  5. Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)

    Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起 ...

  6. 大概看了一天python request源码。写下python requests库发送 get,post请求大概过程。

    python requests库发送请求时,比如get请求,大概过程. 一.发起get请求过程:调用requests.get(url,**kwargs)-->request('get', url ...

  7. Python Requests库:HTTP for Humans

    Python标准库中用来处理HTTP的模块是urllib2,不过其中的API太零碎了,requests是更简单更人性化的第三方库. 用pip下载: pip install requests 或者git ...

  8. python requests库学习笔记(下)

    1.请求异常处理 请求异常类型: 请求超时处理(timeout): 实现代码: import requestsfrom requests import exceptions        #引入exc ...

  9. python+requests库,接口自动化

    1.requests库的使用 requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: “ ...

随机推荐

  1. 【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步

    一.实验说明: 信号量是一个多任务内核提出的一个协议机构,上一个实验中我们介绍了信号量访问共享资源 的功能,其实信号量最初是用来控制访问共享资源的,它还可以用来同步一个中断服务函数和一个任 务,或者同 ...

  2. redhat杂记

    1.设置sudo权限:修改/etc/sudoers文件,找到root    ALL=(ALL)       ALL,在后面添加nginx ALL=(ALL) NOPASSWD: ALL 2.用sed命 ...

  3. laravel项目安装

    composer install 遇到的问题 composer.json 里有多余的逗号 没有打开php_openssl.php_fileinfo 报错没具体报错信息,修改配置文件 config\ap ...

  4. java使用代理发post请求

    这东西啊,本身是无用的,但是要是移植就有用. package util; import java.util.Properties; public class HttpProxyConfiger { p ...

  5. 认识 SSH 密钥对

    SSH 密钥对是阿里云为您提供的新的远程登录 ECS 实例的认证方式. 相较于传统的用户名和密码认证方式,SSH 密钥对有以下特点: 仅适用于 Linux 实例: SSH 密钥对登录认证更为安全可靠: ...

  6. 智能聊天机器人——基于RASA搭建

    前言: 最近了解了一下Rasa,阅读了一下官方文档,初步搭建了一个聊天机器人. 官方文档:https://rasa.com/docs/ 搭建的chatbot项目地址: https://github.c ...

  7. MySQL之SQL注入

    1.SQL注入? 通过SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2.防止SQL注入,我们需要注意以下几个要点: ①永远不要信任用户的输入 ...

  8. python 接口自动化测试(六)使用unittest 批量用例管理

    我们日常项目中的接口测试案例肯定不止一个,当案例越来越多时我们如何管理这些批量案例?如何保证案例不重复?如果案例非常多(成百上千,甚至更多)时如何保证案例执行的效率?如何做(批量)测试数据的管理?如何 ...

  9. JBPM工作流(四)——管理流程定义

    概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程 ...

  10. 【Java线程安全】 — ThreadLocal

    [用法] 首先明确,ThreadLocal是用空间换时间来解决线程安全问题的,方法是各个线程拥有自己的变量副本. 既然如此,那么是涉及线程安全,必然有一个共享变量,我给大家声明一个: public c ...