openpyxl模块,爬虫,pandas模块,random模块,hashlib模块,subprocess模块,日志模块

知识点1 openpyxl模块知识点补充

1.读取数据
  • 1.1先创建一个excel表格
from openpyxl import Workbook

Wb = Workbook()

wb1 = Wb.create_sheet('工资表', 0)
wb1.append(['username', '绩效工资', '奖金'])
wb1.append(['jason', 10000, 10000])
wb1.append(['egon', 20000, 20000])
wb1.append(['jack', 30000, 30000])

Wb.save('company.xlsx')
  • 1.2查看excel表格中的数据
from openpyxl import load_workbook

wb = load_workbook(r'company.xlsx', data_only=True)

# 1.查看excel中的所有工作簿名称
print(wb.sheetnames)  # ['工资表', 'Sheet']

# 2.用一个变量绑定工作簿
wb1 = wb['工资表']

# 3.查看使用的最大行数
print(wb1.max_row)  # 4

# 4.查看使用的最大列数
print(wb1.max_column)  # 3
  • 1.3读取数据
# 5.取值方式1
print(wb1['B4'].value)  # 30000
# 6.取值方式2
print(wb1.cell(row=2,column=2).value)  # 10000

# 7.以行的方式取值
for i in wb1.rows:
    print([j.value for j in i])
"""
['jason', 10000, 10000]
['egon', 20000, 20000]
['jack', 30000, 30000]
"""


# 8.以行的方式取值
for i in wb1.columns:
    print([j.value for j in i])
"""
['username', 'jason', 'egon', 'jack']
['绩效工资', 10000, 20000, 30000]
['奖金', 10000, 20000, 30000]
"""
  • 1.4总结:openpyxl不擅长读数据 所以有一些模块优化了读取的方式,pandas模块

知识点2 pandas模块

  • 1.导入和创建excel表格
import pandas

dic = {
    'name': ['jaosn', 'egon', 'kevin', 'jack'],
    'age': [18, 81, 19, 20],
    'hobby': ['think', 'talk', 'sing', 'sleep']
}

df = pandas.DataFrame(dic)
df.to_excel(r't.xlsx')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kzw6ljta-1658394009836)(C:\Users\Administrator\Desktop\学期笔记库\day26笔记总结.assets\t.png)]

知识点3 爬取某家二手房信息

import requests

# res = requests.get('https://sh.lianjia.com/ershoufang/')
# # 仅仅只能获取一页数据 爬虫知识点也是很多的 没你想的那么简单
# with open(r'lj.html','wb') as f:
#     f.write(res.content)

with open(r'lj.html', 'r', encoding='utf8') as f:
    data = f.read()
# 1.研究目标数据 筛选
home_title_list = re.findall(
    '<a class="" href=".*?" target="_blank" data-log_index=".*?"  data-el="ershoufang" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>',
    data
)
home_name_list = re.findall(
    '<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>',
    data
)
home_addr_list = re.findall(
    '   -  <a href=".*?" target="_blank">(.*?)</a>',
    data
)
home_info_list = re.findall(
    '<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>',
    data
)
home_others_list = re.findall(
    '<div class="followInfo"><span class="starIcon"></span>(.*?)</div>',
    data
)
home_total_price = re.findall(
    '<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>',
    data
)
home_unit_price = re.findall(
    '<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>',
    data
)
d = {
    '房屋标题':home_title_list,
    '小区名称':home_name_list,
    '所在街道':home_addr_list,
    '具体信息':home_info_list,
    '其他信息':home_others_list,
    '房屋总价':home_total_price,
    '房屋单价':home_unit_price
}
df = pandas.DataFrame(d)
df.to_excel(r'333.xlsx')

知识点4 random模块

1.方法
import random


# 1.随机获取0到1之间的小数
res1 = random.random()
print(res1)  # 0.7375892099692898

# 2.随机获取1到10(包含)之间的任意一个整数
res2 = random.randint(1, 10)
print(res2)

# 3.随机选取1个
res3 = random.choice(['面包', '香蕉', '牛奶'])
print(res3)

