本文共 753 字,预计阅读时间 2 分钟。
上一篇的续篇,为了抓取大面积成绩解决了一些问题。
0x03 手动制作输入文件好烦啊
因为全校的考生数据达到上万条,将excel文件提取到txt再用正则替换为输入文件格式,处理速度一度非常慢。
于是采用了xlrd、xlwt两个处理excel文件的库。
主要用法如下:
1 | table=workbook.sheet_by_name(u'Sheet1') |
0x04 学信网诡异的验证码机制
这次成了Firefox访问要验证码而别的浏览器不要。
其实应该能想到就是上次 XFF 导致的问题,但是我还是无比智障的比对了 UA 和 Cookies 之后,终于发现:有了验证码之后,换个XFF就好。甚至 XFF=127.0.0.123456789 都能访问。服了这程序员了。
0x05 各种异常
后来发现99宿舍网稳定的无验证码。于是换成了这个网站查询数据源。但是也遇到了各种问题。顺便学一下Python的异常处理机制。
- 两字姓名中间有空格导致Query Error
解决方案:Ctrl-F替换吧 - 三字姓名提交时第二个和第三个字之间形成可读字符,导致Query Error
解决方案:使用xm[:2].encode('GBK') - 生僻字GBK无法编码
解决方案:我手动提交了这个人的姓名,前端检测提示不正确。覆盖js函数绕过前端之后显示查不到数据。这就真的没办法了。直接跳过吧。估计这个人在99宿舍网查成绩时内心是崩溃的。实在不行抛出这个异常的时候去学信网查也可以。 - excel文件在大约15k行的时候无法写入
解决方案:问题原因不明, 这个行数限制在有些电脑上最少能到1k以下。我这里才用每5k行数据保存一次workbook。之后……手动合并吧。 - 生成更为详细信息,如年级和院系。
0x06 多线程
python的多线程还是比较友好的,速度上既然选择了脚本语言也不能奢求太多。用一个LIFO队列维护了一个进程队列,控制进程总量,并且用一个全局变量维持线程独立性。于是现在有了两个很严重的问题:
- 全局变量使用时,global操作非常影响速度。
- 每个进程结束后就退出,下次重新启动。进程启动非常影响速度。
最终在本地i7 6700HQ运行1000线程达到极限,之后增加线程性能不会明显提升。然而CPU只有40%不到。等学了gevent再来解决吧。
完整代码见 Github