“知道”题库脚本——升级版

#!/usr/bin/env python
# encoding: utf-8
'''
@author: JHC
@license: None
@contact: JHC000abc@gmail.com
@file: ttt.py
@time: 2022/4/22 23:27
@desc:替换self.uuid就能把题和答案写入mysql数据库
		uuid在cookies里
'''
import json
import requests
import pymysql.cursors
import sys
from tqdm import tqdm


class Spider():

    def __init__(self):
        self.con = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='questionsbank',
                              charset='utf8', cursorclass=pymysql.cursors.DictCursor)
        # self.uuid="V8qYDjej"
        self.uuid = "Vj1vy1A7"
        self.courseId = "10464858"
        self.randomExerciseStyle = "0"
        self.isFirst = True

        self.params = (
            ('courseId', self.courseId),
            ('randomExerciseStyle',self.randomExerciseStyle),
            ('isFirst',self.isFirst),
            ('uuid',self.uuid)
        )
        self.url_queryAnswerSheet = 'https://hike-examstu.zhihuishu.com/zhsathome/randomExercise/queryAnswerSheet'
        self.url_queryRandomExerciseDetail = 'https://hike-examstu.zhihuishu.com/zhsathome/randomExercise/queryRandomExerciseDetail'

    def get_exerciseId_list(self):
    	'''获取练习所有题id'''
        res = requests.get(url=self.url_queryAnswerSheet,params=self.params)
        exerciseId_list = [i["exerciseId"] for i in res.json()["rt"]["lists"]]
        return exerciseId_list

    def get_content(self):
    	'''获取题目内容'''
        exerciseId_list = self.get_exerciseId_list()
        INDEX = 1
        for questionId in tqdm(exerciseId_list):
            params = (
                ('courseId', self.courseId),
                ('questionId', questionId),
                ('times', '2'),
                ('randomExerciseStyle', self.randomExerciseStyle),
                ('uuid', self.uuid),
            )
            response = requests.get(url=self.url_queryRandomExerciseDetail,
                                     params=params)
            if response.json()["rt"] is not None:
                randomExerciseSortId = response.json()["rt"]["randomAnswerDetailDto"]["randomExerciseId"]
                answerList = [i["id"] for i in response.json()["rt"]["optionList"]]
                questionType = response.json()["rt"]["questionName"]
                if questionType == '单选题':
                    answer = self.get_answer_radio(randomExerciseSortId, answerList)
                    self.radio(response, INDEX,questionType,answer)
                elif questionType == '多选题':
                    answer = self.get_answer_multi(randomExerciseSortId,answerList)
                    self.multi(response, INDEX, questionType,answer)
                elif questionType == '判断题':
                    answer = self.get_answer_judge(randomExerciseSortId)
                    self.judge(response, INDEX,questionType,answer)
                else:
                    print('异常')
                INDEX += 1
            else:
                print("异常题号为{}".format(INDEX))
                INDEX += 1


    def judge(self,response, INDEX,questionType,answer):
	    '''判断'''
        key1, key2, key3, key4, key5, key6 = self.set_opt(response)
        id, title, type = self.process_data(INDEX, questionType, response)
        self.insert_data(id=id,title=title,type=type,key1=key1,key2=key2,key3=key3,key4=key4,key5=key5,key6=key6,answer=answer)

    def multi(self,response,INDEX,questionType,answer):
	    '''多选'''
        key1, key2, key3, key4, key5, key6 = self.set_opt(response)
        id, title, type = self.process_data(INDEX, questionType, response)
        self.insert_data(id=id, title=title, type=type,key1=key1,key2=key2,key3=key3,key4=key4,key5=key5,key6=key6,answer=answer)

    def radio(self,response,INDEX,questionType,answer):
    	'''单选'''
        key1, key2, key3, key4, key5, key6 = self.set_opt(response)
        id, title, type = self.process_data(INDEX, questionType, response)
        self.insert_data(id=id, title=title, type=type, key1=key1, key2=key2, key3=key3, key4=key4, key5=key5, key6=key6,answer=answer)

    def process_data(self, INDEX, questionType, response):
    	'''删除题目中的垃圾字符'''
        content = response.json()["rt"]["content"]
        id = INDEX
        title = str(content).replace("&nbsp;","").replace("<p>","").replace("</p>","").replace("<br>","")
        type = questionType
        return id, title, type

    def set_opt(self,response):
    	'''拼接选项,纯为了好看'''
        optionList = response.json()["rt"]["optionList"]
        flag = 1
        key1, key2, key3, key4, key5, key6 = None,None,None,None,None,None
        for option in optionList:
            option_content = option["content"].replace("&nbsp;","").replace("<p>","").replace("</p>","")
            if flag == 1:
                single = 'A. '
                key1 = single + option_content
            if flag == 2:
                single = 'B. '
                key2 = single + option_content
            if flag == 3:
                single = 'C. '
                key3 = single + option_content
            if flag == 4:
                single = 'D. '
                key4 = single + option_content
            if flag == 5:
                single = 'E. '
                key5 = single + option_content
            if flag == 6:
                single = 'F. '
                key6 = single + option_content
            flag += 1
        return key1,key2,key3,key4,key5,key6

    def insert_data(self,id,title,type,key1=None,key2=None,key3=None,key4=None,key5=None,key6=None,answer=None):
    	'''写入数据到mysql'''
        try:
            with self.con.cursor() as cur:
                sql = 'INSERT INTO xingce (id, title,key1,key2,key3,key4,key5,key6,type,answer) VALUES (%s,%s, %s, %s, %s, %s,%s,%s,%s,%s)'
                cur.execute(sql, (id,title,key1,key2,key3,key4,key5,key6,type,answer))
            self.con.commit()
        except :
            self.con.rollback()

    def get_answer_judge(self,randomExerciseSortId):
        '''判断题答案获取'''
        for key in range(0,10):
            url = "https://hike-examstu.zhihuishu.com/zhsathome/randomExercise/submitAnswer?uuid={}".format(self.uuid)
            headers = {
                "Content-Type": "application/json",
            }
            data = {"data": {"answerContent": key, "fileList": [], "isReview": True, "randomExerciseSortId": randomExerciseSortId,
                             "courseId": "10464858"}}

            res = requests.post(url, headers=headers, data=json.dumps(data))

            if res.json()["rt"] == True:
                if key == 0:
                    return "B"
                else:
                    return "A"
            else:
                pass

    def get_answer_radio(self, randomExerciseSortId,answerList):
        '''单选题,答案获取'''
        for key in answerList:
            url = "https://hike-examstu.zhihuishu.com/zhsathome/randomExercise/submitAnswer?uuid={}".format(
                self.uuid)
            headers = {
                "Content-Type": "application/json",
            }
            data = {"data": {"answerContent": key, "fileList": [], "isReview": True,
                             "randomExerciseSortId": randomExerciseSortId,
                             "courseId": "10464858"}}

            res = requests.post(url, headers=headers, data=json.dumps(data))
            if res.json()["rt"] == True:
                if answerList.index(key) == 0:
                    return "A"
                elif answerList.index(key) == 1:
                    return "B"
                elif answerList.index(key) == 2:
                    return "C"
                elif answerList.index(key) == 3:
                    return "D"
                elif answerList.index(key) == 4:
                    return "E"
                elif answerList.index(key) == 5:
                    return "F"
            else:
                pass

    def get_answer_multi(self,randomExerciseSortId,answerList):
        '''多选题 答案获取'''
        url = "https://hike-examstu.zhihuishu.com/zhsathome/randomExercise/submitAnswer?uuid={}".format(
            self.uuid)
        headers = {
            "Content-Type": "application/json",
        }

        key_list = self.get_key(answerList)
        for key in key_list:
            if len(key)>0:
                key_new = [str(i) for i in key]
                key_str = ",".join(key_new)
                data = {"data": {"answerContent": str(key_str), "fileList": [], "isReview": True,
                                 "randomExerciseSortId": randomExerciseSortId,
                                 "courseId": "10464858"}}
                res = requests.post(url, headers=headers, data=json.dumps(data))
                if res.json()["rt"] == True:
                    r_answer_list = []
                    for i in key:
                        if answerList.index(i)==0:
                            r_answer_list.append("A")
                        if answerList.index(i)==1:
                            r_answer_list.append("B")
                        if answerList.index(i)==2:
                            r_answer_list.append("C")
                        if answerList.index(i)==3:
                            r_answer_list.append("D")
                        if answerList.index(i)==4:
                            r_answer_list.append("E")
                        if answerList.index(i)==5:
                            r_answer_list.append("F")
                    return ",".join(r_answer_list)
                else:
                    pass
            else:
                pass

    def get_key(self,answerList):
    	'''
		返回多选题选项所有不重复的组合
		'''
        lena = len(answerList)
        sum = []
        for i in range(2 ** lena):
            comb = []

            for j in range(lena):
                if (i >> j) % 2 == 1:
                    comb.append(answerList[j])

            sum.append(comb)
        return sum




