【python基础】第30回 第三方模块和网络爬虫
1. re模块
1.1 了解
在python中如果想要使用正则表达式,re模块是选择之一
1.2 语法
两个参数,第一个是正则,第二个放待匹配的文本
1.2.1 findall
- findall 通过正则表达式筛选出文本中所有符合条件的数据,返回结果是列表
- 代码演示·
import re
res = re.findall('a', 'jason abc aba')
print(res) # 返回所有满足匹配条件的结果,放在列表里

1.2.2 finditer
- finditer 与 findall 作用一致,只不过结果会被处理迭代器对象,用于节省内存
- 代码演示
res = re.finditer('a', 'jason abc aba')
print(res) # <callable_iterator object at 0x00000251D84C5C70>
for i in res:
print(i)

1.2.3 search
- search通过正则表达式匹配到一个符号条件的内容就结束
- 代码演示
res = re.search('a', 'jason abc aba')
print(res) # <re.Match object; span=(1, 2), match='a'>

1.2.4 match
- match 通过正则表达式从头开始匹配,如果头部已经不符合,那么后面不走了
- 代码演示
res = re.match('a', 'jason abc aba')
print(res) # None

1.2.5 compile
- compile能够提前准备好正则,之后可以反复使用,减少代码冗余
- 代码演示
obj = re.compile('a')
print(re.findall(obj,'afdafvdfqas')) # ['a', 'a', 'a']
print(re.findall(obj,'adsfeqwrgfd')) # ['a']
print(re.findall(obj,'bazfafgsdef')) # ['a', 'a']

1.3 分组
- findall针对分组的正则表达式匹配到的结果,优先展示
res = re.findall('abc','abcabcabcabc')
print(res) # ['abc', 'abc', 'abc', 'abc']
res1 = re.findall('a(b)c','abcabcabcabc')
print(res1) # ['b', 'b', 'b', 'b']

2. findall也能够取消分组优先展示(?😃
res = re.findall('a(?:b)c','abcabcabcabc')
print(res) # ['abc', 'abc', 'abc', 'abc']

3. group用法
res = re.search('a(b)c','abcabcabcabc')
print(res.group()) # abc
print(res.group(0)) # abc
print(res.group(1)) # b

1.4 别名
res = re.search('a(?P<id>b)(?P<name>c)','abcabcabcabc')
print(res.group()) # abc
print(res.group(1)) # b
print(res.group('id')) # b
print(res.group('name')) # c

2. 网路爬虫
2.1 什么是互联网
将全世界的计算机连接到一起组成的网络
2.2 互联网发明的目的是什么
将接人互联网的计算机上面的数据彼此共享
2.3 上网的本质是什么
基于互联网访问别人计算机上面的资源,有些计算机存在的意义就是让别人访问,这种类型的计算机我们也称之为服务器
2.4 网络爬虫的本质
模拟计算机浏览器朝目标网址发送请求回去数据并筛选,只要是浏览器可以访问的数据网络爬虫理论都可以
2.5 爬取红牛公司信息
- 获取红牛分公司数据
import requests
# 朝目标地址发送网络请求获取响应数据(相当于在浏览器地址栏中输入网址并回车)
# http://www.redbull.com.cn/about/branch
res = requests.get('http://www.redbull.com.cn/about/branch')
print(res.content) # 获取baytes类型难道数据
print(res.text)
with open(r'hn.html','wb')as f:
f.write(res.content)

import re
# 读取页面数据
res = requests.get('http://www.redbull.com.cn/about/branch')
with open(r'hn.html', 'r',encoding='utf8') as f:
data = f.read()
# 1. 获取所有的分公司名称
company_name_list = re.findall('<h2>(.*?)</h2>',data)
# print(res)
# 2. 获取所有的分公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>",data)
# print(company_name_list)
# 3.获取所有的分公司邮箱
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(company_email_list)
# 4.获取所有的分公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
# print(company_phone_list)
# 5.将上述四个列表中的数据按照位置整合
res = zip(company_name_list, company_addr_list, company_email_list, company_phone_list)
# 6.处理数据(展示 保存 excel)
for i in res: # ('红牛杭州分公司', '杭州市上城区庆春路29号远洋大厦11楼A座', '310009', '0571-87045279/7792')
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % i)

