requests库是Python中可以用代码来模拟发送网络请求,并得到响应数据的一个第三方库
pip install requests
"""
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
#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里面的数据进行判断。接口测试的时候如果必要需要跟后端确定好是否需要
"""
方法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)
"""
方法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)
"""
方法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)
"""
"""
方法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
"""
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)