第三方模块

  今日内容

  • re模块
  • 网络爬虫的简介
  • pip源
  • openpyxl模块

re模块

在之前我们说讲的正则表达式之后

我们该如何在python表示呢?

在python解释器中想要表示正则表达式 re模块是其中之一

1. findall()

import re
#
res = re.findall('[0-9]', 'find123all123')
print(res)  # ['1', '2', '3', '1', '2', '3']
res1 = re.findall('a', 'findallabsabs')
print(res1)  # ['a', 'a', 'a']

# findall可以通过正则表达式筛选文本中所有符合条件的数据

2. finditer()

res2 = re.finditer('[0-9]', 'find123iter123')
print(res2)  # <callable_iterator object at 0x000001EF611894E0> 会生成一个迭代器
print(res2.__next__())  # <_sre.SRE_Match object; span=(4, 5), match='1'>
print(res2.__next__())  # <_sre.SRE_Match object; span=(5, 6), match='2'>
print(res2.__next__())  # <_sre.SRE_Match object; span=(6, 7), match='3'>
print(res2.__next__())  # <_sre.SRE_Match object; span=(11, 12), match='1'>
print(res2.__next__())  # <_sre.SRE_Match object; span=(12, 13), match='2'>
print(res2.__next__())  # <_sre.SRE_Match object; span=(13, 14), match='3'>
# finditer与findall作用是一致的 只不过finditer生成的是一个迭代器能够节省内存空间

3.search()

res3 = re.search('[0-9]', 'find123iter123')
print(res3)  # <_sre.SRE_Match object; span=(4, 5), match='1'>
print(res3.group())  # 1
res4 = re.search('a', 'findallabsabs')
print(res4)  # <_sre.SRE_Match object; span=(4, 5), match='a'>
print(res4.group())  # a

# search就是通过正则表达式匹配到一个符合条件的数据就会结束匹配 还可以通过group取值

4.match()

res5 = re.match('[0-9]', 'find123iter123')
print(res5)  # None 没有结果
res6 = re.match('a', 'findallabsabs')
print(res6)  # # None 没有结果

res7 = re.match('[0-9]', '23find')
print(res7)  # <_sre.SRE_Match object; span=(0, 1), match='2'>
print(res7.group())  # 2
res8 = re.match('a', 'aafindallabsabs')
print(res8)  # <_sre.SRE_Match object; span=(0, 1), match='a'>
print(res8.group())  # 2

'''
因为match通过正则表达式之匹配开头 开头有就匹配没有就返回None 然后结束
'''

5.complie()

r = re.compile('[0-9]')

r1 = re.findall(r, 'find123iter123' )
print(r1)  # ['1', '2', '3', '1', '2', '3']
'''
compile就是可以提前把正则表达式写好
然后后面要用到的时候只要调用他的变量名即可
可以减少代码冗余
'''

 

 

re模块的其他用法

1.分组

import re

res = re.findall('abc', 'abcabcabcabcacbacb')
print(res)  # ['abc', 'abc', 'abc', 'abc']

res = re.findall('a(b)c', 'abcabcabcabcacbacb')
print(res)  # ['b', 'b', 'b', 'b']

# findall可以针对分组的正则表达式匹配的结果 优先展示

res = re.findall('a(?:b)c', 'abcabcabcabcacbacb')
print(res)  # ['abc', 'abc', 'abc', 'abc']

# 也可以通过?: 取消优先展示

res = re.search('a(b)c', 'abcabcabcabcacbacb')
print(res.group())  # abc
print(res.group(0))  # abc
print(res.group(1))  # b
print(res.group(2))  # 报错
'''
其实加上括号不影响正则表达式的运行
只不过就是通过正则表达式匹配出来的结果会存起来[abc, b]
然后索引0就是abc 索引1就是b
'''
res = re.search('a(b)(c)', 'abcabcabcabcacbacb')
print(res.group())
print(res.group(0))  # abc
print(res.group(1))  # b
print(res.group(2))  # c

