一、响应状态码

状态码检测

import requests

url = 'http://httpbin.org/get'
bad_url = 'http://httpbin.org/status/404'
cookies_url = 'http://example.com/some/cookie/setting/url'
cookies_server_url = 'http://example.com/some/cookie/setting/url'
redirect_url = 'http://github.com'

def response_code():
    r = requests.get(url)
    r_code = r.status_code
    print(r_code)

    # requests 内置状态码查询对象
    if requests.codes.ok == r_code:
        print("---ok---")

    # 请求错误,response.raise_for_status() 抛出异常
    br = requests.get(bad_url)
    br_code = br.status_code
    print("br_code: ", br_code)
    print("br.raise_for_status: ", br.raise_for_status())
    print("r.raise_for_status: ", r.raise_for_status())

response_code()

状态码整理分类

状态码

状态

描述

1xx

----

**信息类的状态码 **

100

Continue

服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。

101

Switching Protocols

服务器转换协议,服务器将遵从客户的请求转换到另外一种协议

2xx

----

**成功类的状态码 **

200

OK

请求成功(是对 GET 或 POST 的请求应答文档)

201

Created

请求被创建完成,同时信的资源被创建

202

Accepted

供处理的请求已被接收,但是处理未完成

203

Non-authoritative Information

文档已正常地返回,但一些应答头可能不正确,以为使用的式文档的拷贝

204

No Content

没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

205

Reset Content

没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。

206

Partial Content

客户发送了一个带有Range头的GET请求,服务器完成了它。

二、响应头

headers 响应头,字典的 key 大小写敏感

-- 紧接第一部分的代码
def response_headers():
    r = requests.get(url)
    r_headers = r.headers
    print('r_headers: ', r_headers)

response_headers()

三、Cookie

def get_cookie():
    r = requests.get(cookies_url)
    r_cookie = r.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')
    r2 = requests.get(cookies_server_url, cookies=jar)
    print('r2.text', r2.text)

    print('r_cookie: ', r_cookie)

    # 发送自己的 cookies 到服务器
    cookies = dict(cookies_are='working')
    rs = requests.get(cookies_server_url, cookies=cookies)
    print('rs.text: ', rs.text)
get_cookie()

四、重定向与请求历史

def redirect_history():
    r = requests.get(redirect_url)
    r_url = r.url
    print('r_url: ', r_url)
    r_code = r.status_code
    print('r_code: ', r_code)

    # 请求历史
    r_history = r.history
    print('r_history: ', r_history)

    # 参数禁用重定向处理
    r_no = requests.get(redirect_url, allow_redirects=False)
    print('r_no.status_code: ', r_no.status_code)
    print('r_no.history: ', r_no.history)

    # 使用 DEAD,启用重定向
    r_start_redirect = requests.get(redirect_url, allow_redirects=True)
    print('r_start_redirect.status_code: ', r_start_redirect.status_code)
    print('r_start_redirect.history: ', r_start_redirect.history)
redirect_history()

五、超时

requests 在经过 timeout 参数设定的秒数时间之后停止等待响应。

def timeout():
    r = requests.get(redirect_url, timeout=2)
timeout()

六、错误与异常

  • 遇到网络问题(如:DNS 查询失败、拒绝连接等时),requests 会抛出一个 ConnectionError 异常。
  • 如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError异常。
  • 若请求超时,则超出一个 Timeout 异常。
  • 若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
  • 所有 Requests 显式抛出的异常都继承自 requests.exceptions.RequestsException。