Request-python第三方模块

1、介绍

  • Requests,是Python最流行的第三方模块,其接口人性化的设计远比Python的原生urllib模块更加方便使用,在数据采集(爬虫)、测试开发中占据了举足轻重的地位。
  • Requests是一个功能强大的HTTP Client,能够帮助我们发送HTTP请求,并获取响应

安装

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

2、接口说明

使用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')

3、响应对象Response

3.1、响应状态码、响应头、响应体

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)

3.2、字符编码

  • 请求发出后,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)
# 非乱码的内容

3.3、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)

4、发送GET请求

4.1、传递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())

4.2、定制请求头

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())

4.3、定制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())

5、发送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":"mike123",
    "password":"chuanzhi12345",
    "remembered":True
}

# 向目标url发送post请求
response = requests.post(url, json=info)

# 打印响应内容
print(response.json())

6、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":"mike123",
    "password":"chuanzhi12345",
    "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":"mike123",
    "password":"chuanzhi12345",
    "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': 'mike123', 'mobile': '13344445555', 'email': '', 'email_active': False}}

posted on 2020-10-18 19:04  yycnblog  阅读(224)  评论(0编辑  收藏  举报

导航