pei_blog

导航

 

一、内容大纲

 

 

二、作业内容

1、下载qq头像

import requests
import const
import os
BKN=778166273
header={"cookie": "RK=h6RBy2WqQM; ptcz=20a23ea6b2deb099287624b4e452bb0a9419dc427617d8344aa79fae1417d6eb; ptui_loginuin=1164019076@qq.com; _qpsvr_localtk=0.370802985711004; uin=o1164019076; skey=@FDnRkT1J8; p_uin=o1164019076; pt4_token=l40iuCXiwy*3soCPFYwGYBfMcAw3dSTwZg6ig3wQ7J4_; p_skey=fsRErZXxH1UFEOpZroP3YgSoU1Dpe1h1r4UeIzvI8-M_; traceid=9d1382fe6f"}
def get_qq(gc):
all_member={}
st=0
end=40
while True:
data={"gc": gc,"st": st,"end": end,"sort": 0,"bkn":BKN }
r=requests.post(const.QQ_URL,data,headers=header)
mems=r.json().get("mems")
if mems:
for mem in mems:
qq=mem.get("uin")
card=mem.get("card") if mem.get("card") else mem.get("nick")
all_member[qq]=card
else:

return all_member
st=st+40+1
end=st+40

def download_file(url,file_name):
try:
r=requests.get(url)
except:
print("下载出错,url为%s"%url)
else:
with open(file_name,"wb") as fw:
print("%s下载完成"%file_name)
fw.write(r.content)
def main(gc):
gc=str(gc)
all_number=get_qq(gc)
print(all_number)
if not os.path.exists(gc):
os.makedirs(gc)
os.chdir(gc)
for qq,file_name in all_number.items():
url=const.MIAGE_URL %qq
print(url)
try:
file_name=file_name +".jpg"
download_file(url, file_name)
except:
file_name = str(qq) + ".jpg"
download_file(url,file_name)
print("下载完成")

if __name__=="__main__":
main(117545216)

2、发送新闻消息到钉钉

import  requests,const,utlis,json,time
# 获取新闻
def get_news(page):
data={"page":page,"count":const.count_limit}
print("开始获取新闻")
r=requests.post(const.NEWS_URL,data)
new_list=r.json().get("result")
print("获取完成,共获取到%s条"%len(new_list))
return new_list
# 存到redis里面
def save_news_to_redis(news_list:list):
r=utlis.get_redis()
for news in news_list:
news["status"]=0
news=json.dumps(news)
r.lpush(const.news_list_key,news)
print("%s保存到redis"%news)
print("新闻保存完成")
#格式化消息
def format_msg(news):
msg="""
新闻标题:{title}
新闻链接:{path}
新闻时间:{passtime}
""".format_map(news)
return msg
# 消息发送
def send_news():
r=utlis.get_redis()
index=r.get(const.news_index_key)
if not index or int(index)>=const.count_limit:
index=0
page=int(r.get(const.news_page_key)) if r.get(const.news_page_key) else 1
news_list=get_news(page)
save_news_to_redis(news_list)
r.set(const.news_page_key,page+1)
news=r.lindex(const.news_list_key,index)
news=json.loads(news)
msg=format_msg(news)
utlis.send_dd_msg(msg)
news["status"]=1
r.lset(const.news_list_key, index,json.dumps(news))
r.set(const.news_index_key,int(index)+1)
print("消息发送完成")
if __name__=="__main__":
while True:
send_news()
time.sleep(10)

3、扫描用户信息表,发送错误次数大于5的用户到钉钉以及邮件

import utlis,const,requests,time
import tools
def get_error_user():
print("开始获取错误用户")
r=utlis.get_redis()
error_user_id=tuple(r.lrange(const.error_user_id_key,0,-1))
if error_user_id:
sql="select * from lxp2 where err_count>5 and id not in %s"%error_user_id
else:
sql="select * from lxp2 where err_count>5 "
data =tools.op_mysql(sql,data_type=2)
print(data)
return data
# 格式化消息
def format_msg(user_list):
all_msg=""
user_ids=[]
for user in user_list:
msg="用户id:%s 用户名:%s\n"%(user.get("id"),user.get("username"))
all_msg+=msg
user_ids.append(user.get("id"))
print(all_msg)
print(user_ids)
return all_msg,user_ids

def send_msg():
r=utlis.get_redis()
error_user=get_error_user()
if not error_user:
utlis.send_dd_msg("当前没有错误次数大于5的用户")
utlis.send_mail("错误用户提醒","当前没有错误用户大于5的用户")
else:
msg,user_ids=format_msg(error_user)
r.lpush(const.error_user_id_key,*user_ids)
utlis.send_mail("错误用户提醒","%s"%msg)
utlis.send_dd_msg(msg)
def clear_error():
sql="update lxp2 set err_count=0"
tools.op_mysql(sql)
r=utlis.get_redis()
r.delete(const.error_user_id_key)

