图 JUN0620 | 文 寒食君

阅读文本大概需要 8 分钟。

前两周,我写了一篇《本科生如何选择毕设》,当我在学校系统上完成课题申报后,留意到了一件事:毕设系统的初始化密码为学号。于是,我当时尝试随机登陆了一位同学的账号,发现能够顺利进入了系统,拿到了他的信息。

我由此猜测大部分学生都比较缺乏安全意识,不会主动去更改密码。好奇心使然,我萌生了一个想法:抓取这届毕业生的毕设信息,进行简单的分析,看看大家到底都在做些什么?只是当时比较忙,没有工夫,暂时搁置了。

今天偶然又想起了这件事,带着交流学习的态度,我决定试一试。原本以为很快就能完成,没想到过程中遇到了一些麻烦,最后花了不少时间。所以说,很多事,纸上谈兵毫不费力,只有亲手实践,才能获得经验的积累。

数据准备

虽然毕设系统的账户密码初始化都是学生的学号,但是我这边并没有全校学生的学号数据。

我第一时间想到的是自己生成,因为各个专业的学号规则都是相似的,我可以先找到这种规律,然后假设一个班有n人,为了避免遗漏,n需要设置得比实际情况大些,比如50,但这一定会产生异常情况,没关系,处理这些异常就足够了。

但我发现这样做不妥,因为有十几个学院,几十种专业,我无法保证自己推测的学号生成规律一定是对的。最好还是能够拿到可靠的数据。通过猜测,我觉得班级QQ群里可能存在相关信息,于是我终于在2016年的群文件里找到了全校的学费缴费款信息表,里面包含了全校1万余名本科生和研究生的学号信息。通过筛选,我拿到了我们19届3000+学生的学号。

模拟登陆与爬虫

我使用Fiddler这个工具抓取了访问毕设系统时发送和接收的数据包,经过分析,我发现登录是这样一个流程:

首先请求登录接口,使用表单携带账号密码;通过验证后,服务端在header中传回cookie信息保存在本地,并生成一个字符串类型的sid来作为用户标识,然后前端带着这些信息去请求首页。

后续的请求通过在header中携带cookie和url中携带sid来完成鉴权,以获得相关数据信息。

整个登录流程就是这样,一点也不复杂,毕竟是学校的教务系统,一般都是外包出去,而且由于年代久远,使用的都是十分老旧和普通的技术,在安全方面也不会有太多的防范措施。

但是由于我已经有段时间没碰爬虫这块,有些生疏,遇到了一个难以解决的问题:无法获取到那个sid。

从服务端传回的数据包里来看,没有这个sid的数据,试验几次后我发现,这个sid不是动态的,那么会不会不是由服务端计算的?直接前端js生成的?但是我又找不到那段js。

这个问题困扰了我好久,始终难以解决,而且渐渐影响了心态。我只好暂时作罢,先平复心情,穆罕默德说:山不过来,我便过去。我想,难道要动用selenium吗?这可是个大家伙,虽然能够专治各种疑难杂症,但是由于是直接模拟实际浏览器行为,效率极其低下。

一般的情况下,它是不会被用于生产的,不过考虑到我这次数据量不大,之前也没有尝试过selenium,于是我向自己妥协了。

在查看文档之后,我尝试写了几段代码(部分,完整源码可在公众号后台回复:「毕设分析」获取),它生效了。

def setup():    chromePath = r'C:\Users\casua\Downloads\chromedriver_win32 (1)\chromedriver.exe' browser = webdriver.Chrome(executable_path=chromePath)    return browser
def login(username, password, browser): browser.get("http://xxx.edu.cn/index.aspx")   user_btn = browser.find_element_by_id("UserId")  pwd_btn = browser.find_element_by_id("Pwd")  submit_btn = browser.find_element_by_id("LoginButton")   user_btn.send_keys(username)    pwd_btn.send_keys(password) submit_btn.send_keys(Keys.ENTER)    return browser
def set_sessions(browser):  request = requests.Session()   headers = {    "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"  }   request.headers.update(headers) cookies = browser.get_cookies()    current_url = browser.current_url  for cookie in cookies:  request.cookies.set(cookie['name'], cookie['value'])    return request,current_url