# 4.随机抽样,可以自定义抽取个数
res4 = random.sample(['阿熠', '阿豪', '奇奇', '老六', '老八'], 3)
print(res4)

# 5.随机打乱一组数据
l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A', '大王', '小王', '中王']
random.shuffle(l1)
print(l1)
2.搜狗python工程师面试题
  • 题目: 编写python代码 产生五位随机验证码(数字、小写字母、大写字母)

  • 解题阶段一:功能实现

code = ''  # 定义全局变量用于存储所有的验证码

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))  # 随机产生一个大写字母
    # 从上述三个数据值中随机挑选一个作为验证码的一位数据
    temp = random.choice([random_int, random_lower, random_upper])
    code += temp  # 拼接字符串
print(code)
  • 解题阶段二:函数封装
def get_code(n):
    code = ''  # 定义全局变量用于存储所有的验证码
    # 编写python代码 产生五位随机验证码(数字、小写字母、大写字母)
    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))  # 随机产生一个大写字母
        # 从上述三个数据值中随机挑选一个作为验证码的一位数据
        temp = random.choice([random_int, random_lower, random_upper])
        code += temp  # 拼接字符串
    return code
res = get_code(4)
print(res)
res1 = get_code(10)
print(res1)

知识点5 hashlib模块

  • 1.什么是加密?

  • 将能看懂的明文数据变成看不懂的密文数据的过程

  • 2.为什么要加密数据?

  • 为了让一些敏感的数据不被轻易泄露

  • 3.判断密文数据的方法?

  • 一般情况下如果是由一串无规律的数字,字母,特殊符号组成的数据就是密文数据

  • 4.什么是加密算法?

  • 就是对明文数据加密的过程

  • 不同的加密算法复杂度不一样,得到的密文的长度也不一样,通常情况下密文长度越长,相应的加密算法就越复杂

  • 5.常见的加密算法都有哪些?

  • md5 sha系列 hmac base64

  • 6.代码实现加密过程

import hashlib

md5 = hashlib.md5()  # 选择md5加密算法作为数据的加密策略
md5.update(b'123')  # 往里面添加明文数据 数据必须是bytes类型
res = md5.hexdigest()  # 获取加密之后的结果
print(res)  # 202cb962ac59075b964b07152d234b70
  • 7.加密算法能不能被反解?

  • 加密之后的结果一般情况下不能反解密,所谓的反解密很多时候其实是偷换概念 ,提前假设别人的密码是什么 然后用各种算法算出对应的密文,之后构造对应关系 然后比对密文 最终映射明文

  • 8.只要明文数据是一样的那么采用相同的算法得出的密文肯定一样

md5 = hashlib.md5()  # 选择md5加密算法作为数据的加密策略
# md5.update(b'123')  # 往里面添加明文数据 数据必须是bytes类型
# md5.update(b'hello')  # 往里面添加明文数据 数据必须是bytes类型
# md5.update(b'jason')  # 往里面添加明文数据 数据必须是bytes类型
# res = md5.hexdigest()
# print(res)  # 31b9a81dc788368469ee4b78877eb1eb
md5.update(b'123hellojason')
res = md5.hexdigest()
print(res)    # 31b9a81dc788368469ee4b78877eb1eb
  • 9.加盐处理
password = input('password>>>:').strip()
md5.update('公司设置的盐(干扰项)'.encode('utf8'))
md5.update(password.encode('utf8'))
res = md5.hexdigest()
print(res)  # 78bf5bd131c520b54168206d75f9f9be
  • 10.动态加盐(salt)

  • 干扰项每次都不一样 , eg:每次获取当前时间 每个用户用户名截取一段

  • 11.加密实际应用场景

    • 1.用户密码加密
      注册存储密文 登录也是比对密文
    • 2.文件安全性校验
      正规的软件程序写完之后做一个内容的加密
      网址提供软件文件记忆该文件内容对应的密文
      用户下载完成后不直接运行 而是对下载的内容做加密
      然后比对两次密文是否一致 如果一致表示文件没有被改
      不一致则表示改程序有可能被植入病毒
    • 3.大文件加密优化
      程序文件100G
      一般情况下读取100G内容然后全部加密 太慢
      不对100G所有的内容加密 而是截取一部分加密
      eg:每隔500M读取30bytes

