一、urllib模块
python操作网络,也就是打开一个网站,或者请求一个http接口,使用urllib模块。
urllib模块是一个标准模块,直接import urllib即可。在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块
import json from urllib import request from urllib import parse # from urllib.request import urlopen # from urllib.parse import urlencode # urlencode 可以转化key-value键值对为xx=11这样的格式 pay_url = 'http://szz.nnzhp.cn/pay' balance_url = 'http://szz.nnzhp.cn/get_balance' balance_data = {'user_id': 1} # 发送get请求 new_balance_data = parse.urlencode(balance_data) # 把请求参数变成xx=11这样的 user_id = 1 balance_req = request.urlopen(balance_url + '?' + new_balance_data) # 发送get请求 print(balance_req.read().decode())# 获取接口返回的结果,返回的结果是bytes类型的,需要使用decode方法解码,变成一个字符串 # 发送post请求 pay_data = {"user_id": 1, "price": "999"} new_pay_data = parse.urlencode(pay_data) # 把请求参数变成xx=11这样的 pay_req = request.urlopen(pay_url, new_pay_data.encode()) # 发送post请求,传入参数的话 # 参数必须是bytes类型,所以需要先encode一下,变成bytes类型 print(pay_req.read().decode()) # 获取接口返回的结果,返回的结果是bytes类型的 # 需要使用decode方法解码,变成一个字符串 res = json.loads(pay_req.read().decode()) # 因为返回的是一个json串,想把json串转成字典的话,使用json模块转成一个字典 print(res)
二、requests模块
上面是使用python自带的urllib模块去请求一个网站,或者接口。但是urllib模块太麻烦了:
1)传参数都得是bytes类型;
2)返回数据也是bytes类型还要解码;
3)想直接把返回结果拿出来使用的话,还得用json;
4)发get请求和post请求也不同,使用比较麻烦。
还有一个比较方便的模块比urllib模块方便很多就是requests模块,使用pip install requests安装即可,下面是requests模块的实例
1、发送get、post请求
import requests pay_url = 'http://szz.nnzhp.cn/pay' balance_url = 'http://szz.nnzhp.cn/get_balance' balance_data = {'user_id': 1} pay_data = {"user_id": 1, "price": "999"} # 发送get请求,并获取返回结果,text获取的结果是一个字符串 balance_res = requests.get(balance_url, balance_data).text print(balance_res) # 发送get请求,并获取返回结果,json()方法获取的结果直接是一个字典 balance_res = requests.get(balance_url, balance_data).json() print(balance_res) # 调用post方法 pay_res = requests.post(pay_url, pay_data).json() print(pay_res)
注:http传的时候是urlencode编码,requests会将中文参数转urlencode编码
2、post请求:入参类型为json串,使用json参数指定
# ====入参是json串的==== url='http://szz.nnzhp.cn/api/user/add_stu' data = { "name":"requests_name", "grade":"天蝎座", "phone":17712532946, "sex":"男", "age":28, "addr":"河南省济源市北海大道32号" } res = requests.post(url,json=data) #入参是json类型的 print(res.json())
3、post请求:添加cookie,使用cookies参数指定
# ======添加cookie===== url = 'http://api.nnzhp.cn/setmoney2' data = {'userid': 1, "money": 9999} cookie = {'token': "token12345"} res = requests.post(url, data, cookies=cookie) # 使用cookies参数指定cookie print(res.json())
4、post请求:添加权限验证,auth参数
# =====添加权限验证===== url = 'http://api.nnzhp.cn/setmoney' data = {'userid': 1, "money": 91999} res = requests.post(url, data, auth=('admin', '123456')).json() # 使用auth参数指定权限验证的账号密码,auth传的是一个元组 print(res)
5、post请求:发送header
# =====发送header====== url = 'http://api.nnzhp.cn/getuser2' data = {'userid': 1} header = {'Content-Type': "application/json"} res = requests.post(url, headers=header).json() # 指定headers参数,添加headers
6、post请求:下载文件
# ======下载文件===== url6='https://aliimg.changba.com/cache/photo/855e5493-f018-44db-8892-c8660649327b_640_640.jpg' res = requests.get(url6,verify=False) #verify=False如果是https的话加上这个 with open('tu.jpg','wb') as fw: #二进制文件需要用wb fw.write(res.content) #下载文件
7、post请求:上传文件
# ======上传文件===== url = 'http://api.nnzhp.cn/uploadfile' data = {'file':open('魔鬼中的天使.mp3','rb')} #二进制文件需要用rb res = requests.post(url, files=data) # 指定files参数,传文件,是一个文件对象 print(res.json()) print(res.status_code) #获取它的状态码
8.response 返回内容
print(res.json()) #必须返回的是json才可以用 print(res.text) #返回文本信息字符串方式的响应体,会自动根据响应头部的字符编码进行解码,下载文件的话text就不行了 print(res.content) #用来下载文件文件用的,返回的是二进制会自动为你解码 gzip 和 deflate 压缩 print(res.headers) #获取到返回的所有header,以字典对象存储服务器响应头 print(res.cookies) #获取到返回的所有cookie print(res.status_code) #获取到响应状态码 print(res.url) #获取url print(res.encoding) #编码格式 print(res.raw) #返回原始响应体