链家部分数据爬取
# import requests
# res = requests.get('https://sh.lianjia.com/ershoufang/')
# with open('lj.html','wb')as f:
# f.write(res.content)
#
# import re
# with open(r'lj.html','r',encoding='utf8')as f:
# data = f.read()
# res = re.findall('<a class="" href=".*?" target="_blank" data-log_index=".*?" data-el="ershoufang" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>',data)
# res1 = re.findall('<a href=".*?" target="_.*?" data-log_index=".*?" data-el="region">(.*?) </a>',data)
# res3 = re.findall('data-price=".*?"><span>(.*?)</span></div></div></div><div',data)
# res4 = zip(res,res1,res3)
#
# from openpyxl import Workbook,load_workbook
# wb = Workbook()
# wb1 = wb.create_sheet('白马会所',0)
#
# for i in res4:
# wb1.append(i)
# wb.save(r'111.xlsx')
#读取工作簿
from openpyxl import Workbook,load_workbook
wb = load_workbook(r'111.xlsx')
print(wb.sheetnames)
wb1 = wb['白马会所']
print(wb1.max_row) # 读取行数
print(wb1.max_column) # 读取列数
print(wb1['A1'].value) # 读取A1里的数据
print(wb1.cell(row= 1,column =2).value) # 第二种取值方式
for i in wb1.rows: # 一行一行读
print([j.value for j in i]) # 列表生成式
for i in wb1.columns: # 一行一行读
print([j.value for j in i]) # 列表生成式
random模块
random.random()# 随机生成0到1的小数
print(random.random())
random.randint(1,6)#随机生成1-6
print(random.randint(1,6))
random.choice(['jason','tony'])# 随机抽一个
rint(random.choice(['jason','tony']))
random.sample(['tony','jason','kiven','老六'],2)# 随机抽两个控制参数
print(random.sample(['tony','jason','kiven','老六'],2))
random.shuffle(l1) 随机讲列表打乱
l1 = [1,2,3,4,5,6,7,8]
random.shuffle(l1)
print(l1)
随机笔试题随机产生五位数验证码
import random
num = '' # 定义全局变量存字符
for i in range(5): # 循环五次
random_int = str(random.randint(0,9)) # 随机产生一个数字
random_lower = chr(random.randint(97,122)) # 随机产生一个小写字母
random_upper = chr(random.randint(65,90)) # 随机产生一个大写字母
res = random.choice([random_int,random_lower,random_upper]) # 随机挑选一个变量
num += res # 将所以数据整合
print(num)
'''封装成函数更加灵活'''
import random
def func(n):
num = '' # 定义全局变量存字符
for i in range(n): # 循环五次
random_int = str(random.randint(0,9)) # 随机产生一个数字
random_lower = chr(random.randint(97,122)) # 随机产生一个小写字母
random_upper = chr(random.randint(65,90)) # 随机产生一个大写字母
res = random.choice([random_int,random_lower,random_upper]) # 随机挑选一个变量
num += res # 将所以数据整合
return num
res = func(9)
print(res)
hashlib模块
'''1.什么是加密
将明文数据经过处理变成密文数据的过程
2.为什么要加密
不想让敏感的数据轻易的泄露
3.如何判断当前数据是否加密
一般情况下如果是一串数没有规则的字字母组合的一般都是加密之后的结果
4.加密算法
就是对明文数据采用的加密策略
不同的加密算法复杂度不一样,得出的结果不一样
通常情况下加密之后的结果越长说明采用的算法越复杂
常见加密算法
md5 sha系列 hmac base64'''
import hashlib
md5 = hashlib.md5()
md5.update(b'123') # 往里面添加数据数据必须是bytes类型
res = md5.hexdigest()
print(res)
sha = hashlib.sha384()
sha.update(b'123') # 数据需要用b括起来
res1 = sha.hexdigest()
print(res1)
加密模块补充
1.加密之后的结果一般情况下不能反解密
40bd001563085fc35165329ea1ff5c5ecbdbbeef
"""
所谓的反解密很多时候其实是偷换概念
提前假设别人的密码是什么 然后用各种算法算出对应的密文
之后构造对应关系 然后比对密文 最终映射明文
{'密文1':123,'密文2':321,...}
"""
2.只要明文数据是一样的那么采用相同的算法得出的密文肯定一样
import hashlib
sha = hashlib.sha1()
sha.update(b'123')# 数据需要用b括起来
sha.update(b'321')
sha.update(b'321')
res = sha.hexdigest()
print(res)
sha1 = hashlib.sha1()
sha1.update(b'123321321')
res1 = sha1.hexdigest()
print(res1)
3.加盐处理
import hashlib
sha = hashlib.sha1()
sha.update('公司设置的(干扰项)'.encode('utf8')) # 在加密处理出加其他数据
sha.update(b'321')
res = sha.hexdigest()
print(res) # d002caba8b5a154876cbb3ea3aee18dec63125d4
4.动态加盐
干扰项每次都不一样
获取当前时间获取截取一段用户名
5.加密实际应用
1.用户密码加密
注册存储密文 登录也是比对密文
2.文件安全性校验
正规的软件程序写完之后做一个内容的加密
网址提供软件文件记忆该文件内容对应的密文
用户下载完成后不直接运行 而是对下载的内容做加密
然后比对两次密文是否一致 如果一致表示文件没有被改
不一致则表示改程序有可能被植入病毒
3.大文件加密优化
程序文件100G
一般情况下读取100G内容然后全部加密 太慢
不对100G所有的内容加密 而是截取一部分加密
eg:每隔500M读取30bytes
读取文件的大小
os.path.getsize
加密实例
import hashlib
password = input('输入密码>>>:').strip()
sha = hashlib.sha1()
sha.update(b'123')
sha.update(password.encode('utf8')) # 转二进制用编码即可 默认编码
res = sha.hexdigest()
print(res) # d002caba8b5a154876cbb3ea3aee18dec63125d4
import hashlib
password = input('输入密码>>>:').strip()
sha = hashlib.sha1()
sha.update(b'123')
sha.update(bytes(password,'utf8')) # 转二进制用编码即可需要指定编码表
res = sha.hexdigest()
print(res)
subprocess模块
模拟计算机cmd命令窗口
import subprocess
cmd = input('输入执行的命令')
sub = subprocess.Popen(cmd,
shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE
)
# stdout执行命令之后正确的返回结果
print(sub.stdout.read().decode('gbk'))
# stderr执行命令之后错误的返回结果
print(sub.stderr.read().decode('gbk'))
日志模块
"""日志模块需要你写的代码很少 几乎都是CV"""
1.什么是日志
日志就类似于是历史记录
2.为什么要使用日志
为了记录事物发生的事实(史官)
3.如何使用日志
3.1.日志等级默认从第三等级开始记
import logging
logging.debug('debug等级') # 10
logging.info('info等级') # 20
logging.warning('warning等级') # 默认从warning级别开始记录日志 30
logging.error('error等级') # 40
logging.critical('critical等级') # 50
日志拆分
import logging
logger = logging.getLogger('购物车记录') #产出日志对象
hd = logging.StreamHandler() # 输出位置可以输出取文件
fm = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',) # 输入格式
logger.addHandler(hd) #绑定输出方式
hd.setFormatter(fm) # 输出方式绑定格式
logger.setLevel(10) # 定制输出等级
logger.debug('去哪') # 输出内容
字典配置 import logging import logging.config
定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
自定义文件路径
logfile_path = 'a3.log'
log配置字典
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
# '购物车记录': {
# 'handlers': ['default','console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
# 'level': 'WARNING',
# 'propagate': True, # 向上(更高level的logger)传递
# }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
logging.config.dictConfig(LOGGING_DIC)