当前位置: 首页 > news >正文

requests库

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)

相关文章:

  • 【C++】-- STL之位图
  • Git 详细安装教程
  • 如何做一个最便宜的小程序?
  • 基于uclinux 的CAN 总线嵌入式驱动编程
  • IPV6基础知识简介
  • 【PE806】Nim on Towers of Hanoi(DP)(生成函数)
  • FFmpeg工具使用总结
  • 打电话用蓝牙耳机什么牌子好?打电话清晰的蓝牙耳机推荐
  • OpenAI 开源语音识别 Whisper
  • 陈齐彦:云原生,抵达元宇宙的数字基石
  • WEB自动化测试(1)—— Cypress 介绍
  • C#把数据库表里简体字转化为繁体字
  • JAVA计算机毕业设计云音乐后端内容管理系统Mybatis+系统+数据库+调试部署
  • Vue基础之插槽、自定义指令、render函数、过滤器
  • 企业实践开源的动机
  • 《Java编程思想》读书笔记-对象导论
  • iOS 颜色设置看我就够了
  • leetcode-27. Remove Element
  • Linux gpio口使用方法
  • MySQL数据库运维之数据恢复
  • React-flux杂记
  • Spring Cloud Feign的两种使用姿势
  • ubuntu 下nginx安装 并支持https协议
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • windows下mongoDB的环境配置
  • 测试如何在敏捷团队中工作?
  • 观察者模式实现非直接耦合
  • 三栏布局总结
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 移动端 h5开发相关内容总结(三)
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Java总结 - String - 这篇请使劲喷我
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma预处理命令
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (175)FPGA门控时钟技术
  • (2)Java 简介
  • (二十四)Flask之flask-session组件
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (四) Graphivz 颜色选择
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)视频码率,帧率和分辨率的联系与区别
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 4.0中的泛型协变和反变
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net Web项目创建比较不错的参考文章
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @ComponentScan比较
  • [100天算法】-目标和(day 79)