一年前就是因为《写个爬虫对付三基三严》 这篇文章才开始学习Python的,现在机会自己在同一个网站重复一遍。
有差不多九个月没有用Python,重新搭建环境、修改现有代码,又再次走了一些弯路。当时认为不会忘记、不值得记录的一些细节,居然没有印象了,大概是因为年老或睡眠不足了。这些流水账之类的东西,不值得写在印象笔记里面,那就增加一篇网络垃圾吧。
搭建环境需要Anaconda+PyCharm+Chrome+Fiddler。现在50M带宽,下载速度非常快。
PyCharm应该下载专业版,然后用edu邮箱认证的key注册,而不是下载教育版。
Anaconda的安装就最坑了。首先安装时要勾选Add to PATH。而且5.1版本之后出现了Windows有时无法完整安装的Bug,还被我遇到了。幸好把Anaconda安装在盘根就能解决问题,不然就得用miniconda引导安装,有点麻烦。而且Anaconda比较巨大,安装卸载一遍很费时。
Fiddler也变了。之前在内网调试爬虫时是用win7和http,也没有那么多干扰流量,现在用自己的win10,新的网站是使用https,又是AppContainer又是设置https非常麻烦。
好不容易配置好环境之后,打开PyCharm,逐行套用原有代码。
网址较一年前稍有改变,现在是https://sum.medu2011.com/zsy/
首先是Cookies的问题。使用密码和验证码登录之后就获得一个Cookies,使用这个Cookies就得直接用抓虫登录,跟之前抓过的两个网站一样。而这个网站每隔一段时间会刷新Cookies,需要重新手动获取。
原代码是添加一个名字用于存放Cookies,作为get的参数提交。
1 | req = s.get(url, headers = headers, cookies = zsy_cookie) |
但其实直接把它写在headers里面也可以。
1 | headers = { |
实际上需要研究的网页是两个:一个是试题列表页面,一个是具体的题库练习页面。
在试题列表页面找到试题编号。
点击“练习”按钮会弹出考试界面。不知道为什么,新的界面没有办法按F12,但右键→检查或者ctrl+shift+I还是可以调出调试窗口。
所有的页面是用同一个Cookies。
网页的结构已经被摸得很清楚了。试题就在JSON里面。request.get一下就能得到这个JSON。请求的URL有一个planLevelId参数,是试题编号,可以像原代码一样,放在url里面
1 | url = r'http://medu2011.com:8083/zsy/paper/createPaperByPlanLevelId.do?planLevelId='+str(x) |
也可以作为get的参数
1 | req = s.get(url, params={'planLevelId': x}, headers=headers) |
接下来大部分代码是在处理这个JSON。
网上有很多在线的JSON格式化工具,比如http://tool.oschina.net/codeformat/json
原代码是提取题干和正确选项,但有一套题的很多正确选项是“以上都是”或者什么A+B+C之类的。
于是修改代码,把所有的选项都提取出来。
最后下载到的多个txt,可以在CMD窗口用type *.txt >>111.txt合并
代码详见https://github.com/chchuj/HIS-hack/blob/master/sanjisanyan.py
原文发表于《三基三严网站爬虫的一些小问题》