python基础20 第三方模块

207 阅读6分钟

re模块

re模块使用

  • python中使用正则表达式,re模块是其中之一的一种选择
import re            # 开始使用re模块时先导入re模块
  • 导入模块后可以开始进行操作
      1. findall 通过正则表达式筛选出文本中所有符合条件的数据。
    res = re.findall('x', 'zxxxqeexxxwqesxs')
    print(res)           # 打印后以列表的形式展现
    
    • 输出结果 image.png
      1. finditer 与fine作用一致不过会将筛选的结果处理为迭代器对象节省内存。
    res = re.finditer('x', 'zxxxqeexxxwqesxs')
    print(res)           # 打印后输出的是一串位置信息
    
    • 输出结果 image.png
      1. search 通过正则表达式匹配到一个符合条件的内容就结束
    res = re.search('x', 'zxxxqeexxxwqesxs')
    print(res)
    print(res.group())    # group()用来提出分组截获的字符串
    
    • 输出结果 image.png
      1. match 通过正则表达式匹配到一个开头符合条件的内容结束,开头不符合就不在匹配
    res = re.match('x', 'zxxxqeexxxwqesxs')
    print(res)            # 内容开头为z
    res = re.match('x', 'xxxqeexxxwqesxs')
    print(res)            # 内容开头为x
    
    • 输出结果 image.png
      1. compile 提前准备好正则,后续可以反复使用·,减少代码冗余
    res1 = re.compile('x')
    print(re.findall(res1, 'qew4sdsdsaasx'))
    print(re.findall(res1, 'wdwqaxvdsbdbx'))
    print(re.findall(res1, 'xxwsdsxxxssdx'))
    
    • 输出结果 image.png

re模块补充

    1. re模块的分组
    • 分组前和分组后的对比
      • findall针对分组的正则表达式匹配到的结果会优先展示
      # 分组前
      res = re.findall('xxs', 'nsxxsnsxxsnsxxs')
      print(res)          # 输出结果:['xxs', 'xxs', 'xxs']
      # 分组后
      res = re.findall('x(x)s', 'nsxxsnsxxsnsxxs')
      print(res)          # 输出结果:['x', 'x', 'x']
      
      • findall使用(?:)也能取消分组的优先展示
      res = re.findall('x(?:x)s', 'nsxxsnsxxsnsxxs')
      print(res)          # 输出结果:['xxs', 'xxs', 'xxs']
      
    • 正则索引分组机制:组号从1开始,从左向右,组号依次加1
       # res = re.search('x(x)s', 'xxsxxsxxs')
       # print(res.group())     # xxs
       # print(res.group(0))    # xxs         索引0是整个正则匹配到的内容
       # print(res.group(1))    # x           索引1是分组里面匹配到的内容
      
    1. re模块的别名
    • 为分组起别名
      res = re.search('a(?P<id>b)(?P<name>c)', 'abcabcabcabc')
      print(res.group())       # abc
      print(res.group(1))      # b             索引到分组1为b
      print(res.group('id'))   # b             通过命名引用分组
      print(res.group('name')) # c
      

第三方模块下载

  • 第三方模块下载所需要知道的
      1. 第三方模块必须先下载才可以导入使用
      1. python下载第三方模块需要借助pip工具
      1. 下载命令为
      pip3.8 install 模块名      # 3.8是解释器版本
      
  • 下载中可能会遇到的问题
      1. 下载速度很慢
      # pip工具默认使用的是国外仓库地址进行模块的下载,所以速度很慢
      
      切换下载源:
          清华大学 :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/
          
      # 可以在cmd中打开python解释器
          输入指令:    pip3.8 install 模块名 -i 源地址 
          * 当然pycharm也提供了第三方模块下载的快捷方式
          * 也可以直接修改python解释器源文件
      
      1. 下载报错
      1. pip 工具版本过低,直接拷贝提示信息里面的更新命令即可
             python38 -m pip install -- upgrade pip 
      3. 网络波动,看见关键字   Read timed out
             多试几次,或者切换稳定的网络进行尝试
      5. 有些模块的下载使用需要配置特定的环境
             询问度娘
      
      1. 模块的版本
      pip3.8 install 模块名==版本号
      例:
      pip3.8 install django==1.11.11
      

网络爬虫

  • 什么是互联网?
    • 由全世界计算机连接到一起组成的网络
  • 互联网发明的目的?
    • 将接入互联网的计算机上面的数据进行共享
  • 上网的本质?
    • 基于互联网访问别人计算机上面的资源(开放资源访问的计算机我们一般叫做服务器)
  • 网络爬虫的本质?
    • 模拟计算机浏览器朝目标网址发送请求,返回数据并筛选
    • 只要是浏览器可以访问到的数据网络爬虫理论上都可以

