小学课后服务 Python少儿编程 进阶篇:4-爬取高校排名 课件 (28张PPT)

资源下载
  1. 二一教育资源

小学课后服务 Python少儿编程 进阶篇:4-爬取高校排名 课件 (28张PPT)

资源简介

(共28张PPT)
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
少儿编程课
爬取高校排名
本节课我们来编写一个爬虫案例,将高校信息爬取下来,并存入Excel表
课程案例
现在我们开始编写代码,首先使用Requests库获得页面信息
1
导入requests库,将要爬取的网站赋值给变量
2
编写获取整个网页数据的函数
import requests
# 要爬取的目标网站
start_url = 'https://tool.lu/school/index.html'
def get_text(url):
response = requests.get(url)
return response.text
获得网页信息数据后,查看网页源代码,确定我们所需数据的位置
1
在网页中单击右键,然后点击查看网页源代码
2
通过查看分析,发现需要的数据被两个相同的标签包裹在其中
确定了所需信息的位置之后,我们使用字符串相关知识来获取目标信息
1
通过源代码中的标签将整个页面数据拆分
2
继续查看源代码,发现每个高校信息被标签分割
# 使用字符串截取知识点获取所有高校数据
def get_item_by_str(text):
item_list = []
# 将整页数据拆为列表
list_1 = text.split('

')
# 将list_1的后半部分通过在拆一次
list_2 = list_1[1].split('')
3
通过索引获得包含高校数据的部分,并通过标签在拆分一次
1
输出list_2,观察得到的数据
2
以下是一部分数据
去除脏数据
# 使用字符串截取知识点获取所有高校数据
def get_item_by_str(text):
……
print(list_2)
content = get_text(start_url)
get_item_by_str(content)
列表第一项为空数据,之后的每一项都包含了高校的信息,但是有很多我们不需要的脏数据
1
通过切片,去除list_2列表中的第一项
2
替换每一项中的脏数据,只保留', '', '', '', '',
'', '',
'

现在,我们去除列表中的脏数据
3
输出替换过后的数据
4
通过
标签再次将每一条数据进行拆分
for i in list_2:
# 去除脏数据
for tag in ['\n', ' ', '
', '', '
', '

注:

', '', '']:
i = i.replace(tag, '')
list_2 = list_1[1].split('')[1:]
print(i)
little_item = i.split('')
第一条数据是我们不需要的,我们暂时先不管它
1
输出little_item,结果如下:
2
通过切片去除空数据
接着观察处理后的数据,对数据进行进一步处理
3
将处理之后的小列表添加到之前创建的空列表中
4
将完整的高校信息表作为返回值返回,同时去除第一条我们不需要的数据
可以看到,第一个列表是我们不需要的数据,剩下的每一个高校信息列表中的第一项数据都为空数据
little_item = i.split('')[1:]
# 将每个小列表添加到item_list中
item_list.append(little_item)
return item_list[1:]
正则表达式
正则表达式也能够索引数据
以下是正则表达式中常用的一些规则:
语法 说明 语法 说明
. 匹配除换行符以外的所有字符 * 匹配前一个字符0次或多次
\ 转义字符,例如想要匹配 . ,使用\. + 匹配前一个字符1次或多次
[…] 字符集 ? 匹配前一个字符0次或一次
\d 数字,也可写作[0-9] {m} 匹配前一个字符m次
\D 非数字,[^\d] {m,n} 匹配前一个字符m到n次
\s 空白字符 ^ 字符串以什么开头
\S 非空白字符[^\s] $ 字符串以什么结尾
\w 单词[A-Za-z0-9_] | 左右表达式任意匹配一个
\W 非单词字符 (…) 被括起来的表达式作为一个整体
1
对于本测试用例,手机号的匹配规则:
接下来我们使用一个例子来看一下正则表达式的使用
2
邮箱的匹配规则
测试用例
test_str = '''
小王 手机号码:15478954564 邮箱:12356484557@ 密码:qwer123
小李 手机号码:18878456564 邮箱:dada_qqq@ 密码:QQppp121
小刘 手机号码:13022454564 邮箱:abc666@ 密码:1545454
小吴 手机号码:15578958411 邮箱:545131ads@ 密码:123645
小郑 手机号码:15466475464 邮箱:assdasdfa@ 密码:mingtian
小赵 手机号码:13644887874 邮箱:1231eq143123@ 密码:nihao
小孙 手机号码:13123444364 邮箱:1121112wqeq@ 密码:12qw12qw
小郑 手机号码:18845456864 邮箱:dadad_dadad@ 密码:qeqerqtad
小张 手机号码:15478123131 邮箱:1234@ 密码:qQDA12wQEQ3
小冯 手机号码:15123144444 邮箱:qwe@ 密码:WEQDAQ12121
'''
'(1[0-9]\d{9})'
([0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[a-zA-Z]+)
1
新建python文件,导入re库并,将测试用例复制进去
接下来我们使用一个例子来看一下正则表达式的使用
2
将手机号码查找出来
phone_rule = pile('(1[0-9]\d{9})')
result = phone_rule.findall(test_str)
print(result)
3
将邮箱查找出来
mail_rule = pile('([0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[a-zA-Z]+)')
result = phone_rule.findall(test_str)
print(result)
直接使用字符串表示的正则表达式进行findall操作时,Python会将字符串转为正则表达式对象
所以我们先使用compile完成一次转换,之后使用就不用重复转换了
练习
Exercises


线





编写正则,使用re库将密码查找出来
1
导入Python正则库re
2
定义函数,首先去除整个网页数据中的换行和空格
接下来,我们回到高校案例,使用Python中的正则库取出高校数据
3
通过正则提取数据,缩小范围
4
再次编写正则,将高校数据取出,并作为返回值返回
import re
# 使用正则表达式获取所有高校数据
def get_item_by_re(text):
# 去除空格
html = text.replace('\n', '').replace(' ', '')
# 缩小范围
rule_1 = pile(r'双一流(.*)

注')
table = rule_1.findall(html)
# 正则取出数据
rule_2 = pile('td>(.* )(.* )'
'(.* )(.* )')
return rule_2.findall(table[0])
BeautifulSoup
除了使用上面两种方式获取数据,还有更加方便的方式:借助BeautifulSoup库的帮忙
BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库
1
首先来安装,打开CMD,使用pip安装
2
按下回车键,就能够自动下载安装
安装完成之后,我们通过一个小案例来学习一下它的简单用法
BeautifulSoup库的简单使用:




BeautifulSoup使用范例


我是H1标签


我是第一个p标签


我是第二个p标签


我是第一个a标签
我是第一个a标签
我是第一个a标签
我是第一个a标签


一个简单的HTML范例如下:
from bs4 import BeautifulSoup
html = '''...'''
bs = BeautifulSoup(html, 'lxml')
# 简单的获取数据的方法:
print('文档的title:', bs.title)
print('title的name属性:', bs.title.name)
print('title的内容:', bs.title.string)
print('title的parent名称,也就是上一级名称:', bs.title.parent.name)
print('文档中第一个p节点:', bs.p) # 获取
print('文档中第一个p节点的内容:', bs.p.get_text()) # 获取
print('第一个p节点的class内容:', bs.p['class']) # 获取
print('文档的第一个a节点:', bs.a) # 获取
print('文档中所有的a节点,返回一个list:', bs.find_all('a'))
print('文档中id属性为a2的节点:', bs.find(id='a2'))
1
使用BeautifulSoup获取数据
2
1
2
导入相关库
接下来,我们就使用BeautifulSoup获取高校数据
4
3
# 使用BeautifulSoup获取所有高校数据
def get_item_by_bs(text):
# 创建BeautifulSoup实例
bs = BeautifulSoup(text, ‘lxml')
from bs4 import BeautifulSoup
# 查找所有标签为tr的内容
tag_tr = bs.find_all('tr')
# 获取所有高校数据并转为数据表
return [[i.get_text().strip()
for i in tr.find_all('td')]
for tr in tag_tr][1:-5]
返回高校数据表
获得tr标签中的内容
定义函数,创建BeautifulSoup实例
将数据存入Excel表
1
先来安装,cmd中输入pip install xlwt
2
安装完成后,将其导入
接下来,我们将得到的高校信息存入Excel表,Python操作Excel可以使用xlwt库
4
设置第二列和第五列的单元格长度
3
观察最终效果,第二列和第五列的单元格长度较长
import xlwt
# 设置单元格宽度
def set_width(sheet):
# 设置第二列宽度
col_2 = sheet.col(1)
col_2.width = 256 * 20
# 设置第五列宽度
col_5 = sheet.col(4)
col_5.width = 256 * 15
256*N,就表示有N个字符长度。
1
定义设置样式的函数,创建两个样式实例
2
设置表格边框为实线
然后,设置表格样式
4
设置全部字体样式
3
使文字居中显示
# 设置Excel样式
def set_sheet_style():
# 创建第一行样式和全部样式实例
all_style = xlwt.XFStyle()
first_row_style = xlwt.XFStyle()
由于第一行的样式和剩余样式不同,所以这里我们创建两个样式实例
# 设置边框线
border = xlwt.Borders()
border.top = xlwt.Borders.THIN
border.bottom = xlwt.Borders.THIN
border.left = xlwt.Borders.THIN
border.right = xlwt.Borders.THIN
# 使文字居中
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平居中
alignment.vert = xlwt.Alignment.VERT_CENTER # 垂直居中
# 设置字体为微软雅黑
all_font = xlwt.Font()
all_font.name = '微软雅黑'
5
设置第一行字体样式
# 第一行设置为微软雅黑并字体加粗,字体大小为11
first_row_font = xlwt.Font()
first_row_font.name = '微软雅黑'
first_row_font.bold = True
first_row_font.height = 20 * 11
1
将修改好的相应样式绑定到全部样式实例
2
将修改好的相应样式绑定到第一行样式实例
然后,设置表格样式
3
将样式返回
# 将修改好的样式添加到全部样式实例中
all_style.font = all_font
all_style.alignment = alignment
all_style.borders = border
# 将修改好的样式添加到第一行样式实例中
first_row_style.font = first_row_font
first_row_style.alignment = alignment
first_row_style.borders = border
# 将样式返回
return all_style, first_row_style
1
定义函数,参数为表格内创建的单元,高校数据表和表格样式
2
从第二行开始,向表格中写入编号
表格样式相关工作已经完成,下面我们编写写入数据的函数
3
向表格写入数据
# 将数据写入表格
def write_item_in_sheet(sheet, item_list, style):
# 获得行号列号
for row in range(len(item_list)):
# 生成表格编号
sheet.write(row + 1, 0, row + 1, style)
向表格写入数据,使用sheet.write()方法
四个参数依次为:将内容写到第几行、写到第几列、写如的内容、样式
由于是从第二行开始,所以是row+1
for col in range(len(item_list[row])):
# 将高校信息数据写入到excel表格中
sheet.write(row + 1, col + 1, item_list[row][col], style)
1
创建表格和单元
2
调用设置宽度方法,设置单元格宽度
最后,定义一个函数,创建表格并调用之前几个函数将数据写入
3
调用设置样式方法,设置样式
# 创建表格并指定标题
def save_in_excel(item_list):
# 打开表格
wbk = xlwt.Workbook()
# 创建一个单元
sheet = wbk.add_sheet('高校信息表V2.0')
# 调用设置宽度方法设置单元格宽度
set_width(sheet)
# 调用设置样式方法,获得第一行样式和全部样式
all_style, first_row_style = set_sheet_style()
# 生成excel表格的标题
title_list = ['编号', '学校名称', '985', '211', '双一流']
# 将标题写入excel并设置样式
for col in range(len(title_list)):
sheet.write(0, col, title_list[col], first_row_style)
4
创建表格标题,并写入表格
# 将高校数据写入excel并设置样式
write_item_in_sheet(sheet, item_list, all_style)
# 保存excel表
wbk.save('高校信息表V2.0.xls')
5
调用写入数据函数,并将表格保存
总结
Summary
python爬虫

字符串和列表的数据处理

正则表达式和re库常见方法的使用

BeautifulSoup库获取数据常用方式

python操作Excel的库xlwt的使用

Thanks!

展开更多......

收起↑

资源预览