python三方库之requests的快速上手


Posted in Python onMarch 04, 2019

本文基于2.21.0

发送请求

发送GET请求:

r = requests.get('https://api.github.com/events')

发送POST请求:

r = requests.post('https://httpbin.org/post', data={'key':'value'})

其他请求接口与HTTP请求类型一致,如PUT, DELETE, HEAD, OPTIONS等。

在URL查询字符串中使用参数

给params参数传递一个字典对象:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('https://httpbin.org/get', params=payload)
>>> print(r.url)
https://httpbin.org/get?key2=value2&key1=value1

字典的值也可以是一个列表:

>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> r = requests.get('https://httpbin.org/get', params=payload)
>>> print(r.url)
https://httpbin.org/get?key1=value1&key2=value2&key2=value3

参数中值为None的键值对不会加到查询字符串

文本响应内容

Response对象的text属性可以获取服务器响应内容的文本形式,Requests会自动解码:

>>> r = requests.get('https://api.github.com/events')
>>> r.text
'[{"id":"9167113775","type":"PushEvent","actor"...

访问Response.text时,Requests将基于HTTP头猜测响应内容编码。使用Response.encoding属性可以查看或改变Requests使用的编码:

>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'

二进制响应内容

Response对象的content属性可以获取服务器响应内容的二进制形式:

>>> r.content
b'[{"id":"9167113775","type":"PushEvent","actor"...

JSON响应内容

Response对象的json()方法可以获取服务器响应内容的JSON形式:

>>> r = requests.get('https://api.github.com/events')
>>> r.json()
[{'repo': {'url': 'https://api.github.com/...

如果JSON解码失败,将抛出异常。

原始响应内容

在极少情况下,可能需要访问服务器原始套接字响应。通过在请求中设置stream=True参数,并访问Response对象的raw属性实现:

>>> r = requests.get('https://api.github.com/events', stream=True)
>>> r.raw
<urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

通常的用法是用下面这种方式将原始响应内容保存到文件,Response.iter_content方法将自动解码gzip和deflate传输编码:

with open(filename, 'wb') as fd:
  for chunk in r.iter_content(chunk_size=128):
    fd.write(chunk)

定制请求头

传递一个dict对象到headers参数,可以添加HTTP请求头:

>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}

>>> r = requests.get(url, headers=headers)

定制的header的优先级较低,在某些场景或条件下可能被覆盖。

所有header的值必须是string, bytestring或unicode类型。但建议尽量避免传递unicode类型的值

更复杂的POST请求

发送form-encoded数据

给data参数传递一个字典对象:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("https://httpbin.org/post", data=payload)

如果有多个值对应一个键,可以使用由元组组成的列表或者值是列表的字典:

>>> payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
>>> r1 = requests.post('https://httpbin.org/post', data=payload_tuples)
>>> payload_dict = {'key1': ['value1', 'value2']}
>>> r2 = requests.post('https://httpbin.org/post', data=payload_dict)

发送非form-encoded数据

如果传递的是字符串而非字典,将直接发送该数据:

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload))

或者可以使用json参数自动对字典对象编码:

>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, json=payload)

a) 如果在请求中使用了data或files参数,json参数会被忽略。b) 在请求中使用json参数会改变Content-Type的值为application/json

POST一个多部分编码(Multipart-Encoded)的文件

上传文件:

>>> url = 'https://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)

显式地设置文件名,内容类型(Content-Type)以及请求头:

>>> url = 'https://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)

甚至可以发送作为文件接收的字符串:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)

如果发送的文件过大,建议使用第三方包requests-toolbelt做成数据流。

强烈建议以二进制模式打开文件,因为Requests可能以文件中的字节长度来设置Content-Length

响应状态码

Response对象的status_code属性可以获取响应状态:

>>> r = requests.get('https://httpbin.org/get')
>>> r.status_code
200

requests库还内置了状态码以供参考:

>>> r.status_code == requests.codes.ok
True

如果请求异常(状态码为4XX的客户端错误或5XX的服务端错误),可以调用raise_for_status()方法抛出异常:

>>> bad_r = requests.get('https://httpbin.org/status/404')
>>> bad_r.status_code
404
>>> bad_r.raise_for_status()
Traceback (most recent call last):
 File "requests/models.py", line 832, in raise_for_status
  raise http_error
