python接口篇-Requests

一、什么是Requests

  1. Requests的定义

Requests是Python的一个第三方库,用于发送HTTP请求。Requests库可用于爬取数据、与API交互、测试Web服务等。

  1. Requests的作用

Requests库的作用主要是向Web服务器发送请求,并获取响应结果。发送的请求可以是GET、POST、PUT、DELETE、HEAD、OPTIONS等HTTP方法,同时还可以设置请求参数、请求头、请求体、代理、超时时间等。获取的响应结果包含HTTP状态码、HTTP响应头、HTTP响应内容等信息,同时支持自动解析JSON格式的响应内容。

  1. Requests的分类

根据请求方式不同,Requests库可以分为以下几类:

  • GET请求:用于从服务器获取资源,可以携带查询参数。使用requests.get()方法。

  • POST请求:用于向服务器提交数据,可以携带表单数据或JSON数据。使用requests.post()方法。

  • PUT请求:用于向服务器上传文件或替换指定的资源。使用requests.put()方法。

  • DELETE请求:用于删除指定的资源。使用requests.delete()方法。

  • HEAD请求:用于获取头部信息,不返回响应体。使用requests.head()方法。

  • OPTIONS请求:用于查询服务器支持的HTTP方法。使用requests.options()方法。

二、requests的操作步骤

  1. 安装

pip install requests

  1. 导入 requests 模块

import requests

  1. 构建请求参数

在HTTP请求中,通常包含如下几个部分:

  1. 请求方法:常见的HTTP请求方法包括GET、POST、PUT、DELETE等;

  1. URL:指明资源的路径;

  1. 请求头:包含了一些客户端环境和请求体信息,服务器端会根据这些信息来处理请求;

  1. 请求参数:用于向服务器发送数据,随请求发送的数据。

import requests

url = 'http://example.com'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = {'param1': 'value1', 'param2': 'value2'}
response = requests.post(url, headers=headers, data=data)

  1. 发送http请求

使用 requests 模块提供的方法发送 HTTP 请求,如 get、post 等。

response = requests.get(url, headers=headers, params=params)

例如:

发送get请求

import requests

response = requests.get('https://www.example.com/api/users?id=12345')

if response.status_code == 200:
    data = response.json()
    print(data)
上述代码中,使用了 params 参数来传递查询参数,它会将参数自动拼接到 URL 中并发送 GET 请求。

发送post请求

import requests

url = 'https://www.example.com/api/users'
params = {'id': '12345'}
data = {'name': 'John Smith', 'age': 30}

response = requests.post(url, params=params, data=data)

if response.status_code == 200:
    result = response.json()
    print(result)
上述代码中,首先定义了 URL 和传递给 API 的参数 params,以及要提交的数据 data。然后,使用 requests.post() 方法发送 POST 请求,并将响应结果存储在 response 变量中。最后判断响应状态码是否为 200 并将响应内容解析成 JSON 对象并输出到控制台。
需要注意的是,请求正文 data 可以是字符串、字节流或文件类对象,这取决于所需的 API。还可以设置请求头、设置超时时间、设置代理等等,以适应不同的请求场景。

使用json发送请求参数

import requests
import json

url = 'https://www.example.com/api/users'
headers = {'Content-Type': 'application/json'}
params = {'id': '12345'}
data = {'name': 'John Smith', 'age': 30}

response = requests.post(url, params=params, headers=headers, data=json.dumps(data))

if response.status_code == 200:
    result = response.json()
    print(result)
上述代码中,首先定义了 URL 和请求头 headers,然后定义了传递给 API 的参数 params 和数据 data,将数据转换成 JSON 字符串并使用 json.dumps() 方法来序列化JSON字符串。然后使用 requests.post() 方法发送 POST 请求,并将响应结果存储在 response 变量中。最后判断响应状态码是否为 200 并将响应内容解析成 JSON 对象并输出到控制台。
需要注意的是,请求正文 data 必须是 JSON 格式的字符串,请求头 headers 中必须包含 Content-Type 字段并设为 application/json,以便告诉服务器请求中包含了 JSON 数据。

  1. 处理响应结果

获取响应数据后,可以通过 response 对象的属性和方法来处理响应数据,如获取响应状态码、响应头信息、响应内容等。

常见的响应与三种:

  • response.text:只有响应是文本的时候才可以使用。

  • response.content:

  • response.json() :只有响应结果为json的时候才能使用。

# 获取响应状态码
status_code = response.status_code

# 获取响应头信息
headers = response.headers

# 获取响应内容(以 Unicode(文本) 形式返回,常用于获取文本内容)
text = response.text

# 获取响应内容(以 bytes(字节) 形式返回,常用于获取非文本内容(如图片、文件))
content = response.content

# 获取响应内容(以 JSON 格式返回,常用于获取 API 接口的响应结果)
json = response.json()  

举例:

获取文本形式的响应结果:

import requests

url = 'https://www.example.com/'

response = requests.get(url)

if response.status_code == 200:
    # 获取响应内容,并以文本形式输出
    result = response.text
    
    # 处理响应结果
    print(result)
