美文网首页
Requests 高级用法

Requests 高级用法

作者: 北游_ | 来源:发表于2018-06-13 16:29 被阅读262次

    1. 文件上传

    使用 post 请求提交数据

    import requests
    # 文件上传 post请求
    file = {'file': open('./uploadfile.png', 'rb')}
    print("开始请求")
    res = requests.post('http://httpbin.org/post', files=file)
    res = res.text
    print(res)
    
    

    2.Cookies

    • 获取 cookie

      import requests
      res = requests.get('http://www.baidu.com')
      # 调用请求响应的cookies属性获取cookie
      cookies = res.cookies
      for key,values in cookies.items():
        print(key,':',values)
      
    • 设置 cookie 方法一:将 cookie 加入请求头 headers 中。

      import requests
      # 方法一:cookie加入到headers请求头中
      headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
        'Cookie': 'd_c0="AAAC8BK13wyPTmULuvtm0wkjbW5ZyeFirPE=|1513951174"; _zap=87e9c9e3-5dbd-418b-8ebc-230ab091ecb5; __DAYU_PP=ef6JrVABfZUAjb7bBFuv217bd0126e8c; _ga=GA1.2.661525257.1520666422; ……capsion_ticket="2|1:0|10:1528862525|14:capsion_ticket|44:NDI0ZmI5MDliMjJhNDE4YzlkMTUzY2IwMTA3Njg5YTE=|8658014fd601bdcc209fe2b13d74da5ecd597135f8709b7727d3c7d2a4f97612"',
        'Host': 'www.zhihu.com'
      }
      # 注意此处请求url是https协议。
      res = requests.get('https://www.zhihu.com', headers=headers)
      print(res.text)
      
      
    • 设置 cookie 方法二:构造 RequestCookieJar 。

      import requests
      cookies = 'd_c0="AAAC8BK13wyPTmULuvtm0wkjbW5ZyeFirPE=|1513951174"; _zap=87e9c9e3-5dbd-418b-8ebc-230ab091ecb5; __DAYU_PP=ef6JrVABfZUAjb7bBFuv217bd0126e8c; _ga=GA1.2.661525257.1520666422; l_cap_id="ODZmNzc0NTIwZDU3NGMwNTg3ZTExMjNmZWVmZTJiZmM=|1527817448|09c4b1d56078f428986cabddc6a314695ce7a463"; capsion_ticket="2|1:0|10:1528862525|14:capsion_ticket|44:NDI0ZmI5MDliMjJhNDE4YzlkMTUzY2IwMTA3Njg5YTE=|8658014fd601bdcc209fe2b13d74da5ecd597135f8709b7727d3c7d2a4f97612"'
      headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
        'Host': 'www.zhihu.com'
      }
      
      jar = requests.cookies.RequestsCookieJar()
      
      for cookie in cookies.split(';'):
        key, value = cookie.split('=', 1)
        jar.set(key,value)
      
      res = requests.get('https://www.zhihu.com', cookies=jar, headers=headers)
      print(res.text)
      

    3.会话保持

    使用Session对象,维护会话。

    import requests
    # 会话保持:不使用每次都传入cookie的方式
    # 设置cookie
    requests.get('http://httpbin.org/cookies/set/number/123456789')
    # 获取网站cookie
    res = requests.get('http://httpbin.org/cookies')
    print(res.text)
    
    ## 上面的请求会话状态是不保存的(只是为了对比),下面的是正确用法 
    
    # 设置 Session 对象, 作用是维持同一个会话
    s = requests.Session()
    s.get('http://httpbin.org/cookies/set/number/123456789')
    res = s.get('http://httpbin.org/cookies')
    print(res.text)
    

    4. SSL证书验证

    • requests 提供了证书验证的功能,可以使用 verify 参数(布尔值)去控制是否检查证书。
    import requests
    # # SSL证书验证
    # 请求时带入 verify 关键字,值为False。表示不验证证书
    response = requests.get('https://www.12306.cn', verify=False)
    print(response.status_code)
    
    # 不过上面的请求会有如下警告,建议指定证书
    # InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warningsInsecureRequestWarning)
    

    对于上述警告解决方法:

    • 方案一:设置忽略警告的方式屏蔽这个警告

      import requests
      from requests.packages import urllib3
      
      urllib3.disable_warnings()
      response = requests.get('https://www.12306.cn', verify=False)
      print(response.status_code)
      
    • 方案二:使用 logging模块 捕获警告到日志的方式忽略警告

      import logging
      import requests
      logging.captureWarnings(True)
      response = requests.get('https://www.12306.cn', verify=False)
      print(response.status_code)
      
    • 方案三:指定本地证书用作客户端证书,本地私有证书的 key 必须是解密状态,加密状态的key是不支持的

      import requests
      response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
      print(response.status_code)
      

    5. 代理设置

    import requests
    
    proxies = {
        'http': 'http://1.12.32.1:2123',
        'https': 'http:/1.12.32.1:2123'
    }
    
    response = requests.get('http://www.baidu.com/s?wd="ip"', proxies=proxies)
    print(response.text)
    

    6. requests.codes.ok

    根据请求的响应码,执行响应的代码块

    import requests
    
    # 请求失败地址
    res = requests.get('https://www.jianshu.com/u/31dsdfb6d')
    # 请求成功地址
    # res = requests.get('http://www.baidu.com')
    
    if res.status_code == requests.codes.ok:
        print('请求成功')
        # 执行代码块
    else:
        print('请求失败')
        # 执行代码块
    

    7.超时设置

    因网络问题,可能导致某些请求会一直等待下去。故需要设置超时

    timeout 参数值有两种型式:

    • time : 整型,表示连接和读取这两者操作的 timeout 总和

    • (connect, read) 表示:连接超时时间和读取超时时间,默认值为None。

    #如果你制订了一个单一的值作为 timeout,如下所示:
    
    r = requests.get('https://github.com', timeout=5)
    #这一 timeout 值将会用作 connect 和 read 二者的 timeout。如果要分别制定,就传入一个元组:
    
    r = requests.get('https://github.com', timeout=(3.05, 27))
    #如果远端服务器很慢,你可以让 Request 永远等待,传入一个 None 作为 timeout 值,然后就冲咖啡去吧。
    
    r = requests.get('https://github.com', timeout=None)
    

    官方文档:http://docs.python-requests.org/zh_CN/latest/

    相关文章

      网友评论

          本文标题:Requests 高级用法

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