美文网首页
python的requests库

python的requests库

作者: iscona | 来源:发表于2017-11-22 16:48 被阅读0次

import requests

  1. 发送请求
r = requests.get(url)
r = requests.post(url)
r = requests.put(url)
r = requests.delete(url)
r = requests.head(url)
r = requests.options(url)
  1. 传参
payload = {'key1' : 'value1', 'key2' : ['value2', 'value3']}
r = requests.get(url, params=payload)
print(r.url)
#http://httpbin.org/get?key1=value1&key2=value2&key2=value3
  1. 响应内容
requests会基于HTTP头部对响应的编码作出有根据的推测
当访问r.text时,requests会使用其推测的文件编码
可以使用r.encoding属性改变他
  1. 二进制响应内容
requests会自动解码gzip和deflate传输编码的响应数据
例如:
  以请求返回的二进制数据创建一张图片
    from PIL import Image
    from io import BytesIO
    i = Image.open(BytesIO(r.content))
  1. JSON响应内容
requests中有一个内置JSON解码器,可以处理JSON数据
r = requests.get('http://github.com/timeline.json')
r.json()
如果JSON解码失败,r.json()会抛出一个异常,响应内容是401(Unauthorized)
方式访问r.json()将会抛出ValueError:No Json object could be decoded 异常
注意:
  成功调用r.json()并不意味着响应成功,有的服务器会在失败的响应中包含一个JSON对象(比如HTTP500的错误细节),  这种JSON会被解码返回。
  要检查请求是否成功,请使用r.raise_for_status()或者检查r.status_code是否和你期望相同
  1. 原始响应内容
想要获取来自服务器的原始套接字响应,可访问r.raw
请确保在初始请求中设置了stream=True
r = requests.get('https://github.com/timeline.json', stream=True)
r.raw
r.raw.read(10)
可使用下面的模式将文本流保存到文件
with open(filename, 'wb') as fd:
  for chunk in r.iter_content(chunk_size):
    fd.write(chunk)

使用response.iter_content将会处理大量你直接使用response.raw不得不处理的。
当流下载时,上面是优先推荐的获取内容方式
  1. 定制请求头
传递一个dict给headers参数
headers = {'user-agent' : 'my-app/0.0.1'}
r = requests(url, headers=headers)

注意:
定制header的优先级低于某些特定的信息源
a. 如果在.netrc中设置了用户认证信息,使用headers=设置的授权就不会生效。
   而如果设置了auth=参数,“.netrc”的设置就无效了
b. 如果被重定向到别的主机,授权header就会被删除
c. 代理授权header会被URL中提供的代理身份覆盖掉
d. 在我们能判断内容长度的情况下,header的Content-Length会被改写

requests不会基于定制header的具体情况改变自己的行为,只不过在最后的请求中,所有的header信息都会被传递进去
所有的header值必须是string、bytestring、unicode
尽管传递unicode header也是允许的,但不建议这么做
  1. POST请求
表单传递
传递data数据
payload = {'key1' : 'value1', 'key2' : 'value2'}
r = requests.post(url, data=payload)
print(r.text)
#######
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}

传递一个元组列表
payload = (('key1', 'value1'),('key1', 'value2'))
r = requests.post(url, data=payload)
print(t.text)
########
{
  ...
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  },
  ...
}
非编码为表单形式的数据
import json
payload = {'some' : 'data'}
r = requests.post(url, data=json.dumps(payload))
除了可以自行对dict进行编码,还可以使用json参数直接传递,然后它会被自动编码
payload = {'some' : 'data'}
r = requests.post(url, json=payload)
  1. POST多部分编码的文件
file = {'file' : open('report.xls', 'rb')}
r = requests.post(url, files=files)
r.text
###############
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}

显式的设置文件名,文件类型和请求头
files = {'file' : ('report.xls', open(report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires' : '0'})}
r = requests.post(url, files=files)
r.text
#############
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}

发送作为文件来接收的字符串:
files = {'files' : ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
r = requests.post(url, files=files)
r.text
###################
{
  ...
  "files": {
    "file": "some,data,to,send\\nanother,row,to,send\\n"
  },
  ...
}

如果发送一个非常大的文件作为multipart/form-data请求,可能希望将请求做成数据流
默认下requests不支持,但第三方包requests-toolbelt是支持的
建议使用二进制模式打开文件,因为requests可能会试图为你提供Content-Length header,
在它这样做的时候,这个值会被设为文件的字节数,
如果用文本模式打开文件,就可能会发生错误
  1. 响应状态码
r = requests.get(url)
r.status_code

requests附带了一个内置的状态码查询对象
r.status_code == requests.codes.ok

异常:
如果发送了一个错误请求(4XX客户端错误、5XX服务器错误响应)
bad_r = requests.get(url)
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
###########
  1. 响应头
r.headers
################
{
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '148ms',
    'etag': '"e1ca502697e5c9317743dc078f67693f"',
    'content-type': 'application/json'
}
################

这个响应头是字典形式的,仅为HTTP头部而生,根据RFC2616,HTTP头部大小写不敏感
可访问:
r.headers['Content-Type']
r.headers.get('content-type')

服务器可以多次接受同一header,每次都使用不同的值
但是requests会将他们合并,这样它们就可以用一个映射来表示出来
  1. Cookie
如果某个响应中包含一些cookie,你可以快速访问它们:
r = requests.get(url)
r.cookies['example_cookie_name']

发送你的cookies到服务器:
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
r.text

cookie的返回对象为RequestsCookieJar
它的行为和字典类似,适合跨域名跨路径使用

可以把Cookie Jar传到Requests中
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
r = requests.get(url, cookies=jar)
r.text
#################
'{"cookies": {"tasty_cookie": "yum"}}'
#################
  1. 重定向与请求历史
默认情况下,除了HEAD,Requests会自动处理所有重定向
可以使用响应对象的history方法来追踪重定向

Response.history是一个Response对象的列表
为了完成请求而创建了这些对象
这个列表按照从最老到最新的请求进行排序
例如:
    r = requests.get('http://github.com')
    r.url
##################
https://github.com
##################
    r.status_code
##################
200
##################
    r.history
##################
[<Response [301]>]
##################
禁止重定向
如果你使用的是get、post、put、delete、patch、options,可通过allow_redirects参数禁用重定向
    r = request.get(url, allow_redirects=False)
    r.status_code
##################
301
##################
    r.history
##################
[ ]
##################
启用重定向
如果你使用了HEAD,也可以启用重定向
    r = requests.get(url, allow_redirects=True)
    r.url
##################
https://github.com
##################
    r.history
##################
[<Response [301]>]
##################
  1. 超时
requests.get(url, 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)
##########

注意:
timeout仅对连接过程有效,与响应体的下载无关
timeout不是整个下载响应的时间限制
如果服务器在timeout秒内没有应答,将会引发一个异常
更确切的说:
  在timeout秒内没有从基础套接字上接收到任何字节的数据时,引发异常
  1. 错误与异常
遇到网络问题(DNS查询失败、拒绝连接等),Requests会抛出一个ConnectionError异常
HTTP请求返回了不成功的状态码,Response.raise_for_status()会抛出一个HTTPError异常
请求超时,抛出Timeout异常
请求超过了设定的最大重定向次数,抛出TooManyRedirects异常


所有Requests显式抛出的异常都继承自requests.exceptions.RequestException

相关文章

网友评论

      本文标题:python的requests库

      本文链接:https://www.haomeiwen.com/subject/oujwvxtx.html