admin管理员组

文章数量:1574516

使用Python实现自动刷题 P2

只做学习交流,不做任何商业用途

不同于P1的漏洞,这次是题库爬到本地进行匹配

没有第一篇详细,主要讲讲思路传送门
集刷题和补全题库为一体

源码:

  • github: https://github/liliuyang-808/sab.git
  • 百度网盘: 链接:https://pan.baidu/s/1UdPIlQyd1_nudhdjespdfA 提取码:1320

在百度网盘里有操作视频

因为直接用答题的网站违规 , 所以自己写了个答题网站 . 在源码里有.
写的稀烂,凑活着看.

大体思路

  • 控制浏览器模拟点击
  • 将题目和答案存进txt , 用正则匹配
  • 将txt里题目和答案补全(来回爬…)

需要导入的模块

  • from selenium import webdriver 控制浏览器用
    • selenium下载地址
    • chrome浏览器下载地址
    • chromedrive
    • 火狐drive
    • edge_drive
    • 推荐篇配置教程
  • import time 控制程序暂停防止网络延迟出现错误
    • py3内置模块不用下载
  • import re

导入模块

from selenium import webdriver
import re

初始化环境

dr = webdriver.Chrome()
dr.maximize_window()
dr.get('答题网站地址/bank/index.html')

  • 答题网站页面

自动选题

爬取页面中所有题目和选项

html = dr.page_source
timu = re.findall('<div class="sec_next">(.*?)</div>', html)  # 爬取答案

# 爬取题目 多做一步原因是要分出一题多少选项
xuxa_s = re.findall('<ul>(.*?)</ul>', html.replace("\n", ""))
xuxa = []
for i in xuxa_s:
    xuxa.append(re.findall('<label for=".*?">(.*?)</label>', i))
# 现在 xuxa列表里是[[A..,B..,C..,D..,E..],[A..],[A..,B..]]

存储所有选项按钮

  • 正确答案在整合后会以索引方式结束 , 用索引去点击选项
button=[]#存储所有选项按钮
for nk in dr.find_elements_by_tag_name("input"):
    button.append(nk)

在txt文件中爬下存储好的题目->答案(如果没有也没问题,有补全的代码)

with open(r'./write.txt', encoding='utf-8') as f:
    res = f.read()
reo_timu=re.findall('题目:(.*?)\n',res)
reo_xuxa=re.findall('答案:(.*?)\n',res)


到正文了

also=[] #所有正确答案 一维数组
also_txt=[]#正确答案 不过有特殊定义的符号 "|" 可以看上面那张图最后一行 这是隔开多个选项用的
number=[]#存储txt中没有的题目的序号 在最后补全txt的地方有用到

xuxa_index=[i for arr in xuxa for i in arr]#转成一维数组方便对齐索引
"""
因为 xuxa列表为了让56个乃至10个选项穿插在整体中而程序不崩溃 ,才出此下策
[[A..,B..,C..,D..,E..],[A..],[A..,B..]]
但是所有选项按钮却是个一维的数组
需要让答案下标和选项按钮下标对齐才好操作
"""
for i in range(0,len(timu)):
    if timu[i] in reo_timu:#判断页面中的题目在txt中存不存在
        also_txt.append(reo_xuxa[reo_timu.index(timu[i])])#正确答案 (目前还是文字形式)
    else:
        number.append(i)#没有的题目的序号
        also_txt.append(xuxa[i][0])#如果没有 , 填入选项中第一项
for a in also_txt:
    lis = a.split('|')
    for j in lis:
        also.append(j)#在这里所有正确选项变成一维数组

将选项列表变成下标索引 并点击

#所有正确选项索引
index=[]
for i in also:
    index.append(xuxa_index.index(i))

#用正确答案索引点击按钮
for i in index:
    button[i].click()

自动爬取补满文档

提交后补全txt部分

  • 将错题目答案放入add_to 在写入txt
  • 这里就不过多赘述. 每个网站交卷后都不一样 ,这里逻辑简单根据需要更改就行
input("提交后: ")

add_to = {}
lang=dr.page_source
temp = re.findall('<span>(.*?)</span>', lang)

for num in number:
    add_to[timu[num]]=temp[num]
print(add_to)

write_in = open(r'./write.txt', 'a', encoding='utf-8')  # 用可读写的权限打开txt
for code_a, answer_a in add_to.items():  # 同上一个for一样的道理
    write_in.write("题目:" + code_a + "\n")  # 存储正确的题目和正确答案
    write_in.write("答案:" + answer_a + "\n")  # 同上

一切只做学习交流, 不做任何商业用途

  • 为什么不用ABCD 或者编号直接代替正确答案:
    • 因为有些网站答案随机排序
受一大佬启发才写出这里,也许没大佬到死也完不成[万分感谢,向您鞠躬]

上一篇违禁文章里的问题有位大佬解决了
取图片地址 relativePath后面两个哈希值 第二个哈希值减去账号id就是真实的图片地址
relativePath=0009000/1543302712345/bf1b51531de4c292667e1c4c2300b603.jpg&imageType=2
https://tiku.kgc/testing/index/123456/a76e1c6d3baf4be1b9aa172fa6273305

我qq:2025450852 欢迎交流

本文标签: Python