当前位置: 首页 > 工具软件 > Requests > 使用案例 >

requests使用详解

郭弘方
2023-12-01

requests的作用

requests库是Python中可以用代码来模拟发送网络请求,并得到响应数据的一个第三方库

安装,

pip install requests

3.1.3 基本使用格式

"""
1.导入 import requests
2.模拟发送请求并获取响应   
    res = requests.请求方式(url,相关参数)   #使用requests库模拟发送并且 并获取响应对象 赋给变量res
"""
# 导入模块
import requests
# 定义请求地址
url = 'http://www.baidu.com'
# 发送 GET 请求获取响应
response = requests.get(url)
# 获取响应的 html 内容
html = response.text

response的常用属性

  • res.encoding 查看响应正文的 编码格式
  • res.text 查看响应正文的文本内容 返回的是一个字符串格式
  • res.content 查看响应正文的文本内容 返回的是一个字节格式 如果获取图片数据或者音视频数据 通过它直接获取二进制数据并进行保存
  • res.status_code 查看响应的状态码
  • res.headers 查看响应的响应头
  • res.url 查看响应的URL
  • res.request.headers 查看请求头信息
  • res.request.body 查看请求正文
  • res.request.url 查看请求url
  • res.request.method 查看请求方式
  • res.cookies 获取响应中的cookie 得到的是一个 RequestsCookieJar对象

如果打印响应内容 出现乱码得解决方案

 #1.方案1 
     res.encoding=指定编码格式  #  先人为设置响应内容的编码
     print(res.text)     #  打印内容 
 #2.方案2 
     res.content.decode(指定编码) #获取字节流信息 然后转成指定编码

自定义请求头

"""
 1.先定义一个字典 格式:  h= {"请求头键":"对应的值","请求头键2":"对应的值",...}
 2.让定义的字典与请求产生关联  res = requests.请求方式(url,headers=h)
"""
# 导入模块
import requests
# 定义请求地址
url = 'http://www.baidu.com'
# 定义自定义请求头
headers = {
  "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
}
# 发送自定义请求头
response = requests.get(url,headers=headers)
# 获取响应的 html 内容
html = response.text

模拟浏览器,欺骗服务器,获取和浏览器一致的内容,有时候后端的业务逻辑内会对header里面的数据进行判断。接口测试的时候如果必要需要跟后端确定好是否需要

发送 携带查询字符串参数的GET 请求

