在Python中使用requests的一些小知识点总结


=Start=

缘由:

主要参考官方文档,简单记录一下在实际使用过程中容易碰到的问题,方便以后参考。

正文:

参考解答:
一、复杂的 POST 请求

通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

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

你还可以为 data 参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,这种方式尤其有效

>>> payload = (('key1''value1'), ('key1''value2'))
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> print(r.text)
{
  ...
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  },
  ...
}

很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。

例如,Github API v3 接受编码为 JSON 的 POST/PATCH 数据:

>>> import json
>>> payload = {'some''data'}
>>> r = requests.post(url, data=json.dumps(payload))

此处除了可以自行对 dict 进行编码,你还可以使用 json 参数直接传递,然后它就会被自动编码。这是 2.4.2 版的新加功能:

>>> payload = {'some''data'}
>>> r = requests.post(url, json=payload)

部分情况下,如果在进行requests.post()时,不对data参数的内容进行json.dumps()处理的话,可能会出现状态码为415的情况,原因暂未细究。

二、JSON 响应内容

Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:

>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
[{u'repository': {u'open_issues'0, u'url''https://github.com/...'}}]

如果 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 条评论

  1. 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
    `

  2. 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’),
    }
    `

回复 a-z 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注