资源简介 (共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正则库re2定义函数,首先去除整个网页数据中的换行和空格接下来,我们回到高校案例,使用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 BeautifulSouphtml = '''...'''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获取数据212导入相关库接下来,我们就使用BeautifulSoup获取高校数据43# 使用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 xlwt2安装完成后,将其导入接下来,我们将得到的高校信息存入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 * 15256*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.THINborder.bottom = xlwt.Borders.THINborder.left = xlwt.Borders.THINborder.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设置第一行字体样式# 第一行设置为微软雅黑并字体加粗,字体大小为11first_row_font = xlwt.Font()first_row_font.name = '微软雅黑'first_row_font.bold = Truefirst_row_font.height = 20 * 111将修改好的相应样式绑定到全部样式实例2将修改好的相应样式绑定到第一行样式实例然后,设置表格样式3将样式返回# 将修改好的样式添加到全部样式实例中all_style.font = all_fontall_style.alignment = alignmentall_style.borders = border# 将修改好的样式添加到第一行样式实例中first_row_style.font = first_row_fontfirst_row_style.alignment = alignmentfirst_row_style.borders = border# 将样式返回return all_style, first_row_style1定义函数,参数为表格内创建的单元,高校数据表和表格样式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+1for 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调用写入数据函数,并将表格保存总结Summarypython爬虫√字符串和列表的数据处理√正则表达式和re库常见方法的使用√BeautifulSoup库获取数据常用方式√python操作Excel的库xlwt的使用√Thanks! 展开更多...... 收起↑ 资源预览