吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 391|回复: 7
收起左侧

[求助] 使用python进行网络数学计算的求助

[复制链接]
wrom3419 发表于 2024-11-16 18:49
本帖最后由 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)[url=]Undo[/url]
                     }
        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 中来实现会话共享。
[Python] 纯文本查看 复制代码
# 从 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 标签或编码方式可能与代码中的处理方式不一致。

以下是修改后的代码:
[Python] 纯文本查看 复制代码
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
[Python] 纯文本查看 复制代码
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 或右键选择“检查”),在“网络”标签中,找到与答案提交相关的请 ...

太感谢了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表