由于工具本身的特点以及没有使用多线程,效率比较低,不过selenium还是真香。整个抓取过程大约需要三个小时。 结果显示,寥寥无几的同学修改了密码,我将得到的3300余条数据格式化储存在MySQL中。

分析统计

由于属于刚开题的阶段,信息量不是很足,我利用现有的信息准备从以下几个角度入手:

  • 各学院毕业人数,男女比例

  • 学生重名情况

  • 压力最大的老师

  • 类别和类型

  • 各学院毕设题目关键词

各学院毕业人数,男女比例

可点击图片放大

从结果来看,电信院人丁最为兴旺,工科学校的整体女同学人数是硬伤,只有经管院、公管院、外院是特例,其中外院的男生最有福,材料院的比例完美符合“一对情侣三对基”。

学生重名情况

可点击图片放大

以下是全校19届学生的重名情况,令我震惊的是,居然没有出现 "张伟"和 "王刚"?杨晨、张旭、陈宇这十二位名列前茅。此外,李嘉琪、陈欣、陈晨、刘彤、曹博、王颖,分别为一男一女,如此有缘,我只能帮你们到这了。

压力最大的老师

可点击图片放大

从结果来看,韩文民老师居然要带12位同学的毕设,十分辛苦。其余九位压力最大的老师,分别九分辛苦,八分辛苦,七分辛苦...

类别和类型

可点击图片放大

课题类别方面,"工程设计(实践)"和 "综合"占有绝对的比重,课题性质方面,"模拟性课题"和 "纵向课题"则更受欢迎。各位对号入座吧,我个人选择的类型是:综合,性质是:模拟性课题。

毕设题目关键词

我选择了人数前五的学院来分词,统计词频,生成展示词云。来看看大家毕设都在做些什么吧,排名不分先后:

计算机:

可点击图片放大

电信:

可点击图片放大

经管:

可点击图片放大

船舶:

可点击图片放大

材料:

可点击图片放大

可见,隔行如隔山啊,而我由衷感慨:相较于室外工作,写程序能够安坐室内,冬暖夏凉;相比于硬件相关,写程序门槛较底,一台笔记本就能上手入门;相比于实业,互联网的氛围更自由。

虽然程序员群体的话题热度一直居高不下,比如“脱发”、“格子衫”等,其实这些大部分都是外界的偏见,要不然怎么现在三百六十行,行行转IT呢?庆幸一入学就接触了软件,此生无悔入IT。

这是我在2018年的最后一篇技术相关的文章,多谢一路相伴,来年还请多多见教,既然彼此遇见,不如砥砺同行。

完整源码可在公众号:「字节流」后台回复:「毕设分析」获取。

推荐阅读:

