总结

一.常用内置模块

1.正则表达式

主要是通过一些特殊的符号组合成特殊含义去字符串中筛选符合条件的结果

1)字符组

1.字符组默认匹配方式是:一个一个的匹配(一个符号一次匹配一个内容)
2.字符组内所有的数据默认都是或的关系

字符组简写 字符组全称 含义
[0-9] [0123456789] 匹配0~9的任意一个数字
[A-Z] [ABC...XYZ] 匹配A~Z的任意一个字母
[a-z] [abc...xyz] 匹配a~z的任意一个字母
[0-9a-zA-Z] 匹配0~9任意数字、大小写任意字母

2)特殊符号

1.字符组默认匹配方式是:一个一个的匹配(一个符号一次匹配一个内容)

特殊符号 含义
. 匹配处换行符外的任意字符
\w 匹配数字、字母、下划线
\W 匹配非数字、非字母、非下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
^数据$ 两者组合使用可以精确限制匹配的内容
a|b 匹配a或b
() 给正则表达式分组,不影响表达式的匹配
[ ] 字符组内部填写的内容默认都是或的关系
[^] 取反操作 匹配除了字符组内填写的其他字符

3)量词

1.正则表达式默认情况下都是贪婪匹配(尽可能多的匹配)
2.量词不能单独使用,必须结合表达式一起,且只能影响左边第一个表达式

量词 含义
***** 匹配0次或多次 默认是多次
+ 匹配1次或多次 默认是多次
匹配0次或1次 默认是1次
{n} 重复n次 写几次就是几次
{n,} 重复n次或更多次 默认是多次
{n,m} 重复n到m次 默认是m次

4)贪婪匹配和非贪婪匹配

所有量词都是贪婪匹配,非贪婪匹配要在量词后加问号

5)转义符

\n      匹配的是换行符
\\n     匹配的是文本\n
\\\\n   匹配的是文本\\n

2.re模块(正则模块)

1)findall

查找所有符合正则表达式要求的数据 结果是一个列表

2)finditer

查找所有符合正则表达式要求的数据 结果是一个迭代器对象

3)search

匹配到一个符合条件的数据就立刻结束

4)match

从头开始匹配 如果头不符合就结束

5)compile

提前准备好正则,后续可以反复使用

6)split

分割

7)sub、subn

替换

8)分组优先展示

findall分组优先展示括号内正则表达式匹配到的内容

?:可取消分组优先展示

9)分组别名

(?P<可起别名>)

二.网络爬虫简介

爬虫就是编写代码模拟计算机浏览器向目标网址发送请求获取数据并筛选出想要的数据

三.第三方模块

1.第三方模块简介

第三方模块就是别人写好的需要下载的模块

2.第三方模块下载

1)cmd终端下载

pip后跟3.8 可在不同版本解释器下去下载对应模块

1.基础句式
pip install 模块名

2.切换镜像源句式
pip install 模块名 -i 镜像源地址

3.下载指定版本模块
pip install 模块名==版本号 -i 镜像源地址

2)pycharm提供下载方式

有多种,1.在代码中协商模块后有一个灯泡,点击后选择下载。

2.File>>Settings>>对应项目中>>python Interpreter>>添加下载

3.第三方模块常见报错

1)报错并有警告信息

eg:
    WARNING: You are using pip version 20.2.1;

#这种是因为pip工具版本过低,拷贝后面的执行命令更新即可:
python38 -m pip install --upgrade pip

2)报错并有Time out关键字

网不好

3)报错没有关键字

百度搜

4)下载速度慢

切换镜像源

"""
清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学:http://pypi.hustunique.com/
豆瓣源:http://pypi.douban.com/simple/
腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/
"""

4.第三方模块—request模块(网络爬虫模块)

其实就是模仿浏览器发送网络请求的模块

import request

res=requests.get('http://www.baidu.com')
#print(res.content) #获取bytes二进制类型的网页数据
print(res.text) #获取字符串类型的网页数据

5.第三方模块—openpyxl模块(自动化办公)

当excel文件打开时不能做任何修改

不要忘记保存!!!

1)创建excel文件

from openpyxl import Workbook  # 导入模块,Workbook是用来创建文件的

