版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[13]。(2)html.parser:python内置的标准库,执行速度一般,容错能力强。(3)lxml:需要下载,速度快,容错能力强。(4)BeautifulSoup:第三方插件,需要安装。BeautifulSoup结合了lxml和html.parser解析器,功能强大。它首先将网页内容做一个结构化解析,利用映射关系把HTML文档转变为DOM树,在树形结构中可以精准的定位某个节点、属性或文本内容等,使用find_all或find方法查询到某个节点,访问相关节点信息,从而得到需要分析的信息。利用BeautifulSoup获取网页内容的主要方法如表3.2所示。表3.2BeautifulSoup获取网页内容的主要方法方法名说明BeautifulSoup(wordName,method,charset)构造对象,参数分别是被解析网页文档;解析规则,默认html.parser;字符集,默认utf-8。find_all(name,attrs,string)根据节点名称、属性、内容搜索所有节点find(name,attrs,string)根据节点名称、属性、内容搜索第一个节点BeautifulSoup解析网页过程如图3.5所示。图3.5BeautifulSoup解析网页过程3.2.4简单爬虫框架总结简单爬虫框架如图3.6所示。图3.6爬虫框架3.3selenium和PhantomJS3.3.1Selenium和WebDriverSelenium是一套完整的web应用程序测试系统,在爬虫中模拟浏览器行为用来实现自动化爬取。Python语言写爬虫使用的是selenium中的WebDriver。WebDriver能够模拟浏览器的行为,像解析器那样查找页面元素,发生像点击、发送这样的交互动作,并能够执行其他动作来运行爬虫程序。我们首先看看Selenium的WebDriver支持哪些浏览器,如图3.7所示。图3.7WebDriver详情从结果中我们看到基本支持所有常见的浏览器,包括PhantomJs(下一节介绍)。声明并调用浏览器的代码:fromseleniumimportwebdriverbrowser=webdriver.Chrome()#以谷歌浏览器为例fromseleniumimportwebdriver#访问页面:browser=webdriver.Chrome()browser.get('')#浏览器自动打开百度首页print(browser.page_sourse)#打印百度首页的源代码browse.close()#浏览器自动关闭WebDriver提供了相当丰富的方法来分辨页面上的不同元素。3.3.2PhantomJS在3.3.1中,当我们查看WebDriver支持的浏览器时,提到了PhantomJS,一种基于WebKit的“headless”浏览器,它将网站加载到内存中,并在页面上执行JavaScript,该浏览器可以快速、原生地支持各种Web标准。因为不显示图形界面,所以它有着更高的工作效率。
第4章基于Python的课程数据的获取及存储基于Python的网络爬虫可以实现网页课程信息的获取、解析和存储,得到存入数据库的格式化的课程数据。4.1环境配置及页面分析4.1.1开发环境课程获取的开发环境如表4.1所示。表4.SEQ表4-\*ARABIC1开发环境操作系统Windows8.1浏览器GoogleChrome版本:73.0.3683.86(32位)编译环境Python3.6.3(64bit)+Spyder3数据库MySQL8.0数据库管理工具NavicatPremium12依赖模块pymysql、selenium、bs4(BeautifulSoup)、re、time等WebDriver的Chrome浏览器驱动chromedriver4.1.2中国大学MOOC页面分析该网页的课程信息是动态加载的,我们不能够直接的获得网页中的课程信息。在浏览器的开发者工具中查看网络请求信息,可以在XHR(XMLHttpRequest)中看到通过ajax方法发送的请求,如图4.1所示。图4.SEQ图4-\*ARABIC1页面XHR信息该网页的课程数据是采取ajax异步更新的,即无需重新加载整个网页资源,只需要更新少量数据,实现数据的动态载入。爬取动态页面的方法目前来说有两种:(1)分析页面Ajax请求;(2)selenium模拟浏览器行为。本文采取后者进行页面课程数据的爬取。主页上可见课程类别,如图4.2所示。图4.SEQ图4-\*ARABIC2课程类别将课程类别保存为字典,如图4.3所示。图4.SEQ图4-\*ARABIC3保存为字典每个页面都有课程相关信息,信息分别为:课程名称、开课学校、开课教师、课程描述、参与人数、课程进度。点击下一页可翻页。如图4.4所示。图4.SEQ图4-\*ARABIC4课程详情将以上课程信息设置为列表,也方便后续存储。4.2数据获取过程4.2.1浏览器驱动安装(1)下载对应版本的chromedriver驱动(2)配置下载后解压,放入本机Chrome的路径下,如图4.5所示。图4.SEQ图4-\*ARABIC5chromedriver驱动配置4.2.2中国大学MOOC网页的加载导入selenium库:使用WebDriver自动打开浏览器的代码如下图4.6所示。图4.SEQ图4-\*ARABIC6WebDriver自动打开浏览器我们可看到Chrome浏览器被自动打开并显示课程URL页面,如图4.7所示。图4.SEQ图4-\*ARABIC7浏览器被WebDriver控制(1)set_page_load_timeout()设置网页超时加载时间。在执行Web自动化脚本时,由于没有设置超时时间,默认的get方法是在执行下一步之前等待页面加载完成,所以浏览器打开的url总是等待页面加载完成,但实际上,页面的所需元素已经加载,只是在等待尚未完成加载的JS。(2)selenium中的页面等待由于中国大学MOOC的网页数据是用ajax动态加载的,这就需要设置元素等待,不然会造成数据残缺甚至获取不到数据的情况。Selenium中WebDriverWait类提供了两种类型的等待方法,使得抓取数据在网页加载完成后进行。①显式等待WebDriverWait()是显式等待,等待的时间是固定的,写定了5s就一定等待5s。5s后条件成立便接着执行,超时便抛出异常。WebDriverWait(driver,timeout,poll_frequency,ignored_exceptions).until(method,message=)参数如下:driver:webdriver的驱动程序,返回浏览器的一个实例;timeout:超时时间,默认以秒为单位;poll_frequency:检测元素的频率,默认为0.5秒;ignored_exceptions,超时后的异常信息。WebDriverWait和until/until_not一起使用。②隐式等待上述代码中的implicitly_wait(5)属于隐式等待,等待一段时间(5秒)后加载完成开始执行,否则超时,抛出异常。一般把implicitly_wait()方法调用在加载测试地址后,等待所测试的应用程序加载。隐式等待是智能等待,其等待时间是个范围,例如我们规定了最大是8s,如果在4s的时候满足条件,那么就不再等待后续的4s,直接执行下一句,但是如果大于8s还没有响应,程序就会报错。4.2.3课程数据解析网页解析器选择BeautifulSoup。在4.1.2中我们已经将课程信息设置变量为:课程名称name、开课学校school、开课教师teacher、课程描述introduction、参与人数student_num、课程进度time、课程链接link。在上文中已将课程类别保存为subjects,设置for循环依次选择课程类别,浏览器自动模拟点击行为。driver.page_source获取网页源码,BeautifulSoup解析,解析器选择lxml。返回soup对象,写入txt,便可看到动态加载好的网页源码,如图4.8所示。图4.8网页源码想要得到页面的课程信息,第一种方式我们可以从以上的txt文档中查看,虽然内容很多,但并不妨碍我们找到需要的信息。从图4.8我们可以看到一些课程的课程名、开课老师、网页链接、参与人数等。从这里入手,我们能够得到该页面的课程信息。由于txt文档不好查看,也可以采用第二种方法,从网页入手,在课程信息上右键点击检查,在开发者工具中,能够看到关于课程名称、课程链接等相关内容。通过解析器中的find/find_all方法,返回一个列表类型,根据HTML代码中可定位至相关信息的节点名称、属性、内容搜索所有节点。如图4.9所示。图4.9课程源码我们所要获取的信息一共有七个,以课程《Python语言程序设计》为例,下面依次根据节点内容定位详细信息,如图4.10所示。图4.10课程实例(1)课程名称所有的课程名称拥有共同的class属性:u-course-namef-thide,所以我们可以用该class属性定位课程名称。也可以通过课程展示图片中的alt属性值获取到课程名称,使用这种方式获取时,首先通过节点名称img和属性height/width,定位到课程展示图片,然后获取alt属性值即可。(2)开课学校开课学校可通过class属性值t21f-fc9定位。(3)开课教师由于每门课的开课教师并不是一位,所以我们这里只获取排在第一位的教师,在这个例子中也就是嵩天老师,通过XPath父元素定位第二个子元素(div下第一个子元素是学校)的方式获取。(4)课程描述通过节点名称span和class属性值p5brieff-ibf-f0f-cb定位课程描述。(5)参与人数通过节点名称span和class属性值hot定位。但我们要获取的是223120这个数值,所以需要使用正则表达式匹配到该数值并转换为int类型,代码如下:(6)课程进度通过节点名称span和class属性值txt定位课程进度。(7)课程链接通过节点名称span和class属性值u-course-namef-thide定位课程名称,根据span标签的父元素a标签中的href属性可定位到课程链接。到现在我们已经通过BeautifulSoup解析器获取到了所需的课程详细信息。要获取全部课程信息,不仅需要设置循环遍历字典中的所有课程类别,还需要模拟浏览器点击下一页,遍历所有页数。本打算使用判断下一页文本是否存在的方式点击下一页,当下一页存在时点击,不存在时则为到达最末页,但结合中国大学MOOC网页的具体情况时发现该网站即使已经是最后一页,下一页按钮已然存在,如图4.11所示。图4.11网页下一页由于判断下一页文本是否存在的方式行不通,所以采用了另一种方式:获取最大页数即15,判断当前页是否大于最大页数,若已是最大页数,则结束,若不是最大页数,则点击下一页继续爬取。那如何获取最大页数呢?查看网页源码:我们可以采用获取a标签下class属性值为th-bk-main-gh的倒数第二个节点的方式得到最大页数。综上,遍历全部页码的代码如图4.12所示。图4.12遍历全部页码上文在介绍显式等待时已说明了WebDriverWait(driver,timeout).until()的用法。上述代码中的WebDriverWait(driver,10)是实例化WebDriverWait类,默认每隔0.5秒扫描一次页面变化,共等待10秒,直到until()中的EC.visibility_of(driver.find_element_by_link_text(‘下一页’))的返回值为true,即该元素可见后再继续执行,若10秒后仍不可见,则抛出异常。visibility_of():判断元素是否可见,EC即expected_conditions,它提供了16种判断页面元素的方法,上述的visibility_of为其中一种。4.3数据存储过程当完成网页数据的获取解析后,便是数据的存储。爬虫中数据存储常用两种方式,(1)文件存储,包括txt、csv、json等形式;(2)数据库存储。4.3.1Python操作MySQL数据库在大学期间的课程中学习过关系型数据库的内容,且MySQL功能强大,python对其支持性较好,所以选用了MySQL数据库进行目标数据的存储。需要安装并导入pymysql包。python操作MySQL数据库的流程如图4.13所示。图4.13python操作MySQL数据库的流程图4.3.2使用MySQL实现数据存储将4.2中解析到的七种课程数据存入数据表,由于数据表需要设置主键保证数据不重复,所以对于每一条数据,主键都是唯一的。为了方便的标识每一条数据,我们新建一个名为id的字段作为主键(primarykey),其值为课程链接中最后的若干位数字(如下图),该课程编码对于每一门课程都是唯一的,所以可作为数字主键。在完成数据库的连接和游标的建立之后,使用execute()方法执行SQL,查看相应科目的数据表是否存在,如果存在则执行插入操作,将课程信息插入到数据表中;若不存在则通过SQL语句建立新表,建立新表后同样执行插入操作。在SQL语句的执行过程中,可能发生错误,如果插入某条数据时出现异常,则使用回滚方法rollback()使数据库恢复到执行该SQL语句的上一状态,不影响后续的数据插入,否则未发生异常,使用commit()提交事务。完成所有数据的存储后关闭数据库连接。4.3.3数据展示经过上述数据解析和存储过程,将获得的数据部分展示如图4.14和4.15所示。图4.14数据列表展示图4.15数据详情展示
第5章基于Python的课程数据可视化5.1Python进行可视化分析的优势Python语言是一种开源的编程语言,在科学计算、数据库、人工智能等领域发挥很重要的作用。Python进行可视化分析具有以下几点优势:(1)语法简单,数据结构高效,使用方便,具有简洁性、易读性等优点;(2)支持功能强大的丰富的第三方库用于可视化分析,如numpy,pandas,matplotlib,seaborn等,能方便地创建各种图表。5.2环境配置进行数据可视化的开发环境如表5.1所示。表5.SEQ表5-\*ARABIC1开发环境操作系统Windows8.1运行环境Python3.6.3(64bit)+Spyder3数据库MySQL8.0数据库管理工具NavicatPremium12依赖模块numpy、scipy、matplotlib、pymysql、jieba、re、collections、wordcloud、pandas、seaborn、Pillow、pyecharts等5.3课程数据可视化分析5.3.1从MySQL中获取数据上一章我们已经提到了用Python语言操作MySQL数据库的方法,获取存储在mooc_courses数据库中的课程数据的代码如图5.1所示。图5.SEQ图5-\*ARABIC1获取课程数据5.3.2生成课程名词云若要生成针对课程名的词云,就要获取到所有的课程名,所以我们首先将全部(all_sub)的课程名提取出来,并连接在一起。由于课程名是数据表中的第二个字段,使用kc[1]获取课程名,并连接起来。我们使用jieba分词,Counter计数,导出前50个高频词汇。结果如图5.2所示。图5.SEQ图5-\*ARABIC2分词结果显然,“与”、“一”、“的”、符号等都不是我们所期待的,要将其去掉,由于所处理的精度以及量不多,直接采用re去除。处理后的结果如图5.3所示。图5.SEQ图5-\*ARABIC3处理后的分词结果接下来,使用wordcloud生成词云。首先到网上下载一个喜欢的模板图片到本地,然后从计算机的字体库中选择合适的字体,并保存词云图片到本地。词云如图5.4所示。图5.SEQ图5-\*ARABIC4词云图片5.3.3院校开课数量统计与中国大学MOOC合作开设课程的院校达300多所,想要知道哪些高校开设的课程较多,先要得到每所学校的开课数,并得到排好顺序的列表。使用seaborn作图,直方图如图5.5所示。图5.SEQ图5-\*ARABIC5院校开课数量统计直方图可以看出东北大学和西安交通大学以31的开课数量并列位于榜首,四川大学和北京师范大学紧随其后,以上高校在开课数量上占据优势。5.3.4课程热度分析首先在全部课程里统计课程热度并使用seaborn作图,结果如图5.6所示。图5.SEQ图5-\*ARABIC6课程热度统计可以看出,《沟通心理学》最受欢迎,达到26万之多,说明大家越来越知道沟通在生活工作中的重要性。另外,《Python语言程序设计》和《C语言程序设计》两门课程的受欢迎程度也是相当高,恰好符合现今计算机软件发展势头正猛的现状。同理统计一下计算机类的课程热度排名,结果如图5.7所示。图5.SEQ图5-\*ARABIC7计算机类课程热度排名可见最受欢迎的语言是Python语言,有将近25万人学习《Python语言程序设计》这门课程,凭借优秀的特性,Python语言越来越受欢迎,不仅是排名上升最快的语言,已成为学习人数最多的语言。C语言紧追其后,证明在Python热门的今天,C语言仍然值得学习。在排名前十的课程中,也包含数据结构、Office高级应用这类基础计算机知识课程,其他的都是与C语言或Python语言相关的课程,足以证明C语言和Python语言是最受大众喜欢、学习者愿意学习的计算机语言。5.3.5学科开课数统计先统计各个学科的课程数量,然后制作饼状图。如图5.8所示。图5.SEQ图5-\*ARABIC8学科开课数量饼状图可以看出,工学类课程开课最多,占比21%,理学类其次占比13.9%,管理学类、计算机类紧随其后,说明理工科类别的课程更受学习者欢迎,正像俗语所说“学好数理化走遍全天下”,相比文科类课程,理工类的课程有更多的人学习。5.3.6开课院校分析为了分析各个省市的教育资源情况,在网上获取到大学信息数据的excel表,其中包括大学所在省市等信息。首先将excel中的数据导入数据库中。导入后的数据如图5.9所示。图5.9院校数据详情接下来从数据表中得到中国大学MOOC上已开课的大学列表,如图5.10所示。图5.10开课大学列表我们在大学列表中发现有一个“爱课程”并不是大学,将其去掉得到最终的大学列表universities。接下来我们用pyecharts生成相关图表。(1)开课大学所在城市条形图为了解每所城市中有多少院校在中国大学MOOC已开设课程,我们获取城市出现的次数。使用pyecharts提供的Bar,绘制条形图,如图5.11所示。图5.11开课大学所在城市条形图(2)开课大学所在城市地图Pyecharts涵盖了全世界各个国家和城市的地图,通过安装相应的包我们可以得到分布在地图上的数据,如图5.12所示。图5.12开课大学所在城市地图滑动左下角的标签,可以查看某个数量区间的城市分布,我们将最小值设置为6,得到开课数在六所大学以上的城市,只有北京、南京、西安、成都、广州、武汉、上海、杭州八个,这在一定程度上也反映出城市的大学教育的发展情况。可见,经济发展程度好的城市教育程度也较好,这其中存在着一定的教育失衡,教育资源分配失衡以及受教育程度的失衡。(3)开课大学所在省份地图开课大学所在省份地图如图5.13所示。图5.13开课大学所在省份地图从地图中的信息得知,开课院校大于8的省份有七个,分别为北京、上海、陕西、四川、湖北、浙江、江苏,其中北京以24的开课院校数量遥遥领先于其他城市。(4)开课大学等级圆饼-玫瑰图开课大学数量与院校等级关系如图5.14所示。图5.14开课大学等级圆饼-玫瑰图从上图可看出,开课主力院校为211院校,占比46.32%,985大学数量虽少但仍有18.42的占比,说明985、211院校会更多的在中国大学MOOC上开设课程。(5)开课大学类型直方图开课大学类型如图5.15所示。图5.15开课大学类型直方图上一节中工科类课程是最多的,这里可见工科类院校也是开课大学里最多的,其次是综合类,师范类第三,体育类、林业类开课较少。
第6章结论与展望“互联网+”模式下,在线教育越来越重要,本文介绍了如何通过Python爬虫的方式获取中国大学MOOC上的课程数据,加以进行格式化存储。从而能够使用Python提供的多种第三方库对数据进行可视化分析,有利于了解课程详情和开发改进教育资源。通过这段时间的学习和研究,实现了以下几部分工作:(1)研究了网络爬虫的理论知识,参考了一些文献,对网络爬虫技术有了一定的认识和了解;(2)学习了基于Python语言的网络爬虫技术,为爬取中国大学MOOC的课程数据奠定基础;(3)在理论学习的基础上动手实践,使用Python语言,BeautifulSoup解析器,selenium系统、MySQL数据库实现对中国大学MOOC课程信息的获取、解析和存储;(4)学习可视化分析的理论知识,了解Python提供的第三方图表工具库,实现对存储数据的可视化。在研究中也遇到了很多问题,经过努力解决了很多,至今仍存在以下问题并期待解决:(1)如果中国大学MOOC网站进行了大规模的更新,相应的爬虫代码也需要随之更改,代码的可重用性有待提高;(2)爬虫程序执行时间较长,为了提高抓取数据的效率,考虑进一步使用多线程的方式;(3)可视化分析只生成了课程热度、院校开课数量、省份
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业保洁保洁外包合同
- 城市道路工程施工材料管理保证措施
- 奉贤仓储租赁外包合同
- 2026年土建起重设备试题及答案
- 2025年建筑施工安全知识竞赛试题及答案
- 药厂安全生产考核试卷讲解
- 病房消毒隔离的试题及答案
- 沥青混合料运输覆盖保温施工工艺
- 静脉输液港健康宣教模版
- 民政福利院训练外包合同
- GB/T 47442.1-2026油气区二氧化碳地质利用与封存潜力评价方法第1部分:地质利用
- 2026年青海省西宁市社区工作者考试试题解析及答案
- GB/T 32826-2026光伏发电系统建模导则
- 部编版小学语文五年级下册期末测试卷含答案
- 健康管理技术与实施方案手册
- 2026年系统集成项目管理工程师真题及答案
- 2026年中国物流集团招聘考试专业题库
- 2026年公需科目《人工智能》试题附答案
- 2026上海市中考地理考前一周加分卷含答案
- 2026陕西演艺集团有限公司招聘备考题库及答案详解(历年真题)
- (2026版)公路工程建设项目安全生产费用清单及计量规范课件
评论
0/150
提交评论