wrom3419 发表于 2024-11-16 18:49

使用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()

lyzxx 发表于 2024-11-16 22:57

可以通过打开浏览器开发者工具(按 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()

资料爬虫 发表于 2024-11-16 19:32

具体界面不清楚,理论上采用异步请求处理,速度是不是可以更快呢

matxi 发表于 2024-11-16 19:41

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= 错误部分,确保将计算结果正确提交

tianjt 发表于 2024-11-16 21:13

(\d+)\s*([+\-*/×÷])\s*(\d+)

这个是正则表达式吧

pHz 发表于 2024-11-17 10:19

同步Cookies试一下或者更新一下请求头

wrom3419 发表于 2024-11-17 19:02

pHz 发表于 2024-11-17 10:19
同步Cookies试一下或者更新一下请求头

好的,我先试试

wrom3419 发表于 2024-11-17 19:03

lyzxx 发表于 2024-11-16 22:57
可以通过打开浏览器开发者工具(按 F12 或右键选择“检查”),在“网络”标签中,找到与答案提交相关的请 ...

太感谢了
页: [1]
查看完整版本: 使用python进行网络数学计算的求助