'''
如果把c也加上括号的话就是把c匹配出来的结果添加到列表中[abc, b, c]
然后通过索引取值即可
'''

# 只有findall有分组的的效果 优先展示其他方法没有

2.起别名

import re

res = re.findall('abc', 'abcabcabcabcacbacb')
print(res)  # ['abc', 'abc', 'abc', 'abc']

res = re.findall('a(b)c', 'abcabcabcabcacbacb')
print(res)  # ['b', 'b', 'b', 'b']

res = re.findall('a(b)(c)', 'abcabcabcabcacbacb')
print(res)  # [('b', 'c'), ('b', 'c'), ('b', 'c'), ('b', 'c')] 优先展示

res = re.search('a(?P<name>b)(?P<name1>c)', 'abcabcabcabcacbacb')
print(res.group(0))  # abc
print(res.group(1))  # b
print(res.group(2))  # c
print(res.group('name'))  # b
print(res.group('name1'))  # c
# 就是可以通过加括号在要匹配的字符前面加上 ?P就可以起别名 这样就可以通过起的名字取值 p要大写

网络爬虫的简介

1.什么是互联网

  将全世界的计算机链接到一起组成的网络

2.互联网发明的目的是什么

  将接入到互联网中的计算机中的数据可以彼此共享

3.上网的本质是什么

  基于互联网访问别人的计算机上面的资源(有些计算机存在的意义就是让别人访问的 这种类型的计算机我们称之为服务器)

4.网络爬虫的本质

  模拟计算机浏览器朝目标网址发送请求获取数据并筛选

    只要是浏览器能够访问到的数据网络爬虫理论上都可以爬取数据

第三方模块的下载

如果要使用网络爬虫必须要使用到第三方模块 : requests

而使用第三方模块我们必须要提前下载

python下载第三方模块需要借助pip工具

1.终端

我们可以在终端中下载输入命令:

  pip版本 install  模块名

如果环境变量中的pip为pip3.6那么就可以怎么写

  pip3.6 install 模块名

'''
pip工具默认是要去外网仓库下载的 会下载的很慢

所以我们可以通过换pip源下载 会下载的快些
而国内的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/

只需要写入命令:
pip3.6 install 模块名 -i 源地址

源地址就是上面的链接 随便填写一个即可

模块名也是有版本的
只要在终端中输入下行命令: pip3.6 install 模块名==版本号   pip3.6 install django==1.11.11
'''

2.pycharm

pycharm也给我们提供了下载第三方模块快捷方式

首先最新版本的pycharm下载方式已经改变了位置:

最新版本下载位置如下:

 

 

 1.在pycharm左下角点击 Python Packages 

2.然后在搜索框中输入模块名即可

3.点击下载即可  点击latest可以选择模块的版本号

 

在pycharm中也可以换源

 

 1.点击pycharm界面左下角Python Packages

2.点击设置

3.可以改变你这个源的名字

4.把国内的源地址随便一个复制到这即可

5.可以增加或删除源地址 +:增加  -: 删除

3.下载任意遇到的几种错误

1.pip工具版本过低 需要更新 直接复制提示信息里面的更新命令即可

  python3.6 -m pip install --upgrade pip

2.网络波动

  关键字: Read timed out

  这种出现的时候其实就是你的网络有可能卡掉了 只需要重新下载或则换一个网络即可

3.有些模块下载的时候 需要提前配置好指定环境

  结合具体情况 问度娘

requests模块的使用

import requests


res = requests.get('http://www.redbull.com.cn/about/branch')
# get就是模拟浏览器向目标地址发送请求获取相应数据(就是相当于在浏览器中输入网址然后回车)

print(res.content)  # 获取的是二进制数的数据
print(res.text)  # 获取解码后的数据  requests自带解码