# 创建一个excel文件
wb = Workbook()
# 在excel文件中创建工作薄
wb1 = wb.create_sheet('学生名单')
# 在excel文件中创建工作薄 并 让该工作薄位置在最前面
wb2 = wb.create_sheet('老师名单', 0)
# 修改工作簿名称
wb2.title = '学生成绩单'
# 修改工作薄颜色
wb2.sheet_properties.tabColor = '1072BA'

"""
这里放写入数据的操作
"""

# 保存该excel文件
wb.save(r'学生信息.xlsx')

2)在excel工作簿中写入数据

1)第一种写入方式:
wb2['A1'] = '张三' # 在A1单元格中写入'张三'

2)第二种写入方式:
wb2.cell(row=2,column=1,value='李四') # 在单元格第2行,第1列,写入'李四'

3)第三种写入方式:(批量写入)
#在单元格中最上方分别写入数据(如果有数据则在数据下一行写入)
wb2.append(['姓名','年龄','成绩'])
wb2.append(['王五','18','90'])

3)在excel工作薄中读取数据操作

openpyxl读写分离,读采用的是from openpyxl import load_workbook

openpyxl一般公司有专门的人负责读, 我们只负责写

# 1.查看文件中所有工作簿名称
print(wb.sheetnames)  # ['第一个sheet页', '第二个sheet页', 'Sheet']

# 2.1.查看某工作簿中有几行数据,空数据默认为1行
print(wb1.max_row)  # 3
# 2.2查看某工作簿中有几列数据,空数据默认为1列
print(wb1.max_column)  # 2

# 3.1.读取wb1中A1单元格的数据
print(wb1['A1'].value)  # 姓名
# 3.2.读取wb1中第2行第1列的数据
print(wb1.cell(row=2,column=1).value)  # jason

# 4.读取整行数据并组成列表
for i in wb1.rows:
    print([j.value for j in i])  # ['姓名', '年龄'] ['jason', '18']  ['torry', '20']

# 5.读取整列数据并组成列表
for i in wb1.columns:
    print([j.value for j in i])  # ['姓名', 'jason', 'torry']  ['年龄', '18', '20']

6.第三方模块—pandas模块

封装了openpyxl模块的模块,主要用来操作表格。爬虫爬到的数据用pandas可以保存在表格中

import pandas

d1 = {
    '公司名称': ['腾讯', '飞讯', '跑讯'],
    '公司地址': ['上海', '杭州', '深圳'],
}

df = pandas.DataFrame(d1)  # 将字典转成pandas里面的DataFrame数据结构
df.to_excel(r'公司信息.xlsx')  # 保存为excel文件

7.第三方模块—hashlib加密模块

1)加密的含义

加密就是把明文数据经过处理编变成密文数据,这个过程就叫加密

2)常见的加密算法

md5、sha系列、hmac、base64

3)实际应用

import hashlib
# 获取用户输入密码
password = input('输入密码:').strip()
# 选择加密算法
md5 = hashlib.md5()
# 传入明文数据(传入的必须是二进制)
md5.update(password.encode('utf8'))
# 获取加密密文
res = md5.hexdigest()
print(res)

4)加盐处理

就是给密码加一些干扰项让密码更不容易被破解。

动态加盐就是放一些随机变化的干扰项,如时间、用户名等

8.第三方模块—subprocess模块

模拟操作系统终端 执行操作系统命令并获取结果

import subprocess

cmd = input('输入cmd指令:').strip()
res = subprocess.Popen(
    cmd,  # 获取用户要执行的指令
    shell=True,  # 固定配置
    stdin=subprocess.PIPE,  # 输入指令
    stdout=subprocess.PIPE,  # 输出结果
)
# 获取操作系统执行命令后的正确结果
print('正确结果:', res.stdout.read().decode('gbk'))
# 获取操作系统执行命令后的错误结果
print('错误结果:', res.stderr)

9.第三方模块—logging日志模块

1)日志的五个级别

import logging

logging.debug('debug等级')  # 10 默认不显示
logging.info('info等级')  # 20 默认不显示
logging.warning('警告的')  # 30 默认从warning级别开始记录
logging.error('已经发生的')  # 40
logging.critical('灾难性的')  # 50

2)日志的四个组成部分

1.loger对象:产生日志
2.filter对象:过滤日志(基本不用,因为产生日志时就可以控制想要的日志内容)
3.handler对象:输出对象
4.format对象:日志格式

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'
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('慢男 猛男 骚男')
posted @ 2022-10-30 22:11  梅梅小可爱  阅读(27)  评论(0)    收藏  举报