利用Python开发一个自动答题程序
魔王不会哭 人气:0环境使用
Python 3.8
–> 解释器 <执行python代码>
Pycharm
–> 编辑器 <写python代码的>
模块使用
import requests —> 数据请求模块 pip install requests
import re
from selenium import webdriver —> 自动测试模块 pip install selenium==3.141.0 <指定版本安装>
默认安装 selenium 安装 4.0 和 3.0 语法上面有区别, 但是方法一样
自动答题思路步骤
一. 获取题目答案 <完成>
答案页面 --> 是有答案内容的
找到所有答案页面ID, 就可以获取所有题目答案内容了 --> 分析答案页面ID在哪里可以获取
1.通过开发者工具进行抓包分析
- 打开开发者工具: F12 或者 鼠标右键点击检查选择network
- 刷新网页: 让文本网页的数据内容重新加载一遍
- 关键字搜索: 通过搜索 答案ID, 去查询对应数据包
2.通过代码, 然后获取答案内容:
代码基本四大步骤: 发送请求 --> 获取数据 --> 解析数据 --> 保存数据
a.发送请求, 模拟浏览器对于url地址发送请求
请求地址: 答案页面url
b.获取数据, 获取页面网页源代码
c.解析数据, 提取我们想要的数据内容
答案选项
二. 把题目答案和选项进行比较, 自动选择正确答案
模拟人的行为去答题:
- 打开浏览器
- 输入答题网址
因为有1700多题目, 重复操作
- 选择正确选项
- 点击下一题
代码展示
# 导入数据请求模块 --> 第三方模块, 需要安装 pip install requests import requests # 导入正则模块 --> 内置模块, 不需要安装 import re # 导入自动化模块 --> 第三方模块, 需要安装 pip install selenium==3.141.0 <指定版本安装> from selenium import webdriver """ 1. 打开浏览器 配置浏览器驱动: 大版本一样, 小版本最相近即可 """ driver = webdriver.Chrome(r'D:\download\anaconda\chromedriver.exe') # 2. 访问网站 driver.get('https://www.jsyks.com/kms-sxlx') # 设置全屏 driver.maximize_window() # 读取答案文本内容, 获取答案ID <读取数据> f = open('答案ID.txt', encoding='utf-8') # 字符串分割方法: split() --> 字符串数据变成列表 answer_id_list = f.read().split(',') # for循环遍历, 把列表里面元素一个一个提取出来 for answer_id in answer_id_list: """ 1. 发送请求, 模拟浏览器对于url地址发送请求 请求地址: 答案页面url - 安装模块: I. 点击pycharm终端 输入命令 pip install requests II. win + R 输入cmd 输入命令 pip install requests - 模拟浏览器发送请求 好处: 防止被反爬 headers 请求头 --> 可以复制 - <Response [200]> 表示响应对象 Response: 中文意思响应/回复/回答 <>: 表示对象 200: 状态码 表示请求成功 --> 相当于你打电话, 打通了有嘟嘟嘟声音 404: 链接不对 --> 相当于你打电话, 你所拨打的电话是空号 打乱了 --> 题目 + 答案内容 都保存下来, 然后进行对比 """ # 构建答案页面url --> f'{}' 字符串格式化方法 --> format answer_url = f'https://tiba.jsyks.com/Post/{answer_id}.htm' # 伪装模拟 headers = { # User-Agent 表示浏览器基本身份标识 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36' } # 发送请求 response = requests.get(url=answer_url, headers=headers) """ 2. 获取数据, 获取页面网页源代码 3. 解析数据, 提取我们想要答案内容 正则表达式: 会 1 不会 0 re.findall('匹配的数据', '什么地方匹配') --> re模块里面findall方法: 找到所有我们想要的数据内容 (.*?) --> ()精确匹配 .匹配任意字符(除了\n换行符) *匹配前一个字符0或者N个 ? 非贪婪匹配模式 网站不同, 数据结构不同 --> 基本上一个代码对一个网站 """ answer = re.findall('答案是:(.*?)。', response.text)[0] print(answer) if answer == '对': answer = 'Y' elif answer == '错': answer = 'N' """ 选择正确答案进行点击操作: 先定位元素, 然后再进行操作 find_element_by_css_selector --> 通过css选择器查找元素 len() 统计元素个数 answer --> A 元素只有一个 <单选题> answer --> ABD 元素三个 <多选题> """ if len(answer) == 1: driver.find_element_by_css_selector(f'#btn{answer}').click() # 点击下一题 driver.find_element_by_css_selector('#btn_PN span').click() elif len(answer) > 1: # len(answer) --> 3 num -> 0 / 1 / 2 for num in range(len(answer)): driver.find_element_by_css_selector(f'#btn{answer[num]}').click() # 点击确定选好了的按钮 driver.find_element_by_css_selector('#ExamOptDa input').click() # 点击下一题 driver.find_element_by_css_selector('#btn_PN span').click()
加载全部内容