else:
    print('请求出错,响应状态码:', response.status_code)
上述代码中,首先使用 requests.get() 方法发送 GET 请求,并将响应结果存储在 response 变量中。然后判断响应状态码是否为 200,如果是,则使用 .text 属性获取响应内容,并以文本形式输出;否则输出错误信息。
需要注意的是,如果响应结果是二进制流,可以使用 response.content 属性获取结果。

获取字节形式的响应结果:

import requests

url = 'https://www.example.com/'

response = requests.get(url)

if response.status_code == 200:
    # 获取响应内容,并以字节形式输出
    result = response.content
    
    # 处理响应结果
    print(result)
else:
    print('请求出错,响应状态码:', response.status_code)
上述代码中,首先使用 requests.get() 方法发送 GET 请求,并将响应结果存储在 response 变量中。然后判断响应状态码是否为 200,如果是,则使用 .content 属性获取响应内容,并以字节形式输出;否则输出错误信息。
需要注意的是,如果响应结果是文本形式,可以使用 response.text 属性获取结果。

获取json格式的响应结果:

import requests

url = 'https://www.example.com/api/users'

response = requests.get(url)

if response.status_code == 200:
    # 获取响应内容,并将其解析成 JSON
    result = response.json()
    
    # 处理响应结果
    for user in result['users']:
        print(user['name'], user['age'])
else:
    print('请求出错,响应状态码:', response.status_code)
上述代码中,首先使用 requests.get() 方法发送 GET 请求,并将响应结果存储在 response 变量中。然后判断响应状态码是否为 200,如果是,则使用 .json() 方法将响应内容解析成 JSON 对象,并使用遍历方式处理响应结果;否则输出错误信息。
需要注意的是,如果响应结果是文本形式或字节形式,可以使用 json 模块将其解析成 JSON 对象。

  1. 举例说明

import requests

url = "http://httpbin.org/post"
params = {"page": 1, "per_page": "20"}
# headers
headers = {"name": "zhangda", "xxx": "ok"}
# 请求体
body = {"passwd": "3456", "age": "33"}
response = requests.request(method='post', url=url, headers=headers,
                            json=body, params=params)  
这段代码是使用 Python requests 库向网站 http://httpbin.org/post 发送 POST 请求,并将请求的参数、headers 和请求体发送给服务器。
具体地, url 变量中存储了请求的网址, params 中存储了请求的 URL 参数, headers 中存储了请求的头部信息。其中 params 以字典形式传递,包含两个键 pageper_page,分别表示请求的页码和每页数据的数量; headers 同样以字典的形式传递,包含两个键 namexxx,分别表示自定义的请求头名称和值。
请求体则以 JSON 格式的字典类型存储在变量 body 中,包含两个键 passwdage,分别表示密码和年龄。
最后使用 requests.request() 方法来发送 POST 请求,传递参数 method='post'json=body(即请求体)来指定请求方法和请求体,同时将请求的 URL 参数和请求头部信息作为函数参数传递进去。
发送请求后,服务器将返回响应数据并存储在变量 response 中,可以通过调用 response.json() 方法将响应数据转化为 Python 对象进行操作。

将响应结果转为字典,不建议使用这种方法
"""
a = response.text
print(a)
a_dict = eval(a) #转为字典
print(a_dict)
print(a_dict['headers']['User-Agent'])
"""

"""
最好是不要用eval: eval使用起来危险,
建议使用 json 模块
"""

三、json

  1. 什么是json

在 Python 中,JSON 是一种常见的数据格式,可以用于存储或传输数据。Python 提供了 json 模块,可以方便地将 JSON 数据转换为 Python 对象,或将 Python 对象转换为 JSON 数据。

  1. json格式

一个正确的 JSON 格式应该满足以下要求:

使用花括号 {} 表示 JSON 对象,使用中括号 [] 表示 JSON 数组;

JSON 对象中的属性名必须使用双引号 " 包裹,属性值可以是字符串、数字、布尔值、null、JSON 对象或 JSON 数组;

不允许使用单引号 ' 包裹字符串;

不允许使用 JavaScript 特定的语法和标识符,如函数、变量、注释等;

字符集必须为 UTF-8 编码;

JSON 文本必须以开头和结尾处都是一对花括号 {} 或中括号 []。

#json格式如下
{
    "name": "Peter",
    "age": 28,
    "is_student": true,
    "address": {
        "city": "Beijing",
        "zip_code": "100101"
    },
    "scores": [80, 90, 85]
}
'{"name": "yuze", "age": 56}' #正确的json格式
"{'a': 'b', 'hey': 'hi'}" #不是json,json里面数据必须用双引号,外面可以用单引号
'{"a": False, "b": None}' #不是json
{"a": false,"b": null} #正确的json格式
'[1,2,3]' #正确的json格式

  1. json的使用

  1. 将JSON格式的字符串转换成Python对象

import json
"""#创建一个JSON格式的字符串
{
    "name": "Peter",
    "age": 28,
    "is_student": True,
    "address": {
        "city": "Beijing",
        "zip_code": "100101"
    },
    "scores": [80, 90, 85]
}
"""

