三个平台: 中国大学mooc https://www.icourse163.org/university/view/all.htm 学堂在线 http://www.xuetangx.com/partners 好大学在线 https://www.cnmooc.org/school/view/list.mooc
思路:从上述三个来源获取大学名称,清洗并去重,统计后得到结果
步骤:
首先思考获取数据要不要用爬虫去做?
(适合爬虫的不要用手工去做,适合手工的也不要用爬虫去做)
适合手工完成:一次性的,数量较少的,数据不复杂
适合爬虫完成:周期性采集,爬取站点较多,数据结构复杂但有规律
这里采用手工的方法,
对于中国大学mooc:
将对应的HTML代码保存为文本形式,保存在icourses.txt文件中
编写icourses.py ,提取其中大学的信息,输出空格分隔的大学名称
1 fi = open("d:/icourses.txt","r") 2 ls = [] 3 for line in fi: 4 if "alt" in line: 5 ls_temp = line.split('"') 6 uName =ls_temp[-2] 7 if "大学生" in uName: #去掉“全国大学生数学建模竞赛组织委员会”类似的机构 8 continue 9 if "大学" in uName or "学院" in uName: 10 ls.append(uName) 11 str_ls = " ".join(ls) 12 print(str_ls) #join会形成个字符串 13 14 print(len(ls)) 15 fi.close() 16 结果是:287所
对于学堂在线:
我们换种方法:
直接在浏览器页面拷贝内容,保存在xuetangx.txt文件中
编写代码xuetangx.py ,提取其中的大学信息,输出空格分隔的大学名称
此时,文件中的信息就十分混乱了,含有很多重复的信息
1 fi = open("d:/xuetangx.txt","r") 2 U = set() #空集合 #就算是有重复的加也加不进 3 for line in fi : 4 if "慕课" in line: 5 continue 6 if "大学" in line or "学院" in line: 7 U.add(line.strip(" ")) 8 print(" ".join(U)) #得到空格分隔的字符串 9 print(len(U)) 10 fi.close() 11 结果是: 167 12 这里要注意,因为文件的数据不是很规则(直接拷贝不如HTML代码规范), 13 所以我们就不能再使用列表了,应该利用集合的去重特点,
对于好大学在线:
直接在浏览器页面拷贝内容,保存在cnmooc.txt文件中
编写代码cnmooc.py ,提取其中的大学信息,输出空格分隔的大学名称
1 fi = open("d:/cnmooc.txt","r",encoding="utf-8") 2 U = set() #空集合 #就算是有重复的加也加不进 3 for line in fi : 4 5 if "大学" in line or "学院" in line: 6 U.add(line.strip(" ")) 7 print(" ".join(U)) #得到空格分隔的字符串 8 print(len(U)) 9 fi.close() 10 结果:101
解决问题:汇总各程序运行结果,进行最终结果统计
汇总结果
人工和自动?
如果程序只考虑运行少数几次,可以不必追求完美,直接人工做就好了,
如果我们将程序变得很复杂,仅仅是为了全自动,这就有点得不偿失了,
我们人工的将前三个程序的结果拷贝到程序中作为输入:
1 ic = "北京大学 ..." 2 xt = "中国创业学院 北京体育学院 ..." 3 cm = "新竹清华大学 ..." 4 U = set() 5 6 U |= set(ic.split()) #将ic转换后的列表变为集合并和U或下 7 U |= set(xt.split()) #将ic转换后的列表变为集合并和U或下 8 U |= set(cm.split()) #将ic转换后的列表变为集合并和U或下 9 10 ls = list(U) #将U 集合转化为列表(这是为了能给它排序) 11 ls.sort() #排序 12 print(" ".join(ls)) 13 print(len(ls)) 14 结果是:352 注:如果对结果有疑问,可以人工审核,去掉即可。
通过这个例子主要是理解对文本数据类型进行出来的时候的各种操作,
包括统计啊,去重啊,之类的文本数据的操作。