- re模块
- 网络爬虫简介
- 第三方模块下载
- 爬取信息实操
- openpyxl模块
在python中如果想要使用正则表达式,re模块是选择之一
import re
"""findall 获取所有能被匹配的数据,以列表返回"""
res = re.findall('a', 'abcabcabc') # 第一个填正则表达式,第二个填待处理的文本
print(res) # ['abc', 'abc', 'abc']
"""finditer 获取所有能被匹配的数据,以迭代器返回"""
res = re.finditer('a', 'abcabcabc')
print(res) #
print(res.__next__()) #
print(res.__next__()) #
"""search 只获取第一个能被匹配的数据,没有则返回None"""
res = re.search('a', 'abcabcabc')
print(res) #
print(res.group()) # bc
"""match 从起始位置匹配,如果匹配不上则返回None"""
res = re.match('abc', 'abcabcabc')
print(res.group()) # abc
res1 = re.match('bc', 'abcabcabc')
print(res1) # None
"""compile 提前准备好正则表达式,之后可以反复使用"""
obj = re.compile('abc')
print(re.findall(obj, 'abcabcaab')) # ['abc', 'abc']
print(re.findall(obj, 'aacababc')) # ['abc']
| 方法 | 作用 |
|---|---|
| findall | 获取所有符合条件的值 |
| search | 获取第一个符合条件的值 |
| match | 获取开头符合条件的值 |
| compile | 保存正则表达式 |
| re模块补充 |
"""
分组
findall会优先展示匹配上的分组内的数据
"""
res = re.findall('a(b)c', 'abcabcabc')
print(res) # ['b', 'b', 'b']
res = re.findall('a(?:b)c', 'abcabcabc') # 在分组内使用?:取消优先展示
print(res) # ['abc', 'abc', 'abc']
"""
分组可以使用group()获取组内数据
group()括号内默认值为0,代表所有数据值
输入1代表获取第一个组的数据
"""
res = re.search('a(b)(c)', 'abcabcabc')
print(res.group()) # abc
print(res.group(0)) # abc
print(res.group(1)) # b
print(res.group(2)) # c
"""
起别名
在分组时可以起一个名字
那么除了编号能获取数据,还可以使用名字获取
"""
res = re.search('a(?Pb)(?Pc)', 'abcabcabc')
print(res.group(1)) # b
print(res.group('id')) # b
print(res.group(2)) # c
print(res.group('ip')) # c
网络爬虫简介
- 什么是互联网
将全世界计算机连接在一起组成的网络 - 发明互联网的目的
使接入互联网的计算机都可以彼此共享数据 - 上网的本质
基于互联网访问别人计算机上面的资源 - 网络爬虫本质
模拟计算机浏览器朝目标网址发送请求获取数据
只要是浏览器能访问的数据网络爬虫理论上都可以获取
- 第三方模块必须要先下载后才能导入使用
- python下载第三方模块需要使用pip工具
- 下载命令:pip install 模块名
- 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/
使用以下命令修改本次下载源地址:
pip install 模块名 -i 源地址 - 下载报错
- pip工具版本过低,使用报错信息里的更新命令更新pip工具即可
- 网络波动,多尝试几次下载,或者切换网络,错误关键码是read timed out
- 有些模块在下载使用前需要提前配置指定的环境,根据模块不同,查询各自需要的环境安装即可
- 模块版本
如果最新版本模块不兼容老版本python解释器,下载老版本的模块方法:
pip install 模块名==版本号
import re
import reqursts
res = reqursts.get('目标网址') # 朝目标地址发送网络请求,获取响应数据(相当于在浏览器地址栏中输入目标网址并回车)
print(res.content) # 获取bytes类型数据
print(res.text) # 获取解码后的数据
# 可以将数据保存到文件中,之后就不用每次都发送网络请求
with open(r'a.html', 'wb', encondin='utf8') as f:
f.wrire(res.content)
# 读取文件数据
with open(r'a.html', 'r', encoding='utf8') as f:
data = r.read()
"""先查看需要获取数据特征,编写正则"""
company_name_list = re.findall('(.*?)', data)
print(company_name_list)
company_addr_list = re.findall("(.*?)", data)
print(company_addr_list)
company_email_list = re.findall("(.*?)", data)
print(company_email_list)
company_phone_list = re.findall("(.*?)", data)
print(company_phone_list)
# 将上边列表按位置整合,可以使用zip
res = zip(company_name_list, company_addr_list, company_email_list, company_phone_list)
print(res)
| 方法 | 说明 |
|---|---|
| get() | 朝目标地址发送网络请求获取响应数据 |
| content | 获取bytes类型数据 |
| text | 获取解码后的数据 |
openpyxl是第三方模块,需要先下载:pip install openpyxl
主要用于操作Excel表格
在python中能够操作Excel表格的模块有很多
openpyxl在近几年比较流行,不过对于03版本之前Excel文件兼容性不好
xlwt、xlrd也可以操作Excel表格,兼容所有版本,但是使用方式没有openpyxl方便
openpyxl实际使用:
from openpyxl import Workbook
"""1.创建excel文件"""
wb = Workbook() # 创建Excel文件
wb1 = wb.create_sheet('a') # 创建分页
wb2 = wb.create_sheet('b', 0) # 设置这个分页放在第一个
wb1.title = 'y' # 更改分页名
wb1.wheet_properties.tabColor = '1072BA' # 修改工作簿颜色
"""2.写入数据"""
# 1.以Excel标识的行列名字写入
wb1['A2'] = 'A2'
wb1['C4'] = 'C4'
# 2.以指定行列的方式写入
wb1.cell(row=4, column=1, value='3行1列')
# 3.批量写入
wb1.append([1, 2, 3, 4, 5])
wb.save(r'abc.xlsx') # 最后保存文件
| 方法 | 说明 |
|---|---|
| Workbook | 创建文件对象 |
| create_sheet | 创建分页 |
| title | 更改分页名 |
| cell | 指定行列写入 |
| append() | 批量写入 |
| save() | 保存文件 |
import re
from openpyxl import Workbook
with open(r'hn.html', 'r', encoding='utf8') as f:
data = f.read()
company_info = re.finditer(r"(?P.*?)(?P.*?)
("
r"?P.*?)
(?P.*?)
", data)
wb = Workbook()
wb1 = wb.create_sheet('公司数据', 0)
wb1.append(['公司名称', '公司地址', '公司邮箱', '公司电话'])
while True:
try:
all_info = company_info.__next__()
wb1.append(
[all_info.group('name'),
all_info.group('addr'),
all_info.group('email'),
all_info.group('phone')]
)
except StopIteration:
wb.save('公司数据.xlsx')
break