知识点6 subprocess模块

  • 代码实现
import subprocess

cmd = input('请输入您的指令>>>:').strip()
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'))

知识点7 日志模块

1.日志模块的基本介绍
  • 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

# 3.2.基本使用
import logging

file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler,],
level=logging.ERROR
)

logging.error('我不好!!!')
2.日志模块组成部分
  • 我们在记录日志的时候 不需要向上述一样全部自己写 过于繁琐, 所以该模块提供了固定的配置字典直接调用即可
import logging

# 1.日志的产生(准备原材料)        logger对象
logger = logging.getLogger('购物车记录')
# 2.日志的过滤(剔除不良品)        filter对象>>>:可以忽略 不用使用
# 3.日志的产出(成品)             handler对象
hd1 = logging.FileHandler('a1.log', encoding='utf-8')  # 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8')  # 输出到文件中
hd3 = logging.StreamHandler()  # 输出到终端
# 4.日志的格式(包装)             format对象
fm1 = logging.Formatter(
        fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
        fmt='%(asctime)s - %(name)s:  %(message)s',
        datefmt='%Y-%m-%d',
)
# 5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 7.设置日志等级
logger.setLevel(10)  # debug
# 8.记录日志
logger.debug('写了半天 好累啊 好热啊')

3.日志配置字典
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配置字典
LOGGING_DIC = {
    '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)  # 自动加载字典中的配置
# logger1 = logging.getLogger('购物车记录')
# logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
# logger1 = logging.getLogger('注册记录')
# logger1.debug('jason注册成功')
logger1 = logging.getLogger('红浪漫顾客消费记录')
logger1.debug('慢男 猛男 骚男')
4.实战应用
# 按照软件开发目录规范编写使用
日志字典数据应该放在哪个py文件内
	字典数据是日志模块固定的配置 写完一次之后几乎都不需要动
  它属于配置文件
  """配置文件中变量名推荐全大写"""
该案例能够带你搞明白软件开发目录规范中所有py文件的真正作用

def get_logger(msg):
    # 记录日志
    logging.config.dictConfig(settings.LOGGING_DIC)  # 自动加载字典中的配置
    logger1 = logging.getLogger(msg)
    # logger1.debug(f'{username}注册成功')  # 这里让用户自己写更好
    return logger1

作业

爬取多页数据

import re
import pandas

import requests

for i in range(1, 101):
    data1 = f'https://sh.lianjia.com/ershoufang/pg{i}/'
    res = requests.get(data1)
    
    with open(r'lj.html', 'ab') as f:
        f.write(res.content)

with open(r'lj.html', 'r', encoding='utf8') as f:
    data = f.read()
# 1.研究目标数据 筛选
home_title_list = re.findall(
    '<a class="" href=".*?" target="_blank" data-log_index=".*?"  data-el="ershoufang" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>',
    data
)
home_name_list = re.findall(
    '<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>',
    data
)
home_addr_list = re.findall(
    '   -  <a href=".*?" target="_blank">(.*?)</a>',
    data
)
home_info_list = re.findall(
    '<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>',
    data
)
home_others_list = re.findall(
    '<div class="followInfo"><span class="starIcon"></span>(.*?)</div>',
    data
)
home_total_price = re.findall(
    '<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>',
    data
)
home_unit_price = re.findall(
    '<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>',
    data
)
d = {
    '房屋标题':home_title_list,
    '小区名称':home_name_list,
    '所在街道':home_addr_list,
    '具体信息':home_info_list,
    '其他信息':home_others_list,
    '房屋总价':home_total_price,
    '房屋单价':home_unit_price
}
df = pandas.DataFrame(d)
df.to_excel(r'333.xlsx')


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值