if __name__ == '__main__':

    sp = Spider()
    sp.get_content()



  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
魔众题库系统采用PHP+Mysql架构,是一款对SEO非常友好、功能全面、安全稳定、支持多终端展示并且使用起来极其简单的在线题库管理系统。 魔众题库系统,融合在线题库和在线考试。 轻量小巧:这是一个轻量的系统 体积小速度快 系统安全:高效的轻量级程序 易于二次开发 负载高效:榨干硬件的全部运算性能 专业技术团队 在线考试:以最低的成本,组织最高效的考试 专项练习:模块化训练,快速提高答题能力 试题解析:简单、快速、准确 同步登录:墨子系列产品完美搭配使用 运行环境: 操作系统 Linux/Unix 或 Windows 软件环境 Laravel 5.1的运行环境 Apache/Nginx , PHP 5.5.9+ / PHP 7.0 , MySQL 5.0+ 魔众题库系统发布v3.1.0版本,新功能和Bug修复累计14项,VIP会员能支持,增强付费文章。 2020年06月01日魔众题库系统发布v3.1.0版本,增加了以下14个特性: [新功能] 增加“使用说明”和“安装说明”中英文版 [系统优化] 优化config:cache缓存配置信息 [新功能] 搜索页面增加搜索框 [新功能] 问题列表增加搜索框 [新功能] 新增系统全文索引支持(ElasticSearch) [新功能] 增加付费文章功能 [系统优化] 备案网站链接修复 [Bug修复] 解决SSO退出NotFound问题 [Bug修复] 富文本在Dialog中工具栏浮动定位问题修复 [系统优化] 后台问题编辑富文本定位优化,自动聚焦优化 [新功能] 增加会员VIP功能,支持付费查看问题答案 [新功能] 优化题目显示,优化答案显示逻辑 [系统优化] 富文本搜索优化 [系统优化] 搜索页面标题引号显示优化
1. 什么是 Java 异常? Java 异常是指程序执行期间可能发生的错误或异常情况,例如除以零、数组越界、空指针引用等。当这些异常发生时,Java 虚拟机会抛出一个异常对象,并且程序的执行流程将被中断。 2. Java 异常处理机制有哪些关键字和语句? Java 异常处理机制包括以下关键字和语句: - try:用于包含可能会抛出异常的代码块。 - catch:用于捕获指定类型的异常,并在捕获到异常时执行相应的处理代码。 - finally:用于包含无论是否发生异常都需要执行的代码块。 - throw:用于抛出指定的异常对象。 - throws:用于声明可能会抛出指定类型异常的方法。 3. Java 中的异常分为哪几类? Java 中的异常分为两大类:Checked Exception 和 Unchecked Exception。 Checked Exception 是指在编译时就能够检查出来的异常,例如 IOException、ClassNotFoundException 等。程序必须显式地处理这些异常,否则编译不通过。 Unchecked Exception 是指在运行时才能检查出来的异常,例如 NullPointerException、ArrayIndexOutOfBoundsException 等。程序可以选择处理这些异常,但不处理也不会导致编译错误。 4. 请简要说明 try-catch-finally 的执行流程。 当程序执行到 try 块时,Java 会尝试执行其中的代码。如果在 try 块中抛出了异常,则会将异常对象传递给 catch 块进行处理。catch 块会匹配异常类型,如果匹配成功,则执行相应的处理代码。如果 catch 块处理完异常后,程序需要继续执行,则会执行 finally 块中的代码。如果 finally 块中也抛出了异常,则该异常会覆盖 try 或 catch 块中的异常。 如果 try 块中没有抛出异常,则 catch 块不会被执行。如果 finally 块中抛出异常,则该异常会覆盖 try 块中的异常。 5. 什么是异常链? 异常链是指在处理异常时,将一个异常对象作为另一个异常的原因,并将它们组合成一个异常链。这样做的好处是,在抛出异常时可以同时传递多个异常信息,从而更加清晰地表示异常发生的原因。 6. 请简要说明 try-with-resources 的作用和使用方法。 try-with-resources 是 Java 7 中引入的语法,用于自动关闭实现了 AutoCloseable 接口的资源。在 try 块中声明需要使用的资源,Java 会在 try 块执行完毕后自动关闭这些资源,无需手动调用 close 方法。 try-with-resources 的语法如下: ``` try (Resource1 r1 = new Resource1(); Resource2 r2 = new Resource2()) { // 使用资源 } catch (Exception e) { // 处理异常 } ``` 7. 请简要说明 Java 中的文本 IO。 Java 中的文本 IO 主要包括两种类:Reader 和 Writer。Reader 用于读取字符流,而 Writer 用于写入字符流。 Java 中常用的 Reader 类包括 InputStreamReader、FileReader 和 BufferedReader,常用的 Writer 类包括 OutputStreamWriter、FileWriter 和 BufferedWriter。这些类提供了各种方法来读取和写入字符流,并且可以处理多种编码格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值