requests.exceptions.HTTPError: 404 Client Error

响应头

Response对象的headers属性可以获取响应头,它是一个字典对象,键不区分大小写:

>>> r.headers
{
  'content-encoding': 'gzip',
  'transfer-encoding': 'chunked',
  'connection': 'close',
  'server': 'nginx/1.0.4',
  'x-runtime': '148ms',
  'etag': '"e1ca502697e5c9317743dc078f67693f"',
  'content-type': 'application/json'
}
>>> r.headers['Content-Type']
'application/json'
>>> r.headers.get('content-type')
'application/json'

Cookies

Response对象的cookies属性可以获取响应中的cookie信息:

>>> url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)
>>> r.cookies['example_cookie_name']
'example_cookie_value'

使用cookies参数可以发送cookie信息:

>>> url = 'https://httpbin.org/cookies'
>>> cookies = dict(cookies_are='working')
>>> r = requests.get(url, cookies=cookies)

Response.cookies返回的是一个RequestsCookieJar对象,跟字典类似但提供了额外的接口,适合多域名或多路径下使用,也可以在请求中传递:

>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
>>> url = 'https://httpbin.org/cookies'
>>> r = requests.get(url, cookies=jar)
>>> r.text
'{"cookies": {"tasty_cookie": "yum"}}'

重定向及请求历史

requests默认对除HEAD外的所有请求执行地址重定向。Response.history属性可以追踪重定向历史,它返回一个list,包含为了完成请求创建的所有Response对象并由老到新排序。

下面是一个HTTP重定向HTTPS的用例:

>>> r = requests.get('http://github.com/')
>>> r.url
'https://github.com/'
>>> r.status_code
200
>>> r.history
[<Response [301]>]

使用allow_redirects参数可以禁用重定向:

>>> r = requests.get('http://github.com/', allow_redirects=False)
>>> r.status_code
301
>>> r.history
[]

如果使用的是HEAD请求,也可以使用allow_redirects参数允许重定向:

>>> r = requests.head('http://github.com/', allow_redirects=True)
>>> r.url
'https://github.com/'
>>> r.history
[<Response [301]>]

请求超时

使用timeout参数设置服务器返回响应的最大等待时间:

>>> requests.get('https://github.com/', timeout=0.001)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

错误及异常

  • ConnectionError:网络异常,比如DNS错误,连接拒绝等。
  • HTTPError:如果请求返回4XX或5XX状态码,调用Response.raise_for_status()会抛出此异常。
  • Timeout:连接超时。
  • TooManyRedirects:请求超过配置的最大重定向数。
  • RequestException:异常基类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中处理时间的几种方法小结
Apr 09 Python
python实现扫描日志关键字的示例
Apr 28 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
Python2实现的图片文本识别功能详解
Jul 11 Python
Opencv实现抠图背景图替换功能
May 21 Python
Python中请不要再用re.compile了
Jun 30 Python
python 日期排序的实例代码
Jul 11 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
python3.x 生成3维随机数组实例
Nov 28 Python
Python网络编程之ZeroMQ知识总结
Apr 25 Python
Python基本数据类型之字符串str
Jul 21 Python
django的ORM模型的实现原理
Mar 04 #Python
Python中按值来获取指定的键
Mar 04 #Python
python实现合并两个排序的链表
Mar 03 #Python
Python给图像添加噪声具体操作
Mar 03 #Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 #Python
更新修改后的Python模块方法
Mar 03 #Python
详解js文件通过python访问数据库方法
Mar 03 #Python
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
php读取文件内容的几种方法详解
2013/06/26 PHP
php数组键名技巧小结
2015/02/17 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
js实现弹幕墙效果
2020/12/10 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python递归计算N!的方法
2015/05/05 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
"序列点" 是什么
2016/07/29 面试题
会计出纳岗位职责
2013/12/25 职场文书
促销活动策划方案
2014/01/12 职场文书
社会学专业求职信
2014/02/24 职场文书
应用外语系自荐信
2014/06/26 职场文书
民事和解协议书格式
2014/11/29 职场文书
培训班开班主持词
2015/07/02 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android