3. 第三方模块的下载
3.1 第三方模块必须先下载才可以导入使用
3.2 python下载第三方模块需要借助于pip工具
3.3 下载命令
方式1:
pip install 模块名
pip install 模块名==版本号
pin install 模块名install 模块名 -i 源地址
方式2:pycharm内在settings里下载

pip3.8 install 模块名
3.3.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/
3.3.2 下载报错
- pip工具版本过低,直接拷贝提示信息里面的更新命令即可
- 网络波动,关键字是Read timed out,只需要重新下载几次即可,或者切换一个网络稳定一点的
- 有些模块在下载使用之前需要提前配置指定的环境,结合具体情况,可百度搜索
3.3.3 模块也有版本
pip3.8 install 模块名 == 版本号
pip3.8 install django == 1.11.11
4. openpyxl模块
4.1 openpyxl模块简介
- 主要用于操作excel表格,也是pandas底层操作表格的模块
- 在python中能够操作excel表格的模块有很多,openpyxl属于近几年比较流行的模块,openpyxl针对03版本之前的excel文件兼容性不好 xlwt,xlrd也可以操作excel表格,兼容所有版本的excel文件 但是使用方式没有openpyxl简单
4.2 execl版本问题
03版本之前 excel文件的后缀名 .xls
03版本之后 excel文件的后缀名 .xlsx
如果是苹果电脑excel文件的后缀 .csv
4.3 下载模块
pip3.8 install openpyxl
4.4 openpyxl实操
4.4.1 创建excel文件
from openpyxl import Workbook
wb = Workbook() # 创建excel文件
wb1 = wb.create_sheet('a表')
wb2 = wb.create_sheet('b表')
wb3 = wb.create_sheet('c表', 0) # 可以自己定义位置
wb.save(r'11.xlsx') # 保存文件


wb1.title = 'd' # 支持二次修改
wb2.sheet_properties.tabColor = '1072BA' # 修改工作簿颜色

4.4.2 写入数据
- 第一种写入方式
# 第一种写入方式
wb3['A3'] = '写到A3'
wb3['C2'] = '写到C2'
wb.save(r'11.xlsx') # 保存文件

2. 第二种写入方式
wb3.cell(row=4,column=5,value='数据3') # row 行 column 列 value 值
wb.save(r'11.xlsx') # 保存文件

2. 第三种写入方式(批量写入)
# 第三种写入方式(批量写入)
wb3.append(['a','b','c','d'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append([11,22,'dddd'])
wb3.append([None,11,22,'dddd'])
wb.save(r'11.xlsx') # 保存文件

作业
import requests
# 朝目标地址发送网络请求获取响应数据(相当于在浏览器地址栏中输入网址并回车)
# http://www.redbull.com.cn/about/branch
# res = requests.get('http://www.redbull.com.cn/about/branch')
# print(res.content) # 获取baytes类型难道数据
# print(res.text)
res = requests.get('http://www.redbull.com.cn/about/branch')
with open(r'hn.html','wb')as f:
f.write(res.content)
import re
# 读取页面数据
with open(r'hn.html', 'r',encoding='utf8') as f:
data = f.read()
# 1. 获取所有的分公司名称
company_name_list = re.findall('<h2>(.*?)</h2>',data)
# print(res)
# 2. 获取所有的分公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>",data)
# print(company_name_list)
# 3.获取所有的分公司邮箱
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(company_email_list)
# 4.获取所有的分公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
# print(company_phone_list)
# 5.将上述四个列表中的数据按照位置整合
lib = zip(company_name_list, company_addr_list, company_email_list, company_phone_list)
# # 6.处理数据(展示 保存 excel)
# for i in res: # ('红牛杭州分公司', '杭州市上城区庆春路29号远洋大厦11楼A座', '310009', '0571-87045279/7792')
# print("""
# 公司名称:%s
# 公司地址:%s
# 公司邮箱:%s
# 公司电话:%s
# """ % i)
lib = (list(lib))
from openpyxl import Workbook
wb = Workbook() # 创建excel文件
wb1 = wb.create_sheet('红牛公司信息') # 创建目录
wb1['A1'] = '红牛分公司名'
wb1['B1'] = '红牛分公司地址'
wb1['C1'] = '红牛分公司邮编'
wb1['D1'] = '红牛分公司号码'
for i in lib:
wb1.append(list(i))
wb.save(r'hn.xlsx') #保存文件


浙公网安备 33010602011771号