=Start=
缘由:
主要参考官方文档,简单记录一下在实际使用过程中容易碰到的问题,方便以后参考。
正文:
参考解答:
一、复杂的 POST 请求
通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
>>> payload = { 'key1' : 'value1' , 'key2' : 'value2' } >>> print(r.text) { ... "form" : { "key2" : "value2" , "key1" : "value1" }, ... } |
你还可以为 data 参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,这种方式尤其有效:
>>> payload = (( 'key1' , 'value1' ), ( 'key1' , 'value2' )) >>> print(r.text) { ... "form" : { "key1" : [ "value1" , "value2" ] }, ... } |
很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。
例如,Github API v3 接受编码为 JSON 的 POST/PATCH 数据:
>>> import json >>> url = 'https://api.github.com/some/endpoint' >>> payload = { 'some' : 'data' } >>> r = requests.post(url, data=json.dumps(payload)) |
此处除了可以自行对 dict 进行编码,你还可以使用 json 参数直接传递,然后它就会被自动编码。这是 2.4.2 版的新加功能:
>>> url = 'https://api.github.com/some/endpoint' >>> payload = { 'some' : 'data' } >>> r = requests.post(url, json=payload) |
部分情况下,如果在进行requests.post()时,不对data参数的内容进行json.dumps()处理的话,可能会出现状态码为415的情况,原因暂未细究。
二、JSON 响应内容
Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:
>>> import requests >>> r.json() |
如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。
需要注意的是,成功调用 r.json() 并**不**意味着响应的成功。有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status() 或者检查 r.status_code 是否和你的期望相同。
# 响应成功状态下r.json()是一个只包含 1 个元素的list,所以可以通过r.json()[ 0 ]取内容 for item in r.json()[ 0 ]: print item, type(item) |
更多经验技巧:
- 定制请求头
- 设置cookie
- 重定向
- 超时
- 错误与异常
- 代理
- 更多高级功能
参考链接:
=END=
《 “在Python中使用requests的一些小知识点总结” 》 有 7 条评论
Trip: 协程 Requests 实战,获取免费代理
https://www.v2ex.com/t/414753#reply9
https://github.com/littlecodersh/trip
parameth – GET / POST 参数暴力破解工具
https://github.com/maK-/parameth
Arjun是一个用于查找隐藏GET和POST参数的python脚本
https://github.com/UltimateHackers/Arjun
requests库源码剖析
http://fanchao01.github.io/blog/2016/07/29/pythonlib-requests1/
requests的高级功能-超时时间
http://fanchao01.github.io/blog/2016/07/30/pythonlib-request2/
requests的高级功能-重试机制
http://fanchao01.github.io/blog/2016/07/30/pythonlib-request3/
requests的高级功能-认证机制与redirect机制
http://fanchao01.github.io/blog/2016/08/02/pythonlib-requests4/
How do I determine what type of exception occurred?
https://stackoverflow.com/questions/9823936/how-do-i-determine-what-type-of-exception-occurred
对于代码中有涉及到网络请求的地方,一定要记得添加上timeout超时时间设置,否则可能会引起其它连锁问题且不方便排查
`
ret = ”
try:
r = requests.get(url, headers=headers, timeout=3)
if r.status_code == 200:
ret = r.json().get(‘data’,”)
except Exception as e:
ret = e.__class__.__name__
return ret
`
python使用requests的post上传文件(将curl命令转换为python代码)
https://blog.csdn.net/qq_34769162/article/details/118611528
Python requests – POST data from a file
https://stackoverflow.com/questions/16145116/python-requests-post-data-from-a-file
Upload Image using POST form data in Python-requests
https://stackoverflow.com/questions/29104107/upload-image-using-post-form-data-in-python-requests
`
import requests
url = ‘http://file.api.wechat.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE’
files = {‘media’: open(‘test.jpg’, ‘rb’)}
requests.post(url, files=files)
`
POST a Multipart-Encoded File
https://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file
Convert curl commands to Python, JavaScript and more
https://curlconverter.com/python/
`
files = {
‘mediaType’: (None, ‘file’),
‘media’: open(‘./1.txt’, ‘rb’),
}
`
How to upload file with python requests?
https://stackoverflow.com/questions/22567306/how-to-upload-file-with-python-requests