HTTP请求:Requests的进阶使用方法浅析( 三 )


import requests
url = 'http://www.baidu.com'
def verify_res(res, *args, **kwargs):
print('url', res.url)
res.status='PASS' if res.status_code == 200 else 'FAIL'
res = requests.get(url, hooks={'response': verify_res})
print(res.text) # <!DOCTYPE html><!--STATUS OK--><html>
print(res.status) # PASS
2.1.6 stream
获取内容立即下载开关 , response 会将报文一次性全部加载到内存中 , 如果报文过大 , 可以使用此参数 , 迭代下载 。
import requests
url="http://www.baidu.com"
r = requests.get(url, stream=True)
# 解析response_body , 以n分割
for lines in r.iter_lines():
print("lines:", lines)
# 解析response_body , 以字节分割
for chunk in r.iter_content(chunk_size=1024):
print("chunk:", chunk)
2.1.7 verify
认证 SSL 证书开关 , 当发送 HTTPS 请求的时候 , 如果该网站的证书没有被 CA 机构信任 , 程序将报错 , 可以使用 verify 参数控制是否检查 SSL 证书 。
# 1、直接设置
import requests
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
# 2、请求时虽然设置了跳过检查 , 但是程序运行时仍然会产生警告 , 警告中包含建议给我们的指定证书
# 可以通过设置 , 忽略屏蔽这个警告
from requests.packages import urllib3 # 如果报错 , 则直接引入import urllib3
# 3、屏蔽警告
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code) # 200
# 4、通过cert直接声明证书
# 本地需要有crt和key文件(key必须是解密状态 , 加密状态的key是不支持的) , 并指定它们的路径 , 
response = requests.get('https://www.12306.cn',cert('/path/server.crt','/path/key'))
print(response.status_code) # 200
2.2 requests 库的异常
如何判断是否出现异常呢?
2.2.1 raise_for_status()
该方法在内部判断 res.status_code 是否等于 200 , 不是则产生异常 HTTPError
示例:
# 1、HTTPError异常示例
import requests
from requests.exceptions import HTTPError
try:
res = requests.post("http://127.0.0.1:8080/example/post")
res.raise_for_status()
# 等同于
if res.status != 200:
raise HTTPError
return res
except HTTPError:
return False
2.2.2 ReadTimeout
该异常类型 , 将会捕捉到因请求 / 响应超时的请求 。
# Timeout超时异常
import requests
from requests.exceptions import ReadTimeout
try:
res = requests.get('http://127.0.0.1:8080/example/post',timeout=0.5)
print(res.status_code)
return res
except ReadTimeout:
print('timeout')
2.2.3 RequestException
该异常类型 , 将会捕捉到因无请求引起的异常请求 。
# RquestError异常
import requests
from requests.exceptions import RequestException
try:
res = requests.get('http://127.0.0.1:8080/example/post')
print(res.status_code)
return res
except RequestException:
print('reqerror')
3 总结
看到这里 , 大家应该明白了 , requests 库是一个比 urilib2 模块更加简洁的第三方库 , 它具有如下的特点:

  • 支持 HTTP 连接保持和连接池
  • 支持使用 cookie、session 保持会话
  • 支持文件上传
  • 支持自动响应内容的编码
  • 支持国际化的 URL 和 Post 数据自动编码
  • 支持自动实现持久连接 keep-alive
因此 , requests 这个高度封装的模块 , 可以使我们的 HTTP 请求 , 变得更加人性化 , 使用它将可以轻而易举的完成浏览器请求的任何操作 , 充分诠释了它的口号:“HTTP for Humans” 。
 
作者:京东物流 骆铜磊
来源:京东云开发者社区

【HTTP请求:Requests的进阶使用方法浅析】


推荐阅读