# 为了避免每次运行程序的时候都要发送请求 我们可以把获取到的数据存入到文件中
with open('hn.html', 'wb')as f:
    f.write(res.content)
# 这样就保存到文件中了  主意网站信息文件的后缀名最好使用html

requests模块还有很多功能可以问问度娘

opnepyxl模块

openpyxl模块主要用于操作excel表格的  也是pandas模块的底层操作表格的模块

 

在python中可以操作excel表格有很多

  opnepyxl是属于最近几年比较流行的模块

    opnepyxl针对03版本之前的excel文件兼容性不好

  xlwt、xlrd也可以操作excel表格

    兼容所有版本excel文件 但是使用方式没有openpyxl简单

1.excel版本问题

  03版本之前 excel的后缀名是: .xls

  03版本之后 excel的后缀名是: .xlsx

    如果是苹果电脑excel后缀名是: .csv

因为opnepyxl模块时第三方模块所以使用之前必须先下载(下载过了就不需要)

openpyxl模块的使用

from openpyxl import Workbook

wb = Workbook()  # 创建一个excel文件
# 因为excel表格不止一个页面有很多个页面 所以可以创建很多页面
wb1 = wb.create_sheet('成绩表')  # 创建excel文件中的一个页面 页面名为'成绩表'
wb2 = wb.create_sheet('校花表')  # 页面名为'校花表'

wb1.title('校草表')  # 支持二次修改 页面名就会被修改

wb.save('学校信息.xlsx')  # 保存excel文件 文件名为学校信息.xlsx

openpyxl还可以写入数据

1.第一种写入数据

from openpyxl import Workbook

wb1['A1'] = '分数'  

# 想定位坐标一样在一个准确的空格中编写数据

2.第二种写入数据

from openpyxl import Workbook

wb1.cell(row=3, column=2, value='学生信息')  
'''
使用cell关键
row行       编写第几行
column列    编写第几列
value值     编写数据值
'''

3.第三种写入数据

from openpyxl import Workbook

wb1.append(['username', 'password', 'age', 'gender', 'hobby'])
wb1.append(['tony', 123, 18, 'run'])
# 可以批量写入 如果一行中已经有数据的话那么就会跳到下一行写入

还可以别写函数计算

wb1['F11'] = '=sum(B5:B10)'
# 中括号是具体位置  后面的字符串就是编写一些函数

openpyxl还有很多功能可以去他的官网查看

作业

import requests

import re

# res = requests.get('http://www.redbull.com.cn/about/branch')
# print(res.content)
# print(res.text)


# with open(r'hn.html', 'wb') as f:
#     f.write(res.content)


with open(r'hn.html', 'r', encoding='utf8') as f:
    data = f.read()
# <h2>红牛杭州分公司</h2>
company_name = re.findall('<h2>(.*?)</h2>', data)
# print(company_name)

# <p class='mapIco'>杭州市上城区庆春路29号远洋大厦11楼A座</p>
compony_addr = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(compony_addr)

# <p class='mailIco'>310009</p>
compony_email = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(compony_email)

# <p class='telIco'>0571-87045279/7792</p>
compony_phone = re.findall("<p class='telIco'>(.*?)</p>", data)
# print(compony_phone)

compony_info = zip(company_name, compony_addr, compony_email, compony_phone)
# print(list(compony_info))

from openpyxl import Workbook

wb = Workbook()

wb1 = wb.create_sheet('红牛信息', 0)

wb1.append(['公司名称', '公司地址', '公司邮箱', '公司电话'])
for compony_info_xlsx in compony_info:
    print(compony_info_xlsx)
    wb1.append([compony_info_xlsx[0], compony_info_xlsx[1], compony_info_xlsx[2], compony_info_xlsx[3]])

wb.save('红牛.xlsx')

 

posted @ 2022-07-20 19:02  stephen_hao  阅读(91)  评论(0编辑  收藏  举报