为什么要做这么无聊的事

威斯康辛大学麦迪逊分校里有一位很有意思的教授,Adil G Ibrahim,在下这学期的CS/ECE 252 教授。

这位老人家还是有很多特点的

  • 上课迟到
  • 高兴的时候一分钟点过5页PPT
  • 不高兴的时候一节课讲两页PPT
  • PPT还是抄的别的教授的
  • 作业完全不是上课讲的内容,还不是他自己出的
  • Rate My Professor 历史新高1.3,还是在有一个4分误评的情况下
  • 那个唯一的4分评价是”I wish he could be my professor for my programming classes forever” :)

所以我想抓一把全校 (UW-Madison) 的所有教授评分,看看他老人家能排到第几位 (倒着的)

抓取数据

原料: Google Chrome

首先打开Rate My Professor,搜索栏输入University of Wisconsin Madison,点击进入学校的professors列表

最终的网址应该如下

http://www.ratemyprofessors.com/campusRatings.jsp?sid=1256

rmp-uwm

然而发现左边一行的教授信息是惰性加载的,一次20个,然而UW-Madison一共有3900多个 教授在RMP上有记录,所以普通的全选排序数据行不通,而且评分排序方式只有”递降排序”, 就很没意思。

然后打开Chrome开发者工具箱(我也不知道是不是这么翻译的,反正F12 Chrome Dev Tools)。 切换至Network页面,查看网络请求。

随后点击Trigger惰性加载的按钮 “Load More”

Network里多出一个如图所示的返回JSON格式数据的请求

chrome-dev-tools

右键复制链接

http://search.mtvnservices.com/typeahead/suggest/?solrformat=true&rows=20&callback=noCB&q=*%3A*+AND+schoolid_s%3A1256&defType=edismax&qf=teacherfirstname_t%5E2000+teacherlastname_t%5E2000+teacherfullname_t%5E2000+autosuggest&bf=pow(total_number_of_ratings_i%2C2.1)&sort=teacherlastname_sort_s+asc&siteName=rmp&rows=20&start=20&fl=pk_id+teacherfirstname_t+teacherlastname_t+total_number_of_ratings_i+averageratingscore_rf+schoolid_s&fq=

从传入的参数中可以看到两个重要的带数字的参数 start=20row=20。智商正常的人都能 猜得到,start是起始位置,row是请求返回的数据量(教授数量)

从RMP的UW-Madison首页可以看到 “3962 professors found”

那就不用客气了,把start改为0,row改为5000

最终的请求地址为

http://search.mtvnservices.com/typeahead/suggest/?solrformat=true&rows=5000&callback=noCB&q=*%3A*+AND+schoolid_s%3A1256&defType=edismax&qf=teacherfirstname_t%5E2000+teacherlastname_t%5E2000+teacherfullname_t%5E2000+autosuggest&bf=pow(total_number_of_ratings_i%2C2.1)&sort=teacherlastname_sort_s+asc&siteName=rmp&rows=5000&start=0&fl=pk_id+teacherfirstname_t+teacherlastname_t+total_number_of_ratings_i+averageratingscore_rf+schoolid_s&fq=

rmp-data

到此,所有麦屯教授的姓,名,平均评分,评分数量就都拿到了

分析数据

原料: EverVim, Python

首先保存刚刚的json为rate-my-professor.json文件,然后用EverVim打开该json

按下<Leader>jt按照4空格缩进格式化整个json文件并且检查

然后编辑一个新的py文件,暂且叫他json2csv.py

import csv, json, sys

input = open(sys.argv[1])
data = json.load(input)
input.close()

output = csv.writer(sys.stdout)

output.writerow(data[0].keys())

for row in data:
    output.writerow(row.values())

运行该脚本将当前buffer内的内容转换成csv

:!python3 json2csv.py % > rate-my-professor.csv

然后打开生成的文件 :e rate-my-professor.csv,将CSV转换为可视化表格:CSVTabularize

效果如下:

rmp-csv-1

将表格按照 Average Rating Score 排序 :CSVSort 1

rmp-csv-2

然后去掉只有三次以下次评分或者没有评分的 :CSVDelete total_number_of_ratings_i<=3

rmp-csv-3

然而并没有发现Adil的1.3,因为他本来并不是这个学校的。

所以我顺便去找了他所在的University of Wisconsin - Platteville所有教授的评分, 然后把他的精确平均评分找到了:

1.33

所以大概能排到第几位呢,全校前18,还算上了误评的4.0分

那如果我们把那个4.0分去掉,(或者采取去掉一个最高分和最低分),那么他就是清一色的一分,现在能排在哪就不用说了

还是要说一下

第一名

倒着的。