一、urllib模块
urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块。
urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出来使用的话,还得用json,发get请求和post请求,也不通,使用比较麻烦
1 import json 2 from urllib import request 3 from urllib import parse 4 5 #【get请求】 6 url = 'http://api.nnzhp.cn/api/user/stu_info' 7 8 data={"stu_name":"xiaohei"} 9 10 tmpData=parse.urlencode(data) #1、将数据变为k=v模式 11 print(tmpData) 12 # 接口+参数 13 tmpUrl=url+'?'+tmpData # 接口参数拼接 14 print(tmpUrl) 15 res = request.urlopen(tmpUrl) # 请求接口 16 resForRead = res.read() # 通过read安啊获取返回值结果,返回值结果为Bytes类型 17 print(res.read()) 18 #待b的是bytes类型 bytes类型转成str类型:后面加.decode() 19 20 resForString = resForRead.decode() # 通过decode将bytes转成str类型 21 print(resForString) 22 23 # 2、想得到参数里面某一个字段,要先通过json变成字典的形式,然后再取值 24 resForDict = json.loads(resForString) # 通过json将字典转成字典 25 print(resForDict) 26 27 # 3、必须符合字典的格式才能取值 28 # 加上[] 29 30 # 【POST】请求 31 url = 'http://api.nnzhp.cn/api/user/login' 32 data={"username":"niuhanyang","passwd":"aA123456"} 33 tmpData = parse.urlencode(data) # k=v 34 35 # post 请求写法 36 res=request.urlopen(url,tmpData.encode()) # post请求 参数1为接口地址;参数2为bytes 37 print(res.read().decode()) 38 # post和get请求区别在于 urlopen时,get发的是接口和参数的平层字符串
{ "error_code": 0, "login_info": { "login_time": "20191106204328", "sign": "65ea3b950abe9aa55f23092449e1da3a", "userId": 2170 } }
二、requests模块
需pip install requests导入
1 pip install requests
Requests 基于 urllib ,采用Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。 目前很多Python 爬虫也使用Requests 库
功能特性
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie的回话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(s)代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持 .netrc (用户配置脚本文件)
requests.get() get请求
requests.post() post请求
requests.delete() delete请求
requests.put() put请求
2.1【get请求】
1 import requests 2 3 #【get】请求 4 url = 'http://api.nnzhp.cn/api/user/stu_info' 5 data={"stu_name":"xiaohei"} 6 7 res = requests.get(url,data).text 8 print(res) # 返回的是字符串格式的结果 9 10 # 1、如果需要返回的是字典格式 后面加.json 11 res = requests.get(url,data).json() 12 print(res)
2.2【POST】请求
1 # 【Post】请求 2 url = 'http://api.nnzhp.cn/api/user/login' 3 data={"username":"niuhanyang","passwd":"aA123456"} 4 5 # res = requests.post(url,data).text 6 res = requests.post(url,data).json() 7 print(res)
2.3【入参传json】
1 # 【入参是json】 2 url = 'http://api.nnzhp.cn/api/user/add_stu' 3 data = {"name":"dxw999","grade":"二年级","phone":"18217053374"} 4 5 res = requests.post(url,json=data).json() 6 print(res) # 接口要求入参是json类型,可以通过在post请求中指定json
{'error_code': 0, 'msg': '操作成功!'}
2.4【充值金币接口】
1 #【充值金币接口】 2 # 1、先登录 获取sign 3 url = 'http://api.nnzhp.cn/api/user/login' 4 data={"username":"niuhanyang","passwd":"aA123456"} 5 6 # res = requests.post(url,data).text 7 res = requests.post(url,data).json() 8 print(res) 9 10 # 2、生成cookie 11 cookie = {"niuhanyang":"160eb8812a08731ca9ce9c1ab6c6bc0f"} 12 url = 'http://api.nnzhp.cn/api/user/gold_add' 13 data = {"stu_id":"1","gold":"10000"} 14 res = requests.post(url,data,cookies=cookie).text #通过cookies传递cookie 15 print(res)
{ "error_code": 0, "msg": "操作成功!" }
2.5【获取header】
1 url = 'http://api.nnzhp.cn/api/user/all_stu' 2 header = {"Referer":"http://api.nnzhp.cn/"} # Referer 表示我的请求来自哪里
3 res = requests.get(url,headers=header).text 4 print(res)
2.5【传入文件】
1 url = 'http://api.nnzhp.cn/api/file/file_upload' 2 # 通过files参数将文件传递到服务器上 3 res = requests.post(url,files={"file":"open('urllib_test.py')"}).text 4 print(res)
{ "error_code": 0, "msg": "操作成功!" }
2.6 jsonpath取响应值
requests小练习
提供一个方法,获取到登陆后的sign
1、请求接口
2、获取返回值
3、解析取sign
安装jsonpath模块
1 import requests 2 import jsonpath 3 import nnlog 4 log = nnlog.Logger('booke_server.log',backCount=5,level='INFO') 5 6 def getSign(): 7 url='http://api.nnzhp.cn/api/user/login' 8 data={"username":"niuhanyang","passwd":"aA123456"} 9 # res = requests.post(url,data).text 10 res = requests.post(url,data).json() # 取json格式 11 log.debug(res) 12 # sign=res.get('login_info').get('sign') 13 sign=jsonpath.jsonpath(res,'$..sign') # 需要通过$..来定位 14 log.info(sign) 15 print(sign) 16 17 if __name__ == '__main__': 18 getSign()
2.7 网络请求
1 import requests 2 3 # r = requests.get('url',params={'key':'value'}) 4 5 # r.json() # 用来取参数 6 # r.text # 用来查看信息 7 8 r = requests.post( 9 'http://www.nnzhp.cn/archives/812', 10 params={ 11 'key': 'value'}, 12 data={ 13 'username': 'xxxx'}) 14 r.json() # 报错,可能返回的不是json格式参数 15 # raise JSONDecodeError("Expecting value", s, err.value) from None 16 # json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 17 print(r.text) # 通过r.text查看返回的具体内容 18 19 # 如果入参的是json格式 20 r = requests.post('url', json={'key': 'value'})
2.8 获取QQ群接口信息
https://qun.qq.com/cgi-bin/qun_mgr/search_group_members
post请求:需要传form data参数、cookie
1 import requests 2 3 url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members' 4 5 data = { 6 'gc': '613536708', 7 'st': '0', 8 'end': '20', 9 'sort': '0', 10 'bkn': '1803035696'} 11 # 传cookie 12 headers = {'cookie': 'pgv_pvi=1350350848; pgv_pvid=1363765446; tvfe_boss_uuid=43b682b311cc2b92; ts_uid=1928343394; RK=GeRBnIl4Z7; ptcz=e65265ce663abc1a6bb3903ed11b03e1466226104e618f763dab28275ed5594a; ts_refer=xui.ptlogin2.qq.com/cgi-bin/xlogin; _qpsvr_localtk=0.23303905772007627; pgv_si=s2086513664; uin=o0475355108; skey=@0FSTxuqKe; ptisp=cnc; p_uin=o0475355108; pt4_token=1XV3XsZQ3h67xObw-RjAWIuRJ6HV10gBRfI-FhEbKI0_; p_skey=aa90d83NdAXv*Ka8UEDv-pMATNRuWTsOM6MlSgVL4s8_; traceid=8a84116ec3; pgv_info=ssid=s8169433835; ts_last=qun.qq.com/member.html'} 13 # https请求加上verify=False就不会报错 14 r = requests.post(url, data=data, headers=headers, verify=False) 15 print(r.json())
{'ec': 0, 'svr_time': 1573567113, 'mems': [{'tags': '-1', 'uin':.......
三、 写日志模块
导入 nnlog模块
pip3.5.exe install nnlog
日志级别:(从低到高)
debug
info :重要事件
waring:出现非错误性的异常
error:运行时出现的错误,不需要立刻采取行动,但必须记录下来以备检测。
1 import nnlog 2 # log 的路径是一个不存在的文件,会为你主动创建; 参数2 保存5天; Debug是最低级别log 3 # debug4 # Warning 5 log = nnlog.Logger('booke_server.log', backCount=5, level='debug', when='S') 6 log.debug('debug级别')
2019-11-12 20:22:54,891 - E:/PycharmProjects/mjz/day6/写日志.py[line:6] - DEBUG: debug级别
yagmail 实现发邮件
yagmail 可以更简单的来实现自动发邮件功能。
4.1、安装
1 pip install yagmail
pip3.5.exe install yagmail
4.2、简单举例
1 import yagmail 2 3 username = '[email protected]' 4 password = '5tgb6yhn' 5 mail_server = 'smtp.163.com' 6 7 # 收件人 8 to = ['[email protected]'] 9 # 抄送 10 cc = ['[email protected]'] 11 12 # 链接邮箱服务器 13 yag = yagmail.SMTP(user=username, password=password, host=mail_server) 14 15 # 邮件标题 16 subject = 'Hello!' 17 18 # 邮箱正文 19 contents = '今天快乐?最近没鱼吃,要注意身体' 20 21 # 附件 22 attachments = r'E:\PycharmProjects\mjz\day6\写日志.py' 23 24 25 # 发送邮件 26 yag.send( 27 to=to, 28 cc=cc, 29 subject=subject, 30 contents=contents, 31 attachments=attachments)
4.3、给多个用户发送邮件
1 # 给多人发送邮件 2 to = ['[email protected]','[email protected]']
五、新Excel操作
安装 openpyxl模块
pip3.5.exe install openpyxl
5.1 写Excel
1 import openpyxl 2 3 book = openpyxl.Workbook() 4 5 sheet = book.active # 找到默认的sheet页 6 # sheet1 = book.get_sheet_by_name('sheet1') # 也可以指定sheet表 7 # 8 sheet.append(['id', 'username', 'password', 'error_count']) # 插入第一行 9 sheet.append([1, 'wdl', '123456', 0]) # 插入第二行 10 sheet.append([2, 'peo', 324]) 11 12 book.save('user.xlsx')
可以通过指定单元格输入
1 import openpyxl 2 3 book = openpyxl.Workbook() 4 5 sheet = book.active # 找到默认的sheet页 6 7 # 指定单元格写 8 sheet['a1']='userId' 9 sheet['b1'] = 'userName' 10 sheet.cell(3,1,'1') # 指定第3行,第一列 11 # 12 book.save('user.xlsx')
5.2 读Excel
1 import openpyxl 2 3 book = openpyxl.load_workbook('user.xlsx') 4 5 sheet = book.active 6 7 for row in sheet.rows: 8 for col in row: 9 print(col.value) # 获取每个单元值
userId userName None None 1 None
其他方法
1 print(sheet.cell(1,1).value) # 读取第一行,第一列 2 print(sheet['a1'].value) 3 print(list(sheet.rows)) # 获取所有行的数据 4 print(list(sheet.columns)) # 获取所有列的数据 5 print(sheet[1:10]) # 读取从第1行到第10行 6 sheet.delete_cols(1) # 删除第一行 7 sheet.delete_rows(1) # 删除第一列
六、Mock 接口开发
1、调用支付接口,可以模拟返回
2、给别人提供数据,这样就不用调用你的数据库
3、flask 是一个web开发框架
首先导入flask模块
pip3.5.exe install flask
6.1 第一个接口 /login
- server = flask.Flask(__name__) 把这个文件当做一个服务
- @server.route('/api/login', methods=['get']) 装置器,把它变成一个接口
- return json.dumps(d, ensure_ascii=False) ensure_ascii=False->返回值有中文的话转成中文
- server.run(host='192.168.1.14', port=8000, debug=True) 启动服务,一般都在最后面
1 import flask 2 import json 3 4 server = flask.Flask(__name__) 5 6 @server.route('/login') 7 def login(): 8 d = {'error_code':0,'msg':'登录成功'} 9 return json.dumps(d,ensure_ascii=False) 10 11 # 启动服务 12 server.run(host='192.168.1.14',port=8000,debug=True) 13 # http://127.0.0.1:8000/ 本地运行 14 #192.168.1.1:8000/api/login
连接成功
6.2 第二个接口 /api/pay
1 import flask 2 import json 3 4 server = flask.Flask(__name__) # 把这个python文件当做一个服务 5 6 # 第二个接口 7 @server.route('/api/pay') 8 def pay(): 9 d = {'error_code': 1, 'msg': '支付成功'} 10 return json.dumps(d, ensure_ascii=False) 11 12 # 启动服务 13 server.run(host='192.168.1.14', port=8000, debug=True)
{"msg": "支付成功", "error_code": 1}
6.3 第三个接口 /api/login
登录接口。设为get请求 @server.route('/api/login', methods=['get']) # methods=['post','get']
从请求里面获取参数 username = flask.request.values.get('username')
flask.request.json.get('') # 入参是json的话,用这个
1 import flask 2 import json 3 4 server = flask.Flask(__name__) # 把这个python文件当做一个服务 5 6 # 第一个接口 /login 7 @server.route('/api/login', methods=['get']) # methods=['post','get'] 8 def login(): 9 username = flask.request.values.get('username') # 从请求里面获取到参数的 10 password = flask.request.values.get('password') 11 # flask.request.is_json #是够请求为json,用这个 12 flask.request.json.get('') # 入参是json的话,用这个 13 14 # 启动服务 15 server.run(host='192.168.1.14', port=8000, debug=True)
{"msg": "登录成功", "username": "wdl", "error_code": 0, "password": "123456"}
6.4 第四个接口 /api/get_bill
导入 tools模块
1 import pymysql,hashlib 2 3 def op_mysql(sql,many=True): 4 db_info = {'user': 'jxz', 'password': '123456', 5 'host': '118.24.3.40', 'db': 'jxz', 'port': 3306, 'charset': 'utf8', 6 'autocommit': True} 7 conn = pymysql.connect(**db_info) # 建立连接 8 cur = conn.cursor(pymysql.cursors.DictCursor) # 游标 9 cur.execute(sql) # 执行sql语句,insert 、update 、delete 10 if many: 11 result = cur.fetchall() 12 else: 13 result = cur.fetchone() # {''} 14 cur.close() 15 conn.close() 16 return result 17 18 def md5(s,salt=''): 19 new_s = str(s) + salt 20 m = hashlib.md5(new_s.encode()) 21 return m.hexdigest()
获取数据库信息判断数据库是否存在
其中需通过tools.py模块执行sql语句
1 import flask 2 import json 3 import tools 4 5 server = flask.Flask(__name__) # 把这个python文件当做一个服务 6 7 # 第三个接口 8 @server.route('/api/get_bill') 9 def get_bill(): 10 table_list = ['app_myuser','czm'] 11 table_name = flask.request.values.get('table_name') 12 limit = flask.request.values.get('limit',50) # 默认50条 13 if table_name and table_name in table_list: 14 sql = 'select * from %s limit %s' %(table_name,limit) 15 result = tools.op_mysql(sql) 16 data = {'error_code':0,'msg':'成功','data':result} 17 else: 18 data = {'error_code':-1,'msg':'没有权限查询该表'} 19 return json.dumps(data, ensure_ascii=False) 20 21 # 启动服务 22 server.run(host='192.168.1.14', port=8000, debug=True) 23 # Method Not Allowed 24 # The method is not allowed for the requested URL.
http://192.168.1.14:8000/api/get_bill
http://192.168.1.14:8000/api/get_bill?table_name=app_myuser&limit=2