在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=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/3707.html

《在Python中使用requests的一些小知识点总结》上有4条评论

发表评论

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