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使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python实现一个Git日志统计分析的小工具
Dec 14 Python
python导出hive数据表的schema实例代码
Jan 22 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
python判断设备是否联网的方法
Jun 29 Python
查看python下OpenCV版本的方法
Aug 03 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
Python拼接字符串的7种方法总结
Nov 01 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
对python中arange()和linspace()的区别说明
May 03 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 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
极典R601SW收音机
2021/03/02 无线电
PHPMailer安装方法及简单实例
2008/11/25 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
php查看当前Session的ID实例
2015/03/16 PHP
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
python求pi的方法
2014/10/08 Python
python计算方程式根的方法
2015/05/07 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
python__name__原理及用法详解
2019/11/02 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
高考自主招生自荐信
2013/10/20 职场文书
助学金感谢信
2015/01/20 职场文书
教师个人培训总结
2015/02/11 职场文书
八年级作文之感恩
2019/11/22 职场文书
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android