使用 json.loads() 方法将 JSON 格式的字符串转换成 Python 对象。
json_str = '{"name": "Peter", "age": 28, "is_student": true, "address": {"city": "Beijing", "zip_code": "100101"}, "scores": [80, 90, 85]}'
python_obj = json.loads(json_str)
print(python_obj)
ps:json_str 是待转换的 JSON 字符串,python_obj 是转换后的 Python 对象,json.loads() 方法用于解析 JSON 格式的字符串。
输出结果:
{'name': 'Peter', 'age': 28, 'is_student': True, 'address': {'city': 'Beijing', 'zip_code': '100101'}, 'scores': [80, 90, 85]}

  1. 字典转成json

import json

#创建一个字典数据结构
data = {
    "name": "Peter",
    "age": 28,
    "is_student": True,
    "address": {
        "city": "Beijing",
        "zip_code": "100101"
    },
    "scores": [80, 90, 85]
}

#使用 json.dumps() 方法将字典转换成 JSON 格式的字符串
json_str = json.dumps(data)
print(json_str)
print(type(json_str))
ps:data 是待转换的字典数据结构,json_str 是转换后的 JSON 格式的字符串,json.dumps() 方法用于将 Python 对象转换成 JSON 格式的字符串。
输出结果:
{"name": "Peter", "age": 28, "is_student": true, "address": {"city": "Beijing", "zip_code": "100101"}, "scores": [80, 90, 85]}

举例:json经常出现的报错

json.decoder.JSONDecodeError
这个错误表示在试图将字符串解析为 JSON 时发生了错误。通常是因为传递给解析器的字符串不符合 JSON 规范。可以尝试打印出字符串并手动检查它是否有效的 JSON。
 # json.decoder.JSONDecodeError    
import json
a = '{"name": True, "age": null}'
b = json.loads(a)
print(b)    输出结果:json.decoder.JSONDecodeError 

四、jsonpath

  1. 定义

jsonpath 是一个 Python 库,用于在 JSON 数据中查找和提取数据。

  1. 作用

处理json的响应结果

  1. jsonpath表达式的组成

JSONPath 表达式主要由以下几个部分组成:

  • $:表示json的根节点。

  • .:表示当前节点。

  • ..:表示任意节点。

  • []:用于筛选数组中符合条件的元素,支持数字索引和通配符*。(例如:foo[0] 表示 foo 数组的第一个元素,foo[*] 表示 foo 数组中的所有元素)

  • @:表示当前节点的值。

  • .:表示对象的某个属性名。

  • ['']:表示对象的某个属性名,支持包含空格等特殊字符的属性名。(例如:foo['first name'],foo["$._id"])

  1. jsonpath的使用

#安装
pip install jsonpath
#导入
#方法1:导入的是函数,可直接使用
from jsonpath import jsonpath     #第一个jsonpath是模块名,第二个jsonpath是函数名
'jsonpath()'

#方法2:导入的是模块,必须加模块名才可以使用
import.jsonpath()   
"""json.jsonpath()"""

#我们自己命名的模块名不要和导入的模块名重复

import requests

url = "http://httpbin.org/post"
params = {"page": 1, "per_page": "20"}
# headers
headers = {"name": "zhangda", "xxx": "ok"}
# 请求体
body = {"passwd": "3456", "age": "33"}
response = requests.request(method='post', url=url, headers=headers,
                            json=body, params=params)

a = response.text
import json
a_dict = json.loads(a)

# 给我们提供了一个更方便的方法,直接得到字典
a = response.json()
print(a)

# 使用jsonpath 解析数据
from jsonpath import jsonpath  #jsonpath需要安装
result = jsonpath(a, '$..User-Agent')[0]  
print(result)

# 获取 passwd
print(jsonpath(a, "$..passwd")[0])

print(jsonpath(a, "$..Name")[0])
输出结果:
{'args': {'page': '1', 'per_page': '20'}, 'data': '{"passwd": "3456", "age": "33"}', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '31', 'Content-Type': 'application/json', 'Host': ' httpbin.org', 'Name': 'zhangda', 'User-Agent': 'python-requests/2.28.2', 'X-Amzn-Trace-Id': 'Root=1-644722f5-077695ae776104c102891bb6', 'Xxx': 'ok'}, 'json': {'age': '33', 'passwd': '3456'}, 'origin': '60.216.88.35', 'url': ' http://httpbin.org/post?page=1&per_page=20'}
python-requests/2.28.2
3456
zhangda

五、总结

  1. requests.request()

  1. 参数:url、methed请求方法,params、headers请求头,body请求体(包括:json、data)

  1. 问题:我想通过一个接口来实现登录,需要传递用用户名和密码两个参数,

  • 请问我可以用GET请求方法吗?可以

  • params参数可以传递吗?可以

  • headers可以吗:可以

响应:大多数时候还是用response.json()

结果的转化:json和字典的转化

jsonpath对于复杂的数据提取。

你可能感兴趣的:(python,自动化,pycharm)