网络爬虫和openpyxl模块
作者:互联网
re模块
re模块基础使用
-
re模块是python使用的正则表达式的方法之一
-
findall
findall括号第一个是正则表达式,第二个是被筛选字符串,将筛选结果组成列表
import re
res = re.findall('r', 'barry run rr') # 筛选符合正则表达式的数据
print(res)
# run:['r', 'r', 'r', 'r', 'r']
-
finditer
finditer和findall作用一致,不过筛选出来的结果处理成迭代器对象,用于节省内存
import re
res = re.finditer('r', 'barry run rr') # 筛选符合正则表达式的数据处理成迭代器对象
print(res)
# run:<callable_iterator object at 0x000001AC9DED8430>
print(res.__next__())
# run:<re.Match object; span=(2, 3), match='r'>
-
search
search只有筛选到一个结果就会结束,输出以匹配到对象和所在位置,通过group就可以变回以匹配对象
import re
res = re.search('r', 'barry run rr') # 筛选一个符合正则表达式的数据就结束
print(res)
# run:<re.Match object; span=(2, 3), match='r'>
print(res.group())
# run:r
- match只筛选开始的第一个数据,若是匹配成功则结束,若是匹配不成功则结束并返回None
import re
res = re.match('r', 'barry run rr') # 只筛选开始的一个数据是否符合正则表达式
print(res)
# run:None
res = re.match('r', 'rry run rr') # 只筛选开始的一个数据是否符合正则表达式
print(res)
# run:<re.Match object; span=(0, 1), match='r'>
print(res.group())
# run:r
-
compile
compile括号内部是准备好的正则表达式,在需要使用时直接使用正则绑定的变量名即可
import re
res = re.compile('r') # 提前准备好正则表达式
print(re.findall(res, 'rry run rr'))
# run:['r', 'r', 'r', 'r', 'r']
print(re.findall(res, 'ekwererkrk23'))
# run:['r', 'r', 'r']
re模块补充
- 在findall括号内用()将正则表达式括起来,是优先展示括号内匹配的结果的意思
res = re.findall('a(b)cd', 'abcdabcdabcd') # findall优先展示括号内匹配的结果
print(res)
# run:['b', 'b', 'b']
res = re.findall('a(b)(c)d', 'abcdabcdabcd') # 若有两个括号,则优先展示括号内匹配的结果,在将结果组成元组组成列表
print(res)
# run:[('b', 'c'), ('b', 'c'), ('b', 'c')]
res = re.findall('a(?:b)cd', 'abcdabcdabcd') # findall在括号内加?:可以取消优先展示
print(res)
# run:['abcd', 'abcd', 'abcd']
- 在search括号内用()将正则表达式括起来,可以用group选择优先展示那个括号的匹配结果
res = re.search('a(b)(c)d', 'abcdabcdabcd') # 优先展示括号内匹配的结果
print(res.group()) # 加group取消优先展示
# run:abcd
print(res.group(0)) # group括号内是0和没有一样是取消优先展示
# run:abcd
print(res.group(1)) # group括号内是1优先展示第1个括号的匹配结果
# run:b
print(res.group(2)) # group括号内是2优先展示第2个括号的匹配结果
# run:c
- 在search括号内用?P<>可以将优先展示的匹配结果加个对应的名字,这样就可以用group括号里加名字,选择优先展示名字的匹配结果
res = re.search('a(?P<id>b)(?P<name>c)','abcdabcdabcd') # 在()内?P<后写名字>后写名字对应的筛选条件
print(res.group()) # 加group取消优先展示
# run:abc
print(res.group(1)) # group括号内是1优先展示第1个括号的匹配结果
# run:b
print(res.group('id')) # group括号内可以根据名字获取名字对应的匹配结果
# run:b
print(res.group('name')) # group括号内可以根据名字获取名字对应的匹配结果
# run:c
网络爬虫
网络爬虫简介
1.互联网
互联网可以将计算机连接到一起,让接入互联网的计算机可以共享数据,有些计算机是专门让别人访问的,被称为服务器,让我们可以通过互联网使用别人的资源
2.网络爬虫的本质
网络爬虫是一种按照一定的规则,自动从抓取信息的程序
模拟计算机浏览器朝目标网址发送请求回去数据并筛选
只要浏览器可以访问的数据网络爬虫理论上都可以
3.网络爬虫虽然好用,但要合法使用,不然一不小心就会获得银手镯
第三方模块下载
- cmd
1.第三方模块需要下载才可以导入使用,python下载第三方模块需要pip工具
2.下载命令
pip3.8 install 模块名
3.下载的问题
3.1下载速度很慢
pip工具默认从国外下载模块,可以更换下载地址源
pip3.8 install 模块名 -i 源地址
"""
下载源地址
中科院:https://pypi.mirrors.ustc.edu.cn/simple/
清华大学 :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.2下载报错
"""
1.pip工具版本过低,拷贝信息提示里的共享命令即可
python38 -m pip install --upgrade pip
2.网络不稳定 报错关键字Read timed out
只能重新下载,或者换一个稳定的网络
3.有些模块在下载使用之前需要提前配置指定的环境
"""
4.模块也有版本
pip3.8 install 模块名==版本号
- pycharm
pycharm也可以下载模块
File>>>settings>>>project:文件夹名>>>python lnterpreter
在右侧的界面中是现在有的模块信息,随便双击一个模块,在上方的搜索条中可以搜索需要下载的模块,点击需要下载的模块名,在点击lnstall Package下载
在lnstall Package右侧的Manage Repositories可以添加或删除下载源地址
爬取信息
红牛分公司 http://www.redbull.com.cn/about/branch
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() # 读取储存在文件里的页面数据
print(data)
company = re.findall('<h2>(.*?)</h2>', data) # 在分公司名字的前后字符中间用括号将.*?括起来
# print(company) # 所有分公司的名字会组成列表
address = re.findall("data-describe='(.*?)'><h2>", data) # 在分公司地址的前后字符中间用括号将.*?括起来
# print(address) # 所有分公司的地址会组成列表
mailbox = re.findall("class='mailIco'>(.*?)</p><p", data) # 在分公司邮箱的前后字符中间用括号将.*?括起来
# print(mailbox) # 所有分公司的邮箱会组成列表
phone = re.findall("class='telIco'>(.*?)</p>", data) # 在分公司电话的前后字符中间用括号将.*?括起来
# print(phone) # 所有分公司的电话会组成列表
info = zip(company, address, mailbox, phone) # 将列表内的数据值一个对一个取出组成元组,将这些元组组成列表
for i in info: # 循环打印出来
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % i)
openpyxl模块
openpyxl模块有什么用
1.我们可以通过openpyxl模块操作Excel表格
2在python中能够Excel表格的模块有很多,openpyxl模块是近年来用的较多的模块,表格openpyxl模块对03年之前的版本兼容性不好
3.xlwt、xlrd也可以操作Excell表格,可以兼容所有版本的Excel表格,但没有openpyxl简单
4.分辨Excel版本
03年之前的excel文件的后缀名 .xls
03年之后的excel文件的后缀名 .xlsx
openpyxl模块的使用
from openpyxl import Workbook # 导入模块
wb = Workbook() # 创建Excel文件
wb1 = wb.create_sheet('魏国') # 创建表格名字
wb2 = wb.create_sheet('蜀国', 0) # 可选择表格位置
wb1.title = '曹操' # 可以修改表格的名字
wb1.sheet_properties.tabColor = '1072BA' # 修改表格的颜色
wb2['B2'] = '赵云' # 将赵云写入表格的B行2列
wb2.cell(row=3, column=1, value='关羽') # 将关羽写入表格的3行1列
# 批量写入
wb2.append(['name', 'pwd', 'age', 'hobby'])
wb2.append(['jay', '123', '20', 'run'])
wb2.append(['barry', '123', '20', 'run'])
wb2.append(['wally', '123', '20', 'run'])
wb2.append(['bart', '123', '20', 'run'])
wb.save(r'110.xlsx') # 保存文件
作业
# 尝试将红牛分公司数据保存到excel表格中
import requests
import re
from openpyxl import Workbook # 导入模块
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) # 将获取的数据储存到文件,之后使用起来更加的方便
with open(r'hn.html', 'r', encoding='utf8') as f:
data = f.read() # 读取储存在文件里的页面数据
company = re.findall('<h2>(.*?)</h2>', data) # 在分公司名字的前后字符中间用括号将.*?括起来
address = re.findall("data-describe='(.*?)'><h2>", data) # 在分公司地址的前后字符中间用括号将.*?括起来
mailbox = re.findall("class='mailIco'>(.*?)</p><p", data) # 在分公司邮箱的前后字符中间用括号将.*?括起来
phone = re.findall("class='telIco'>(.*?)</p>", data) # 在分公司电话的前后字符中间用括号将.*?括起来
info = zip(company, address, mailbox, phone) # 将列表内的数据值一个对一个取出组成元组,将这些元组组成列表
wb = Workbook() # 创建Excel文件
wb1 = wb.create_sheet('红牛信息') # 创建表格名字
wb1.append(['分公司名', '分公司地址', '分公司邮箱', '分公司电话'])
for company, address, mailbox, phone in info: # 将信息分成不同的变量名来循环
wb1.append([company, address, mailbox, phone]) # 将循环的信息写入Excel表格
wb.save(r'110.xlsx') # 保存文件
标签:run,openpyxl,括号,res,爬虫,re,模块,print 来源: https://www.cnblogs.com/riuqi/p/16499818.html