为了一窥究竟,我抓取了全校学生的毕设信息相关推荐

  1. 教你用百度地图API抓取建筑物周边位置、房价信息(附代码)

    来源:大数据挖掘DT数据分析 本文共2465字,建议阅读5分钟. 本文为大家解读怎样用脚本与百度API的交互,爬取百度地图的数据. 需求描述 对于数据挖掘工程师来说,有时候需要抓取地理位置信息,比如统 ...

  2. .NET Core 实现定时抓取博客园首页文章信息并发送到邮箱

    前言 大家好,我是晓晨.许久没有更新博客了,今天给大家带来一篇干货型文章,一个每隔5分钟抓取博客园首页文章信息并在第二天的上午9点发送到你的邮箱的小工具.比如我在2018年2月14日,9点来到公司我就 ...

  3. python爬取京东手机参数_python抓取京东小米8手机配置信息

    本文代码是使用python抓取京东小米8手机的配置信息 首先找到小米8商品的链接:https://item.jd.com/7437788.html 然后找到其配置信息的标签,我们找到其配置信息的标签为 ...

  4. Python爬虫三:抓取链家已成交二手房信息(58W数据)

    环境:Windows7+python3.6+Pycharm2017 目标:抓取链家北京地区已成交二手房信息(无需登录),如下图,户型.朝向.成交时间价格等,保存到csv.最后一共抓取约58W数据,程序 ...

  5. 2011年1月13日抓取的QQ空间报错信息

    这是2011年1月13日抓取的QQ空间报错信息,当时是QQ空间里的"Q宠大乐斗"插件升级,一直报503错误,持续了大概半小时. 在此抓图以作留念.

  6. 数据抓取,爬虫豆瓣读书书籍信息

    标题抓取豆瓣读书中的书籍信息 //思路: //先爬取网页html //将网页html进行分析,获取每个数据详情信息(在这里比较好找到作者,书名...等信息) //将每本书籍的详情信息进行抓取,转换为自 ...

  7. python 爬虫学习:抓取智联招聘网站职位信息(二)

    在第一篇文章(python 爬虫学习:抓取智联招聘网站职位信息(一))中,我们介绍了爬取智联招聘网站上基于岗位关键字,及地区进行搜索的岗位信息,并对爬取到的岗位工资数据进行统计并生成直方图展示:同时进 ...

  8. Python爬虫实战之二 - 基于Scrapy框架抓取Boss直聘的招聘信息

    Python爬虫实战之三 - 基于Scrapy框架抓取Boss直聘的招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于 ...

  9. 使用Jsoup抓取京东图书分类页面图书信息

    一.目的: 1.任务 使用 Jsoup抓取京东图书分类页面的图书信息. 抓取目标分类网址例如:https://list.jd.com/list.html?cat=1713,3259,3330 给与的某 ...

最新文章

  1. linux c 屏幕触摸_交互式拼接屏应用互动触摸屏实现大屏幕拼接墙
  2. DPM 2010(三)---Exchange2010单邮箱恢复
  3. 构造函数初始化结构体
  4. LeetCode刷题中遇到的一些知识点
  5. reactjs css modules解决组件间样式覆盖问题
  6. C语言malloc,free的用法
  7. Pattern类正则表达式的编译表示形式
  8. 【转】js 获取浏览器高度和宽度值(多浏览器
  9. ros 开源物体检测_ROS kinetic + Realsens D435i + ORK + LINEMOD 物体识别
  10. Android 常用炫酷控件(开源项目)git地址汇总
  11. linux打开txt文件命令_linux系统文件及常用命令
  12. linux 怎么看出io是瓶颈,IO瓶颈探测方法
  13. 如何解决Worm.Win32.AutoRun.bqn(文件夹改exe病毒)
  14. 多合一音乐搜索器项目源码分享,支持播放,下载
  15. 智能空调雷达感应,雷达模组技术方案,毫米波雷达传感器应用
  16. Django 项目管理
  17. matlab画椭圆抛物面参数方程,求单叶双曲面和双叶双曲面、椭圆抛物面、双曲抛物面用matlab怎么画或其参数方程?...
  18. Matlab 读取欧空局*.N1卫星遥感图像
  19. 微信小程序开发过程基本知识总结(引用黑马程序员)
  20. linux进程间通信(IPC) ---无名管道

热门文章

  1. 萧毅舟;2.22黄金原油日内走势分析及操作策略建议
  2. 开源PLM软件Aras详解二 汉化以及界面
  3. Qt与脚本初探:QtScript, PyQt, PythonQt, Qt Jambi
  4. 第十二周项目4-利用遍历思想求解图问题(6-7)
  5. SpringCloud-Gateway网关统一登录鉴权+QQ第三方登录+Vue前后分离解决方案
  6. python数据集处理
  7. 华为1220s配置url过滤,规范员工上网行为
  8. 学习笔记-用PLAN法提高执行力
  9. 怎样在应用中实现自助报表功能
  10. oracle初始化参数详解