Cyrus Flag

flag{S0_bangbang_7ha7_u_f1nd_h3r3}

爬虫实战 0x04 CET考试成绩抓取(续)

上一篇的续篇,为了抓取大面积成绩解决了一些问题。

0x03 手动制作输入文件好烦啊

因为全校的考生数据达到上万条,将excel文件提取到txt再用正则替换为输入文件格式,处理速度一度非常慢。

于是采用了xlrd、xlwt两个处理excel文件的库。

主要用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
table=workbook.sheet_by_name(u'Sheet1')
nrows = table.nrows
resworkbook=xlwt.Workbook()
ressheet=resworkbook.add_sheet(u'Sheet1')

# 循环获得数据ressheet.write(i, 0, xm)
ressheet.write(i, 1, jb)
ressheet.write(i, 2, dictr[5])
ressheet.write(i, 3, dictr[2])
ressheet.write(i, 4, dictr[3])
ressheet.write(i, 5, dictr[4])
ressheet.write(i, 6, dictr[10])

resworkbook.save('Result.xls')

0x04 学信网诡异的验证码机制

这次成了Firefox访问要验证码而别的浏览器不要。

其实应该能想到就是上次 XFF 导致的问题,但是我还是无比智障的比对了 UA 和 Cookies 之后,终于发现:有了验证码之后,换个XFF就好。甚至 XFF=127.0.0.123456789 都能访问。服了这程序员了。

0x05 各种异常

后来发现99宿舍网稳定的无验证码。于是换成了这个网站查询数据源。但是也遇到了各种问题。顺便学一下Python的异常处理机制。

  1. 两字姓名中间有空格导致Query Error

    解决方案:Ctrl-F替换吧

  2. 三字姓名提交时第二个和第三个字之间形成可读字符,导致Query Error

    解决方案:使用xm[:2].encode('GBK')

  3. 生僻字GBK无法编码

    解决方案:我手动提交了这个人的姓名,前端检测提示不正确。覆盖js函数绕过前端之后显示查不到数据。这就真的没办法了。直接跳过吧。估计这个人在99宿舍网查成绩时内心是崩溃的。实在不行抛出这个异常的时候去学信网查也可以。

  4. excel文件在大约15k行的时候无法写入

    解决方案:问题原因不明, 这个行数限制在有些电脑上最少能到1k以下。我这里才用每5k行数据保存一次workbook。之后……手动合并吧。

  5. 生成更为详细信息,如年级和院系。

0x06 多线程

python的多线程还是比较友好的,速度上既然选择了脚本语言也不能奢求太多。用一个LIFO队列维护了一个进程队列,控制进程总量,并且用一个全局变量维持线程独立性。于是现在有了两个很严重的问题:

  1. 全局变量使用时,global操作非常影响速度。
  2. 每个进程结束后就退出,下次重新启动。进程启动非常影响速度。

最终在本地i7 6700HQ运行1000线程达到极限,之后增加线程性能不会明显提升。然而CPU只有40%不到。等学了gevent再来解决吧。

完整代码见 Github