知识点1 re模块
1 方法
-
1.1 re.findall()
-
功能: 查找到符合条件的所有数据,结果是一个列表
-
import re res = re.findall('a', 'I am a aaaaaaaboy') print(res) # ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
-
1.2 re.finditer()
-
功能: 查找得到的结果是一个迭代器对象,主要用在体量超级大的数据中,可以通过for循环的到每一个结果
import re
res1 = re.finditer('a', 'I am a aaaaaaaboy')
print(res1) # <callable_iterator object at 0x000001535E048F40>
for i in res1:
print(i.group())
-
1.3 re.match()
-
功能: 开头查找,符合条件将得到结果
-
import re res2 = re.match('a', 'a am a aaaaaaaboy') print(res2.group()) # a
-
1.4 re.search()
-
功能:查找符合条件的数据,只要找到一个就停止查找
-
import re res3 = re.search('a', 'a am a aaaaaaaboy') print(res3.group()) # a
-
1.5 re.compile()
-
功能: 将正则表达式赋值给一个变量,后面直接使用这个变量即可,不用重复书写正则表达式
-
import re obj = re.compile('a') res4 = re.findall(obj, 'a am a aaaaaaaboy') print(res4) # ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] res5 = re.findall(obj, 'a am a aa') print(res5) # ['a', 'a', 'a', 'a', 'a']
2 补充知识点
-
2.1 分组
-
分组在findall()中的作用是会优先展示被分组的数据,本质还是查找到了符合正则表达式的整体数据
-
import re res = re.findall('a(b)c', 'abcabcabcabcabcabc') print(res) # ['b', 'b', 'b', 'b', 'b', 'b']
-
分组在search()中的不会优先展示被非组的内容,查找到的也是符合正则表达式的数据
-
import re res1 = re.search('a(b)c', 'abcabcabcabcabcabc') print(res1.group()) # abc
-
2.2 别名:为了后期对分组的数据方便操作,所以给分组的数据起别名,方便查找
-
import re res1 = re.search('a(?P<id1>b)c', 'abcabcabcabcabcabc') print(res1.group('id1')) # b
-
2.3 findall()中如何取消优先展示
-
方法:在分组中加入 ?:
-
import re res = re.findall('a(?:b)c', 'abcabcabcabc') print(res) # ['abc', 'abc', 'abc', 'abc']
知识点2 初识爬虫
1.爬虫简介
1.什么是互联网?
- 把世界上所有的电脑通过网络连接起来就形成了互联网
2.发明互联网的目的?
- 实现所有接入互联网的电脑之间进行数据共享
3.上网的目的?
- 基于网络访问别人电脑上的资源,这种开放可供别人访问的电脑也就是我们所说的服务器
4.网络爬虫的本质是什么?
- 模拟计算机向浏览器指定网址发送请求并获取相应数据并筛选的过程
- 理论上只要是网页端用户能看到的所有数据都能够被爬取
2.第三方模块的下载
-
2.1 注意:
1.第三方模块必须先下载才可以导入使用
2.python下载第三方模块需要借助于pip工具
3.下载命令: pip3.8 install 模块名 -
2.2
1> 下载速度很慢的原因:pip工具默认是从国外的仓库地址下载模块 速度很慢
2> 解决办法:我们可以切换下载的地址(源地址)
清华大学 :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> 终端下载指定版本的语法:pip3.8 install 模块名 -i 源地址
4> 模块也有版本
pip3.8 install 模块名==版本号
pip3.8 install django ==1.11.11 -
2.3 下载报错
1> pip工具版本过低 直接拷贝提示信息里面的更新命令即可
python38 -m pip install --upgrade pip 2> 网络波动 关键字是Read timed out
只需要重新下载几次即可 或者切换一个网络稳定一点的 3> 有些模块在下载使用之前需要提前配置指定的环境
结合具体情况 百度搜索
3.练习:爬取某公司指定信息
import requests
# 朝目标地址发送网络请求获取响应数据(相当于在浏览器地址栏中输入网址并回车)
# res = requests.get('http://www.redbull.com.cn/about/branch')
# print(res.content) # 获取bytes类型的数据
# print(res.text) # 获取解码之后的数据
# 为了避免每次执行程序都要发送网络请求 也可以提前保存页面数据到文件
# 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_addr_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 openpyxl模块
1.介绍
-
1.功能:主要用于操作excel表格 也是pandas底层操作表格的模块
-
2.python中还有哪些可以操作excel的模块?
- 在python中能够操作excel表格的模块有很多
openpyxl属于近几年比较流行的模块
openpyxl针对03版本之前的excel文件兼容性不好 - xlwt、xlrd也可以操作excel表格
兼容所有版本的excel文件 但是使用方式没有openpyxl简单
- 在python中能够操作excel表格的模块有很多
-
3.excel版本问题
03版本之前 excel文件的后缀名 .xls
03版本之后 excel文件的后缀名 .xlsx
如果是苹果电脑excel文件的后缀 .csv -
4.下载openpyxl模块
- pip3.8 install openpyxl
2.实操
1.创建excel文件
from openpyxl import Workbook # 导入模块
wb = Workbook() # 创建excel文件
wb1 = wb.create_sheet('成绩表')
wb2 = wb.create_sheet('财务表')
wb3 = wb.create_sheet('校花表', 0)
wb1.title = '舔狗表' # 支持二次修改
wb1.sheet_properties.tabColor = "1072BA" # 修改工作簿颜色
wb.save(r'111.xlsx') # 保存文件
2.写入数据
# 第一种写入方式
wb1['A1'] = '叙利亚悍匪'
wb1['D2'] = '慢男'
# 第二种写入方式
wb1.cell(row=3, column=2, value='老六慢走')
# 第三种写入方式(批量写入)
wb1.append(['username','password','age','gender','hobby'])
wb1.append(['jason1',123,18,'male','read'])
wb1.append(['jason2',123,18,'male','read'])
wb1.append(['jason3',123,18,'male','read'])
wb1.append(['jason4',123,18,'male','read'])
wb1.append(['jason4',123,18,'male',None])
wb1.append([None,123,18,'male',''])
wb1['F11'] = '=sum(B5:B10)'
练习
import re
from openpyxl import Workbook
"""
阶段1:爬取数据
"""
with open(r'hn.html', 'r', encoding='utf8') as f:
data = f.read()
# 公司名字列表
company_name_list = re.findall('<h2>(.*?)</h2>', data)
# 公司地址列表
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# 公司邮件列表
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# 公司电话列表
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
# 通过zip把数据整合
res = zip(company_name_list, company_addr_list, company_email_list, company_phone_list)
true_data_list = list(res)
"""
阶段2:把数据写入excl表格
"""
# 创建excel文件
wb = Workbook()
wb1 = wb.create_sheet('公司详细信息表')
wb1.sheet_properties.tabColor = "1072BA" # 修改工作簿颜色
wb1.append(['company_name', 'company_addr', 'company_email', 'company_phone']) # 添加表头
for i in true_data_list:
if i is None:
wb1.append("None")
else:
wb1.append(i)
wb.save(r'company.xlsx') # 保存文件