zoukankan      html  css  js  c++  java
  • Python.Requests库进阶应用

    cookie设置

    设置Cookie

    import requests
    
    cookie = {'hero': 'alix'}
    
    r_cookie = requests.get(base_url + '/cookies', cookies= cookie)
    
    print(r_cookie.text)

    运行结果

    {
      "cookies": {
        "hero": "alix"
      }
    }

    获取cookie

    请求百度首页,然后获取cookie,实现如下:

    r = requests.get('http://www.baidu.com')
    
    print(type(r.cookies))
    
    print(r.cookies)
    for key,value in r.cookies.items():
        print(key + ":" + value)

    调用cookies属性即可成功得到cookies,可以发现它是一个RequestCookieJar类型,然后使用items()犯方法将其转化为元祖组成的俩表,表里输出每一个Cookie的名和值,实现Cookies的遍历解析。

    超时

    你可以让requests在经过timeout参数设定的描述时间之后停止等待响应。防止某些请求没有响应而一致处于等待状态。
    下面的案例故意设置一个很小的超时时间,为了来看一下超时后的一个响应处理。

    cookie = {'hero': 'ariliya'}
    
    r_timeout = requests.get(base_url + '/cookies', cookies=cookie, timeout=0.001)
    
    print(r_timeout.text)

    超时异常

    requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /cookies (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x0000017E45DFC860>, 'Connection to httpbin.org timed out. (connect timeout=0.001)'))

    文件上传

    Requests可以使用参数files模拟提交一些文件数据,计入有的接口需要我们上传文件,我们同样可以利用它来上传,实现非常简单,实例如下:

    file = {'file': open('01.jpg', 'rb')}
    
    r_up = requests.post(base_url + '/post', files=file)
    
    print(r_up.text)

    Tips:上传的文件要放在同一目录

    会话对象

    在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户i绘画所需的属性及配置信息。这样,当用户在应用程序在web页之间跳转时,存储在Session对象中的变量将不会丢失,二十在整个用户会话中一致存在下去。
    比如你先进行了登陆操作,人后打开个人中心详情页面,个人中心详情页面如何知道展示的是刚刚登陆的这个用户的信息,这里就需要使用Session来存储相关信息。
    在接口测试过程中接口之间经常有依赖关系,比如下面这两个请求义格式cookie另一个时获取cookie,在没有session保存几职的情况下,第二个接口无法获取第一个接口设置的cookie值

    # 设置cookie
    r = requests.get(base_url + '/cookies/set/hero/leesin')
    
    print(r.text)
    
    
    # 获取cookie,这里cookie为空,需要session保存在获取cookie
    
    r01 = requests.get(base_url + '/cookies')
    
    print(r01.text)

    返回值

    {
      "cookies": {
        "hero": "leesin"
      }
    }
    
    {
      "cookies": {}
    }

    Requests的会话对象让你能够跨请求保持某些参数。他也会在同一个session实例发出的所有请求之间保持cookie。

    # 生成会话对象
    s = requests.session()
    
    # 设置cookie
    r = s.get(base_url + '/cookies/set/hero/leesin')
    
    print(r.text)
    
    # 获取cookie
    r01 = s.get(base_url + '/cookies')
    
    print(r01.text)

    返回值

    {
      "cookies": {
        "hero": "leesin"
      }
    }
    
    {
      "cookies": {
        "hero": "leesin"
      }
    }

    所以,利用session可以做到模拟同一个会话,而且不用单行cookies的问题,通常用于模拟登陆成功之后再进行下一步的操作

    代理设置

    代理(Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络中断(一般为客户端)通过这个服务与另一个网络中断(一般为服务器)进行非直接的连接
    代理服务器位于客户端和访问互联网之间,服务器接收客户端的请求,然后代替客户端向目标网站发出请求,所有的流量路由均来自代理服务器的ip地址,从而获取一些不能直接获取的资源。
    对于有些接口,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模频繁请求(如性能的是)服务器可能就会开启验证;甚至把ip禁掉。为了防止这种情况发生就需要代理来解决这个问题,在Requests中需要通道proxies这个参数,在爬虫中常会用到代理。

    西刺免费代理

    代理设置

    proxie = {'http': 'http://114.230.69.81:9999'}
    
    r = requests.get(base_url + '/get', proxies=proxie)
    
    print(r.text)

    身份认证

    很多接口都需要身份认证,Request支持多种身份认证
    用下面案例验证2种省份类型:BasicAuth 和 DigestAuth

    from requests.auth import HTTPBasicAuth
    from requests.auth import HTTPDigestAuth
    
    #BasicAuth
    
    r_basic = requests.get(base_url + '/basic-auth/hero/leesin', auth= HTTPBasicAuth('hero', 'leesin'))
    
    print(r_basic.text)
    
    #DigestAuth
    
    r_digest = requests.get(base_url + '/digest-auth/auth/hero/leesin', auth= HTTPDigestAuth('hero', 'leesin'))
    
    print(r_digest.text)

    返回值

    {
      "authenticated": true, 
      "user": "hero"
    }
    
    {
      "authenticated": true, 
      "user": "hero"
    }

    流式请求

    有一些接口返回值比较特殊,不是单词返回一个结果,二十多个结果,比如,某个查询接口,返回值为排名榜前10的商品信息。
    实践案例
    请求接口如下:
    http://httpbing.org/stream/{num}
    num表示返回结果集的数量,比如输入10则返回10个不同的id结果
    针对这种类型的接口我们对结果集的处理需要使用迭代方法iter_lines()来处里:

    import json
    r = requests.get(base_url + '/stream/10', stream = True)
    # print(r.encoding)
    
    # 如果响应内容没有设置编码,则默认设置为utf-8
    if r.encoding is None:
        r.encoding = 'utf-8'
    
    # 对响应结果进行迭代处理
    for line in r.iter_lines(decode_unicode=True):
        if line:
            data = json.loads(line)
            print(data['id'])

    返回值

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
  • 相关阅读:
    DS博客作业07--查找
    第五次作业——05图
    第四次作业——04树
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    C语言博客05--指针
    C语言博客作业04--数组
    DS博客作业08--课程总结
    C语言-第0次作业
  • 原文地址:https://www.cnblogs.com/youngleesin/p/11109270.html
Copyright © 2011-2022 走看看