第三方模块
今日内容
- 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')