if __name__ =="__main__":
while True:
send_msg()
clear_error()
time.sleep(20)

4、水平拆分表

import utlis,tools
# 创建分表
def create_table(src_table_name,number=8):
print("开始创建分表")
for i in range(number):
new_table_name="%s_%s"%(src_table_name,i)
sql="create table if not exists %s like %s"%(new_table_name,src_table_name)
tools.op_mysql(sql)
print("创建分表完成")
#迁移数据
def insert_data(src_table_name,number=8):
# 获取所有数据
sql="select * from %s"%src_table_name
all_data= tools.op_mysql(sql,data_type=2)
for data in all_data:
table_index=int(data.get("phone")) %number
table="%s_%s"%(src_table_name,table_index)
sql='insert into %s select " ",nick,gender,birthday,email,phone,password,qq,address,status,pay_status,avatar, register_time,last_login_ip,last_login_time" \
"from %s where phone="%s";' %(table,src_table_name,data.get("phone"))
tools.op_mysql(sql)
print("%s数据迁移完成"%data.get("nike"))
print("所有数据迁移完成")

if __name__ =="__main__":
create_table("lxp_user30")
insert_data("lxp_user30")


5、拆分验证

import tools
def check_data(src_table_name,number=8):
sql="select * from %s" %src_table_name
all_data=tools.op_mysql(sql,data_type=2)
for data in all_data:
data.pop("id")
phone=data.get("phone")
table_index=int(phone)% number
new_table_name="%s_%s"%(src_table_name,table_index)
new_sql="select * from %s where phone=%s"%(new_table_name,phone)
new_data=tools.op_mysql(new_sql,all=False,data_type=2)
if not new_data:
print("迁移出错,%s数据丢失"%phone)
else:
new_data.pop("id")
result=data.items()^ new_data.items()
if result:
print("迁移出错,错误数 据为%s,错误信息为%s"%(phone,result))




if __name__=="__main__":
check_data("lxp_user30")

三、类

1、类的定义

class Car:

2、实例化

car1 = Car("红色","小黑汽车") #实例化

3、析构函数:类在实例化的时候,会自动执行的函数

def __init__(self,color,name):
print("生产了一个汽车!")

4、私有变量,私有方法:在变量或者方法前面加上"__",只能在类里面调用 除了类就不能被调用

    def __close(self):
self.__cur.close()
self.__connect.close()

 

5、mysql封装

import traceback
# 私有化: 私有变量,私有方法:只能在类里面调用
import pymysql
from day7_homework.config import mysql_info
class MySQl:
def __init__(self,mysql_info,data_type=1):
self.mysql_info=mysql_info
self.data_type=data_type
self.__connect_status=False
# 自动执行
self.__connect()
# 私有化 在前面添加两个下划线
def __connect(self):
print("开始链接数据库")
try:
self.__connect= pymysql.Connect(**self.mysql_info)
except:
print("数据库链接出错,错误信息为%s"%traceback.format_exc())
# 抛出异常 不在往下执行
raise Exception("数据库链接出错")
print("链接成功")
self.__connect_status=True
if self.data_type !=1:
self.__cur=self.__connect.cursor(pymysql.cursors.DictCursor)
else:
self.__cur=self.__connect.cursor()
def execute(self,sql):
try:
self.__cur.execute(sql)
except:
print("sql执行不正确,sql语句是%s"%sql)
else:
return True def fetchone(self,sql): if self.execute(sql):
return self.__cur.fetchone()
def fetchall(self,sql):
if self.execute(sql):
return self.__cur.fetchall()
def __close(self):
self.__cur.close()
self.__connect.close()

def __del__(self):
self.__close()
print("mysql链接关闭")

if __name__=="__main__":
my=MySQl()

四、日志:logger

1、引用

from loguru import logger

2、日志级别

# 日志级别
logger.debug("aaa") # 调试 详细信息 级别最低
logger.info(111) # 简单提示信息等
logger.warning(11) # 警告,
logger.error(1)

五、redis集群:rediscluster

1、redis集群

import rediscluster,redis
startup_nodes=[
{"host":"xxx.xx.x.xx","port":6379,"password":"HK139bc&*","db":"4"}
]
r = rediscluster.RedisCluster(startup_nodes=startup_nodes, decode_responses=True)

2、创建文件夹:名字前面带冒号的 冒号前面就是文件夹

r.set("lxp:user","lxp1")
print(r.get("lxp:user"))

 

posted on 2021-06-30 22:39  pei_blog  阅读(94)  评论(0)    收藏  举报