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批量提交沙箱问题实例
Oct 08 Python
python append、extend与insert的区别
Oct 13 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
python获取url的返回信息方法
Dec 17 Python
Python中extend和append的区别讲解
Jan 24 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 Python
Python Numpy计算各类距离的方法
Jul 05 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
python基础入门之字典和集合
Jun 13 Python
Python实现制作销售数据可视化看板详解
Nov 27 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
php2html php生成静态页函数
2008/12/08 PHP
php whois查询API制作方法
2011/06/23 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
Stop SQL Server
2007/06/21 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
python中 chr unichr ord函数的实例详解
2017/08/06 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
tensorflow获取变量维度信息
2018/03/10 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
python进行参数传递的方法
2020/05/12 Python
详解Scrapy Redis入门实战
2020/11/18 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
公司活动方案范文
2014/03/06 职场文书
担保书格式及范文
2014/04/01 职场文书
大学英语专业求职信
2014/06/21 职场文书
工商管理自荐书
2014/07/06 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
可可西里观后感
2015/06/08 职场文书
入党后的感想
2015/08/10 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
python ConfigParser库的使用及遇到的坑
2022/02/12 Python