使用python进行网络数学计算的求助
本帖最后由 wrom3419 于 2024-11-16 21:58 编辑大佬们求助一个题,我在运行以下代码的时候网页并没有变化,只是一直在刷新数学题(是因为提交答案的url不对吗,有什么方法可以找到url)
Kengwang的数学特别差,他的计算器坏掉了,你能快速帮他完成数学计算题吗?
每一道题目需要在5秒内解出,传入到$_P0ST['answer']中,解出50道即可,除法
取整
本题依赖session,请在请求时开启session cookie
以下是我写的代码
import requests
import re
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# URL设置
url = ""# 替换为实际的题目页面URL
submit_url = ""# 替换为提交答案的URL
# 初始化浏览器和会话
driver = webdriver.Chrome()# 请确保已安装Chrome驱动
session = requests.Session()
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
for i in range(50):# 解答50题
# Step 1: 获取题目内容
driver.get(url)
time.sleep(2)# 等待页面加载
try:
question_text = driver.find_element(By.TAG_NAME, "body").text
print("题目内容:", question_text)
# 更新正则表达式以匹配加、减、乘、除的所有可能情况,支持 ÷ 符号
match = re.search(r"(\d+)\s*([\+\-\*/×÷])\s*(\d+)", question_text)
print("匹配结果:", match.groups() if match else "未匹配到")
if not match:
print("未找到题目格式")
break
# Step 2: 解析并计算答案
num1, operator, num2 = int(match.group(1)), match.group(2), int(match.group(3))
if operator == '+':
answer = num1 + num2
elif operator == '-':
answer = num1 - num2
elif operator in ['*', '×']:# 支持乘号的不同表示
answer = num1 * num2
elif operator in ['//', '÷']:# 支持除号的不同表示
answer = num1 / num2# 整除
print(f"解析结果:{num1} {operator} {num2} = {answer}")
# Step 3: 提交答案
post_data = {
'answer': str(answer)Undo
}
result = session.post(submit_url, data=post_data)
# 控制解题速度,避免超过每题5秒
time.sleep(0.5)
except Exception as e:
print("发生错误:", e)
break
input("按回车键关闭浏览器...")
driver.quit()
# 关闭浏览器
#driver.quit() 可以通过打开浏览器开发者工具(按 F12 或右键选择“检查”),在“网络”标签中,找到与答案提交相关的请求(可以通过提交按钮操作后查看网络活动),点击这个请求,复制请求的 URL 和必要的 Headers。
本题提到需要使用 Session Cookie。Selenium 和 requests 需要共享相同的会话数据。
可以通过从 Selenium 获取 Cookies 并将其应用到 requests.Session 中来实现会话共享。
# 从 Selenium 导出 Cookies 并应用到 requests.Session
cookies = driver.get_cookies()
for cookie in cookies:
session.cookies.set(cookie['name'], cookie['value'])
需要修正的问题:
1、你代码中的url 和 submit_url没有配置,必须用正确的路径替代。
2、除法的整除逻辑错误:应使用 //(整除运算符),而不是 /(浮点数)。
3、确保匹配运算符号:÷ 和 // 应被统一处理。
4、检查题目文本的提取逻辑:有时题目文本的 HTML 标签或编码方式可能与代码中的处理方式不一致。
以下是修改后的代码:
import requests
import re
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# URL设置
url = "http://example.com/question"# 替换为题目页面URL
submit_url = "http://example.com/submit"# 替换为提交答案的URL
# 初始化浏览器和会话
driver = webdriver.Chrome()# 请确保已安装Chrome驱动
session = requests.Session()
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
for i in range(50):# 解答50题
try:
# Step 1: 获取题目内容
driver.get(url)
time.sleep(2)# 等待页面加载
question_text = driver.find_element(By.TAG_NAME, "body").text
print("题目内容:", question_text)
# 匹配数字和运算符
match = re.search(r"(\d+)\s*([\+\-\*/×÷])\s*(\d+)", question_text)
if not match:
print("未找到题目格式")
break
# Step 2: 解析并计算答案
num1, operator, num2 = int(match.group(1)), match.group(2), int(match.group(3))
if operator == '+':
answer = num1 + num2
elif operator == '-':
answer = num1 - num2
elif operator in ['*', '×']:
answer = num1 * num2
elif operator in ['//', '÷']:
answer = num1 // num2# 整除
print(f"解析结果:{num1} {operator} {num2} = {answer}")
# Step 3: 提交答案
# 获取 Selenium Cookies 并传递到 requests.Session
cookies = driver.get_cookies()
for cookie in cookies:
session.cookies.set(cookie['name'], cookie['value'])
post_data = {
'answer': answer
}
result = session.post(submit_url, data=post_data, headers=headers)
print("提交结果:", result.text)
# 控制解题速度,避免超过每题5秒
time.sleep(0.5)
except Exception as e:
print("发生错误:", e)
break
driver.quit() 具体界面不清楚,理论上采用异步请求处理,速度是不是可以更快呢 import requests
import re
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# URL设置
url = ""# 替换为实际的题目页面URL
submit_url = ""# 替换为提交答案的URL
# 初始化浏览器和会话
driver = webdriver.Chrome()# 请确保已安装Chrome驱动
session = requests.Session()
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
for i in range(50):# 解答50题
# Step 1: 获取题目内容
driver.get(url)
time.sleep(2)# 等待页面加载
try:
question_text = driver.find_element(By.TAG_NAME, "body").text
print("题目内容:", question_text)
# 更新正则表达式以匹配加、减、乘、除的所有可能情况,支持 ÷ 符号
match = re.search(r"(\d+)\s*([+\-*/×÷])\s*(\d+)", question_text)
print("匹配结果:", match.groups() if match else "未匹配到")
if not match:
print("未找到题目格式")
break
# Step 2: 解析并计算答案
num1, operator, num2 = int(match.group(1)), match.group(2), int(match.group(3))
if operator == '+':
answer = num1 + num2
elif operator == '-':
answer = num1 - num2
elif operator in ['*', '×']:# 支持乘号的不同表示
answer = num1 * num2
elif operator in ['/','÷']:# 支持除号的不同表示
answer = num1 // num2# 整除
print(f"解析结果:{num1} {operator} {num2} = {answer}")
# Step 3: 提交答案
post_data = {
'answer': str(answer)
}
result = session.post(submit_url, data=post_data, headers=headers)
# 控制解题速度,避免超过每题5秒
time.sleep(0.5)
except Exception as e:
print("发生错误:", e)
break
input("按回车键关闭浏览器...")
driver.quit()
除法修改: num1 / num2 改为 num1 // num2,实现整除, 将 re.search() 的匹配规则修改为 r"(\d+)\s*([+\-*/×÷])\s*(\d+)",支持 +、-、*、/、×、÷ 符号 删除了 url= 错误部分,确保将计算结果正确提交 (\d+)\s*([+\-*/×÷])\s*(\d+)
这个是正则表达式吧 同步Cookies试一下或者更新一下请求头 pHz 发表于 2024-11-17 10:19
同步Cookies试一下或者更新一下请求头
好的,我先试试 lyzxx 发表于 2024-11-16 22:57
可以通过打开浏览器开发者工具(按 F12 或右键选择“检查”),在“网络”标签中,找到与答案提交相关的请 ...
太感谢了
页:
[1]