"""
方法1:  推荐使用
    参数直接写在url中 该怎么操作还是怎么操作
    res= requests.get("https://www.baidu.com/s?wd=王心凌&pn=10")
方法2:
    1.先定义一个字典 格式:  p={"查询参数1":"对应的值","查询参数2":"对应的值",...} (查询参数就是值查询字符串参数 URL中?后面接的就是查询字符串参数)
    2.让定义的字典与请求产生关联  res = requests.get(url,params=p)
"""
# 当GET请求中有查询字符串怎么办?
# 方法一: 直接复制整个url发送请求
url = 'https://www.baidu.com/s?wd=蜗牛'
# 定义自定义请求头
headers = {
  "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
# 发送自定义请求头
response = requests.get(url,headers=headers)

#方法二:使用params参数为格式为字典,当有多个数据时会自动拼接
url = 'https://www.baidu.com/s?'
# 定义自定义请求头
headers = {
  "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
# 发送自定义请求头
par = {"wd":"蜗牛","pn":30}
response = requests.get(url,headers=headers,params=par)

发送请求参数类型为application/x-www-form-urlencoded 的 post请求

"""
方法1: 推荐使用
     1.先定义一个字典 格式: d = {"表单参数1":"对应的值","表单参数2":"对应的值",...} (表单参数就是请求传入的参数)
     2.让定义的字典与请求产生关联  res = requests.post(url,data=d) #底层会自动将请求的数据变成 application/x-www-form-urlencoded格式
方法2: 
     1.构建一个字符串 d=原始请求正文内容
     2.声明请求头中的content-type类型  h={"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
     2.让定义的字符串与请求产生关联  res = requests.post(url,data=d,headers=headers)
"""
# 导入模块
import requests
#方法1 将参数构建成字典发送
d={
	"username": "admin",
	"password": "123456",
	"verifycode": ""
	}
url="http://localhost:8080/demo" #项目是本地demo项目
res = requests.post(url,data=d)

#方法2  直接构建请求正文发送
d="username=admin&password=123456&verifycode="
h={"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
url="http://localhost:8080/demo"
res = requests.post(url,data=d,headers=h)

# 内容打印
print("响应头    :",res.headers)
print("响应url   :",res.url)
print("响应状态码 :",res.status_code)
print("请求头    :",res.request.headers)
print("请求url   :",res.request.url)
print("请求方式  :",res.request.method)
print("请求正文  :",res.request.body)
print("响应正文   :",res.text)

请求携带文件的操作

"""
1.未涉及到文件的参数 构建一个字典 d={"参数1":"对应值","参数2":"对应值",....}
2.涉及到文件的参数  构建一个字典 f={"参数1":open(文件路径,"rb"),....}  # 文件的参数对应的值就是文件对象
3.请求中携带所有参数
    res = requests.post(url,data=d,files=f) #分开表示 分开关联
"""
# 导入模块
import requests
url="http://localhost:8080/demo/upload"
data={'name': "上传文件case"}
f = {"files":open(文件路径,"rb")}
res = requests.post(url,data=data,files=f)
# 内容打印
print("响应头    :",res.headers)
print("响应url   :",res.url)
print("响应状态码 :",res.status_code)
print("请求头    :",res.request.headers)
print("请求url   :",res.request.url)
print("请求方式  :",res.request.method)
print("请求正文  :",res.request.body)
print("响应正文   :",res.text)

发送参数是json格式的请求

"""
 方法1: 
     1.定义一个变量 j=python数据类型(页面上请求的json字符串解析后的python数据)
     2.请求和变量产生关联  res = requests.post(url,json=j)
     
     #demo
     url ="https://demo.halo.run/api/admin/login"
     j= {"username":username,"password":password,"authcode":None}
     res = requests.post(url,json=j)
 方法2:
     1.直接复制请求的json字符串  datastr= json字符串
     2.在请求头中声明请求正文的类型  h={'Content-Type': 'application/json'}
     3.跟请求产生关联  res = requests.post(url,data=datastr,headers=h)
     
     #demo
     url = "https://demo.halo.run/api/admin/login"
     data=f'{{"username":"{username}","password":"{password}","authcode":null}}'
     h = {'Content-Type': 'application/json'}
     res = requests.post(url,json=data,headers=h)
"""

发送请求携带 Cookie

"""
方法1:  
    通过页面复制 已经登录成功的用户的信息 cookie 然后 写在请求头中 h={"Cookie":复制的值}
    然后请求中携带  res = requests.请求方式(url,headers=h)
    不推荐, 复制的是死值 不会动态变化 在实际工作中 cookie都是有有效期 过期之后又得重新复制   可以在调试的时候进行尝试使用
    
方法2:  推荐使用   
    1.在代码中进行登陆成功的操作 然后获取 登陆成功的响应对象 提取响应对象的cookie
        successres = requests.post(url,data=data)  #进行登陆成功的操作 得到登陆成功的对象
    2.然后在需要cookie的接口中 传入提取到的cookie  让两个接口产生关联
        res=requests.请求方式(url,cookies=successres.cookies)  
   	#demo
   	response = request.post() #先 正确登录得到响应
	cookies = response.cookies # 返回 RequestsCookieJar 对象
	# 直接把这个对象 传递到 cookies
	response = requests.get(url,headers=headers,cookies=cookies)  
	   
方法3: 推荐使用
    使用会话机制 让多个接口产生关联
    1. 实例化一个会话对象 sess = requests.session()
    2. 使用会话对象发送请求 实现登陆成功   res= sess.请求方式(url,相关参数)
    3. 在使用会话对象做需要cookie的操作  不需要人为指定cookie(因为sess之前已经登录成功 会自动记录cookie 后续的请求也会自动携带) 
        本质上你每次发送请求都是用的同一个sess(自然能记录相关之间的联系)
    #demo
    s = requests.session()  # 调用session方法 得到 s
	s.post(url,data=data)  #先 正确登录
	response = session.get(url,headers)  # 直接用s 去访问新的地址
	# session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie
"""

处理ssl证书验证问题

requests还提供了证书验证功能,当发送HTTP请求的时候,它会检查SSL证书,我们可以使用verify参数控制是否检查SSL证书。

请求一个HTTPS网站时,如果该网站的证书没有被CA机构信任,程序将会出错,提示SSL证书验证错误。对此,只需要将verify参数 设置为False即可。如下:

import requests
resposne = requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

#也可以通过cert直接声明证书
import requests
#本地需要有crt和key文件(key必须是解密状态,加密状态的key是不支持的),并指定它们的路径,
response = requests.get('https://www.12306.cn',cert('/path/server.crt','/path/key'))
print(response.status_code)

在请求SSL证书不被CA机构认可的HTTPS网站时,虽然设置了verify参数为False,但程序运行可能会产生警告,警告中建议我们给它 指定证书,可以通过设置忽略警告的方式来屏蔽这个警告:

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

#或者
import logging
import requests
logging.captureWarnings(True)
response = requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

代理设置

对于某些网站,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模、频繁地爬取,网站可能会弹出验证码,或者跳转到登录验证页面,更有甚者可能会直接封禁客户端的IP,导致一定时间内无法访问。为了防止这种情况,我们需要使用代理来解决这个问题,这就需要用到proxies参数。

import requests

proxies = {
  	#该代理服务器在免费代理网站上得到的,这样的网站有很多
    'http': 'http代理地址',
    'https': 'https代理地址' 
}

response = requests.get(url, proxies=proxies)
print(response.text)

 类似资料: