requests是python实现的最简单易用的HTTP库
官网地址:http://cn.python-requests.org/zh_CN/latest/
一、环境安装
cmd -> pip install requests,安装完成后输入pip list可以看到requests即代表安装成功
二、get请求
1. 未携带参数
# 第一步:导入包
import requests
# 第二步:发送get请求
urlstr = 'https://www.wanandroid.com/blog/show/2'
r = requests.get(url=urlstr) # r = response
# 第三步:获取结果
print(r.text)
注意:状态码200只能说明这个接口访问的服务器地址是对的,并不能说明功能OK,一般要查看响应的内容,r.text是返回文本信息
2. 携带参数 -- 参数单独写
# 导入包
import requests
# 发送get请求
urlstr = 'https://www.wanandroid.com/article/query'
param = {'k':'Android'} # 参数
r = requests.get(url=urlstr,params=param)
# 获取结果
print(r.text)
print(r.status_code)
3. 携带参数 -- 参数直接放在url中
import requests
# 发送get请求,将参数直接携带在url中
urlstr = 'https://www.wanandroid.com/article/query?key=Android'
r = requests.get(url=urlstr)
# 获取结果
print(r.text)
print(r.status_code) # 打印出状态码
print(r.headers) # 打印出header信息
4.多个参数格式:
param = {"key1": "value1", "key2": "value2", "key3": "value3"}
5.content
百度首页如果用r.text会发现获取到的内容有乱码,因为百度首页响应内容是gzip压缩的(非text文本)
如果是在fiddler工具乱码,是可以点击后解码的,在代码里面可以用r.content这个方法,content会自动解码 gzip 和deflate压缩
代码:
import requests
r = requests.get('https://www.baidu.com')
print(r.url)
print(r.encoding) # 编码
print(r.content) # 获取返回内容(自动解码gzip)
print(r.headers)
print(r.cookies)
6.response -- 返回内容还有其它更多信息
-- r.status_code #响应状态码
-- r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
-- r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
-- r.json() #Requests中内置的JSON解码器,处理后对应Python的dict
-- r.url # 获取url
-- r.encoding # 编码格式
-- r.cookies # 获取response返回的cookie
-- r.raw #返回原始响应体
-- r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
-- r.raise_for_status() #失败请求(非200响应)抛出异常
三、发送post请求
1. 用help函数查看相关注释和案例内容
import requests
help(requests)
① 查看python发送get和post请求的案例
② 发送post请求(json形式)
post的body是json类型,有两种方法来传递json数据
第一种:先导入json模块,用dumps方法转化成json格式
import requests,json
# 发送请求
urlstr = 'http://httpbin.org/post'
payload = {'qq群名':'selenium+jmeter+loadrunner','qq群号':'106014970'}
# 通过json.dumps方法将python字符串转化成json类型
payload = json.dumps(payload)
# 发送请求
r = requests.post(url=urlstr,data=payload)
# 获取结果
print(r.text)
# 返回为json类型,既可以通过r.json方法来查看结果
print(r.json())
第二种:使用json参数默认处理成json格式进行传递
import requests,json
# 发送post请求
urlstr = 'http://httpbin.org/post'
payload = {'qq群名':'selenium+jmeter+loadrunner','qq群号':'106014970'}
# 发送请求,接口请求为json数据,通过json=自动将python对象转变为json类型
r = requests.post(url=urlstr,json=payload)
# 获取结果
print(r.text)
# 返回为json类型,即可以通过r.json方法来查看结果
print(r.json())
最后返回结果,传到data里
2. 发送post请求 -- 表单形式
① 登录接口
# 导入包
import requests
# 发送post请求
urlstr = 'https://www.wanandroid.com/user/login'
# 参数
data = {'username':'annieliang','password':'123456'}
r = requests.post(url=urlstr,data=data)
# 获取结果(与fiddler中抓到的请求一致)
print(r.text)
print(type(r.json())) # 查看类型
# 通过dict-key来访问对应的值
print(r.json())
print(r.json()['errorCode'])
print(r.json()['data']['username'])
运行结果为:
{"data":{"admin":false,"chapterTops":[],"collectIds":[-1],"email":"","icon":"","id":22395,"password":"","token":"","type":0,"username":"annieliang"},"errorCode":0,"errorMsg":""}
<class 'dict'>
{'errorMsg': '', 'errorCode': 0, 'data': {'password': '', 'admin': False, 'type': 0, 'collectIds': [-1], 'icon': '', 'token': '', 'chapterTops': [], 'username': 'annieliang', 'email': '', 'id': 22395}}
0
annieliang
②判断登录成功 -- 可以抓取页面上的关键元素,比如:账号名称,注销按钮,然后通过正则表达式提出这2个关键字
import requests
# 发送post请求
urlstr = 'https://www.wanandroid.com/user/login'
# 参数
payload = {'username':'annieliang','password':'123456'}
# 第二步:发送请求
r = requests.post(url=urlstr,data=payload)
# 第三步:获取结果(与fiddler中抓到的请求一致)
print(r.text)
# 查看类型后为字典类型,r.json将response中返回的json处理成了dict
print(type(r.json()))
# 通过dict-key来访问对应的值
print(r.json()['data']['username'])
# 判断是否登录成功(username是否是username)
# 判断返回的json数据是否有登录的用户名或通过正则来获取
if r.json()['data']['username'] == payload['username']:
print('登录成功!')
运行结果为:
{"data":{"admin":false,"chapterTops":[],"collectIds":[-1],"email":"","icon":"","id":22395,"password":"","token":"","type":0,"username":"annieliang"},"errorCode":0,"errorMsg":""
<class 'dict'>
annieliang
登录成功!
四、携带header和cookie参数发送请求
1.以玩Android登录为例,抓包查看请求头,header为Python的字典类型,所以可以支持dict类型的所有操作方式添加header信息,可以直接定义{},也可以通过dict[key]的方式添加
# 导入包
import requests
# 发送get请求
urlstr = 'https://www.wanandroid.com/blog/show/2'
header = {'User-Agent':'Mozzilla/5.0'}
cookie = {'JSESSIONID':'3E08EBE7538380CE432C7FEA74244011'}
r = requests.get(url=urlstr,headers=header)
# 获取结果
print(r.text)
print(r.headers)
print(r.cookies)
fiddler抓包得到header和cookie信息:
五、正则表达式(待补充)
六、os包的用法-path(待补充)