一、响应状态码
状态码检测
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。