对习乐app的某课程的所有题目爬取

这学期就想把习乐题库刷空,一直没时间弄,期末来了,课少了,搞起来~

习乐好像是一个一个学长写的app,但是对不住了,增加了点垃圾数据,23333

思路:
        1、手机或模拟器抓包,分析提交自测数据包、查看试卷数据包。

        2、模拟上面的数据包。

        3、清洗数据,得到想要的信息入库。

Fiddler抓手机/模拟器数据包,分析数据包基本数据包

Fiddler 抓手机包,网上有教程,我就不一一阐述了。

(一)、抓取分析自测数据包

手机点击,然后查看Fiddler,直接上抓到的数据包。

数据头:
POST http://193.112.190.119/MyCollege/getKssjByAuto.app HTTP/1.1
accept: application/json; charset=UTF-8
charset: utf - 8
Content-Type: application/json; charset=UTF-8
Content-Length: 140
Host: 193.112.190.119
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.6.0

Body:
{"course":"毛泽东思想和中国特色社会主义理论体系概论(二)","courseid":104848,"zhang":"第一章","stdid":"***你的学号***"}

需要传递的参数(json格式):

{

   course:课程的名字

   courseid:课程的Id,

   zhang:章节名字

   stdid:学号

}

 

Fiddler截图如下

          

显然 前面两个和课程相关,不需要改。后面一个是学号,一样的填上去,post提交,json 格式。

然后会返回json数据的数据:题目信息和关于本次自测的一些信息。

然后发现没有Cokkies居然就可以提交,而且还只要学号???

学长偷懒了~,也方便了我...(这里我傻了,后面居然用我自己的学号跑完数据,应该用别人的学号的,反正也不知道,血亏)

管理员看到就看到把,无所谓,反正数据搞到手了,再说,我只是写自测题目。

下面是返回的json数据:

这里我们知道找到本次自测的kssjid就好,代表本次测试的唯一编号。

后续的提交自测和查看题目答案都需要这个ID ,也只需要这个ID,不需要Cookies。看到题目数据不要着急清洗,因为后面查看答案会有所有我们想要的。

特别提醒:kssjtmid并不是题目唯一的标识符,而是所有用户写题目的数量,因为这个参数调试数据库好久,总是找不到原因出在哪里,然后发现是题目提交的顺序.......

(二)、模拟提交试卷

同样分析数据包:

数据包头部:
POST http://193.112.190.119/MyCollege/kssjTijiao.app HTTP/1.1
accept: application/json; charset=UTF-8
charset: utf - 8
Content-Type: application/json; charset=UTF-8
Content-Length: 30
Host: 193.112.190.119
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.6.0

传送的数据:
    {"kssjid":*****,"kssjtms":[]}

kssjid:自测试卷的Id,利用我们前面获得的数据

kssjtms: 你的答案,可以为空,就是直接提交答案。

返回的数据:
如上。

(三)、查看提交的试卷。和清洗答案

POST请求:
POST http://193.112.190.119/MyCollege/getKssjById.app HTTP/1.1
accept: application/json; charset=UTF-8
charset: utf - 8
Content-Type: application/json; charset=UTF-8
Content-Length: 17
Host: 193.112.190.119
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.6.0

参数:
{"kssjid":****}

同样:我们只需要传递kssjid这个参数,返回一个jsong格式的数据,里面有题目、答案等我们想要的信息,如下图;

清洗数据。

大概介绍下这些 参数。

有用的数据在data里面

Kssjid:对应测试唯一的ID

Kssjtms:就是所有的题目,遍历一遍。

       Kssjtms下面的tjdaans就是选项和问题。

对於单选多选都是

bzflag=True表示这个答案是正确的,选项顺序会变,但是答案总共不回变,

对于判断题:

bzdaanb=True 表示这个题目是正确,否则是错误。

基本遍历一遍就能找到题目和对应的答案。然后保存入库就好了。

还有个需要注意的就是,对于题库,我们只有不断提交数据,然后和自己的数据库对比,发现新的再入库。

对比的就是题目的ID,除了个别题目,后面多了个。也当成一个新题目,其他的还好。

所以我顺带记录了入库情况,前面几次没记录。

第三次到最后,前面代表命中率新题率,后面代表获得的题目数量(开始猜测有4K道题目,只有3200+题目,差了800,...)。

496/8400

104/8400

28/8400

8/8400

3/8400

2/8400

3/8400

0/8400

0/8400

0/8400

0/8400

然后我就停止爬虫了,猜测10题以内没入库(除非我脸是真的黑..........)

 

四、题外话

APP服务器的IP:193.112.190.119 ,是腾讯云服务器。

刚开始还怕学生服务器承受不了,本来打算多进程爬取,后来才发现我这才多大数据量,然后单线程跑。

注意点(awsl):

      1、猜错参数作用,浪费2个小时,才发现。数据库都删了几次。

      2、由于开始想的太多,学了Scrapy框架手痒,觉得好用,能快速爬取信息,还有多线程存储数据,直到快写完了,发现没必要用Scrapy,最后连线程池也没用,就是个普通的爬虫,不过挂着个Scrapy的框架,吐血。。。。。

 

溜了溜了还有计组没复习的,明天考试,刺激~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章