美文网首页
requests的使用

requests的使用

作者: 在下YM | 来源:发表于2022-02-08 15:54 被阅读0次

    接口说明

    #使用requests库前都要导入requests库
    import requests
    
    #发送GET,POST,PUT,DELETE,HEAD 以及 OPTIONS 请求
    r = requests.get('https://postman-echo.com/get')
    r = requests.post('https://postman-echo.com/post')
    r = requests.put('https://postman-echo.com/put')
    r = requests.delete('https://postman-echo.com/delete')
    r = requests.head('https://postman-echo.com/get')
    

    响应对象Response
    响应状态码、响应头、响应体

    import requests
    
    # 访问百度首页
    # 返回值为Response对象
    resp = requests.get('https://www.baidu.com')
    
    # 查看响应状态码
    print(resp.status_code)
    # 200
    
    # 查看响应头
    print(resp.headers)
    
    # 查看响应体,未进行解码
    # content 是字节类型数据
    print(resp.content)
    
    # 查看响应体,解码之后的
    print(resp.text)
    

    字符编码
    请求发出后,Requests 会基于 HTTP 头部对响应的编码作出推测。
    当你访问 resp.text 之时,Requests 会使用其推测的文本编码, 如果 request 推测的编码和实际的响应的编码不同则可能出现乱码。
    我们可以通过 resp.encoding 查看当前猜测的编码, 也可以通过赋值来改变这个编码.

    import requests
    
    resp = requests.get('https://www.baidu.com')
    
    # 查看当前的 encoding
    print(resp.encoding)
    # 'ISO-8859-1'
    
    # 更改 encoding
    resp.encoding = 'utf-8'
    
    # 查看更改后的 encoding
    print(resp.encoding)
    # 'utf-8'
    
    # 查看解码的文本内容
    print(resp.text)
    # 非乱码的内容
    

    Response.json()
    Response.json()方法可以将接口json格式的返回内容自动转换为python的字典

    import requests
    
    # 这里请求 postman 提供的地址,他会返回一个 json 格式的响应体
    url = 'https://postman-echo.com/ip'
    resp = requests.get(url)
    
    # 字符串格式返回响应体内容
    print(resp.text, type(resp.text))
    
    # 通过响应对象的 json 方法获取 json 数据
    print(resp.json(), type(resp.json()))
    

    返回内容如下

    {"ip":"183.47.51.10"} <class 'str'>
    {'ip': '183.47.51.10'} <class 'dict'>
    

    注意:如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 html 格式的,尝试访问 r.json() 将会抛出异常。

    import requests
    
    # 这里请求百度首页
    url = 'https://www.baidu.com'
    
    # 请求 baidu 的首页,这里会获得 html
    resp = requests.get(url)
    
    # 响应体不是 json 类型,会抛出异常
    print(resp.json())
    

    错误信息如下:

    Traceback (most recent call last):
      File "/home/python/code/requests_code/requests_4_jsonerr.py", line 10, in 
        print(resp.json())
      File "/home/python/.virtualenvs/test_v7/lib/python3.6/site-packages/requests/models.py", line 896, in json
        return complexjson.loads(self.text, **kwargs)
      File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
        raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
    

    发送GET请求
    传递URL参数

    import requests
    
    # 这个接口会把我们传递的 url 参数,通过响应体返回
    url = 'https://postman-echo.com/get'
    
    resp = requests.get(url)
    
    # 查看响应体 json
    print(resp.json())
    
    print('='*80)
    
    # GET请求时传递参数
    payload = {'key1': 'value1', 'key2': 'value2', 'key3': ['value3', 'valua4']}
    
    # 通过 params 参数传递 url 参数
    resp = requests.get(url, params=payload)
    
    # 查看发起请求的的完整 url
    print(resp.url)
    
    # 查看响应体
    print(resp.json())
    
    print('='*80)
    
    
    # 手动拼接参数
    url = 'https://postman-echo.com/get?key1=value1&key2=value2&key3=value3&key3=value4'
    resp = requests.get(url)
    
    # 查看响应体 json
    print(resp.json())
    

    定制请求头

    import requests
    
    # 这个接口会把我们携带的请求头通过响应体返回
    url = 'https://postman-echo.com/headers'
    
    resp = requests.get(url)
    
    # 查看响应体 json
    print(resp.json())
    
    print('='*80)
    
    # 定义请求头字典
    headers = {'name': 'mike'}
    
    # 通过 headers 参数传递自定义请求头
    resp = requests.get(url, headers=headers)
    
    # 查看响应体 json
    print(resp.json())
    

    定制cookies

    import requests
    
    # 这个接口会把我们携带的cookies通过响应体返回
    url = 'https://postman-echo.com/cookies'
    
    resp = requests.get(url)
    # 查看响应体 json
    print(resp.json())
    
    print('='*80)
    
    # 构建 cookie
    cookies = {
        'foo1':'foo1',
        'foo2':'foo2'
    }
    
    # 通过 cookies 参数发送 cookies
    resp = requests.get(url, cookies=cookies)
    
    # 查看响应体 json
    print(resp.json())
    

    发送POST请求
    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json

    data主要是发送表单格式报文
    json主要是发送json格式报文
    以下发送json格式数据:

    import requests
    
    import requests
    # 目标url
    url = 'http://127.0.0.1:8000/login/'
    
    # 构造请求体
    info = {
        "username":"1234",
        "password":"123456",
        "remembered":True
    }
    
    # 向目标url发送post请求
    response = requests.post(url, json=info)
    
    # 打印响应内容
    print(response.json())
    

    ============================================
    利用requests.session进行状态保持

    • 我们通过浏览器进行登录操作时,服务器会返回cookie,浏览器会把这些 cookie 存储下来,下次发起请求就把之前保存的 cookie 携带着发送给服务器,从而实现了状态保持。
    • 我们通过 requests进行登录操作或者其他操作,服务器返回了 cookie,下次再通过 requests发起其他请求时,requests 并不会把前面请求的 cookie 携带着发送给服务器,也就是说我们通过 requests是无法自动实现状态保持的。
    • requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。
    • session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session对象中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie
      需求:获取用户信息。获取用户信息必须先调用进行用户登录接口,在调用获取用户信息接口。
      requests方式:
    import requests
    
    # 目标url
    url = 'http://127.0.0.1:8000/login/'
    
    # 构造请求体
    info = {
        "username":"1234",
        "password":"123456",
        "remembered":True
    }
    
    # 向目标url发送post请求
    resp = requests.post(url, json=info)
    
    # 打印响应内容
    print(resp.json())
    
    # 获取用户信息
    resp = requests.get('http://127.0.0.1:8000/info/')
    print(resp.json())
    

    运行结果如下:

    {'code': 0, 'errmsg': 'ok'}
    {'code': 400, 'errmsg': '未登陆!'}
    

    session方式:

    import requests
    
    # 目标url
    url = 'http://127.0.0.1:8000/login/'
    
    # 构造请求体
    info = {
        "username":"1234",
        "password":"123456",
        "remembered":True
    }
    
    # 创建session对象
    session = requests.Session()
    
    # 向目标url发送post请求
    resp = session.post(url, json=info)
    
    # 打印响应内容
    print(resp.json())
    
    # 获取用户信息
    resp = session.get('http://127.0.0.1:8000/info/')
    print(resp.json())
    

    运行结果如下:

    {'code': 0, 'errmsg': 'ok'}
    {'code': 0, 'errmsg': 'ok', 'info_data': {'username': '1234', 'mobile': '13344445555', 'email': '', 'email_active': False}}
    

    相关文章

      网友评论

          本文标题:requests的使用

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