爬虫实操

  • 爬取红牛分公司的数据
    http://www.redbull.com.cn/about/branch
    
# # 1.使用requests模块
# import requests
# # requests模块会朝目标地址发送网络请求获取响应数据  相当于在浏览器地址栏输入地址访问
# res = requests.get('http://www.redbull.com.cn/about/branch')
# print(res.content)      # 获取到的网页数据是bytes的类型的
# # print(res.text)         # 需要将字节bytes类型解码为文本类型(查看获取到的网页)
# # 2.可以提前将获取到的网页数据保存到文件,目的是为了避免每次执行程序都要发送网络请求
# with open(r'redrull.html', 'wb')as f:
#     f.write(res.content)
                      
                      
                      # 先将网页信息保存到文件,之后对文件操作就好不用再去网络获取请求了



# # 3.添加re模块,用到正则
import re
# 4.读取获得的网页数据
with open(r'redrull.html', 'r', encoding='utf8')as f:
    data = f.read()
    # print(data)
# 研究目标数据的特征,编写正则表达式进行筛选
# 5.获取所有分公司的名称
company_name_list = re.findall('<h2>(.*?)</h2>', data)
# print(company_name_list)
# 6.获取所有分公司邮编
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# 7.获取所有分公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>",data)
# 8.获取所有分公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>",data)
# 9.将上面获得的列表整合(拉链)
res = zip(company_name_list, company_email_list, company_phone_list, company_addr_list)
# 10.循环格式化输出获取到的列表
for i in res:
    print("""
     公司名称:%s
     公司地址:%s
     公司邮箱:%s
     公司电话:%s
     """ % i)
  • 输出结果 image.png

openpyxl模块

  • openpyxl模块主要用于操作excel表格,也是pandas底层操作表格的模块
  • 拓展:python中能够操作excel表格的模块
    • openpyxl 属于近几年流行的模块
      • openpyxl针对03版本之前的excel文件兼容性不好
    • xlwt,xlrd也可以操作excel表格
      • 兼容所有版本的excel文件 但是使用方式没有openpyxl简单
  • 模块的下载
pip3.8 install openpyxl
  • excel版本问题:
    03版本之前 excel文件的后缀名 .xls
    03版本之后 excel文件的后缀名 .xlsx
    如果是苹果电脑excel文件的后缀 .csv

openpyxl模块实操

### 1.创建excel表格
# 导入模块
from openpyxl import Workbook     # Workbook是创建表格的固定语法
wb = Workbook()
# 可以在excel表格里面创建多个工作簿
wb1 = wb.create_sheet('财务表')
wb2 = wb.create_sheet('工资单')
wb3 = wb.create_sheet('税收表')
    # 还可以二次修改工作簿的名字
    # wb1.title = '离职表'
    # 可以修改工作薄颜色
    # wb1.sheet_properties.tabColor = "00ffba"
    # # 保存excel文件
    # wb.save(r'111.xlsx')

### 2.写入数据
   # 写入的方式可以有多种:
# 第一种:以行列的字母组合写入
wb1['B1'] = '税收'
# 第二种:使用行列名指定写入
wb1.cell(row=2, column=1, value='销售部')
# 第三种:(批量写入)
wb1.append(['部门', '税收', '盈利额', '净收入'])
wb1.append(['技术部', '66666', '520014', '400000'])
wb1.append([None, '233', '242342', '240000'])
# wb1.append([, '', '', ''])
# wb1.append(['', '', ])
# wb1.append(['', ''])
         # 批量写入要注意,每栏数据一一都要对齐。
         # 没有,缺失的数据用None,或者引号先占位代替,否则或报错
# 还可以进行求和
wb1['D7'] = '=sum(D4:D5)'

# 保存excel文件
wb.save(r'111.xlsx')
  • 文件执行完毕后xslx内的结果 image.png

  • 批量写入缺失的报错结果

    image.png

作业

  • 尝试将红牛分公司数据保存到excel表格中
import re
from openpyxl import Workbook
with open(r'redrull.html', 'r', encoding='utf8')as f:
    data = f.read()
company_name_list = re.findall('<h2>(.*?)</h2>', data)
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>",data)
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>",data)
res = zip(company_name_list, company_email_list, company_phone_list, company_addr_list)
wb = Workbook()
wb1 = wb.create_sheet('红牛')
wb1.append(['公司名称', '公司邮箱', '公司电话', '公司地址'])
for i in res:
    wb1.append(i)
wb.save(r'redrull.xlsx')
  • 结果: image.png