用通义大模型写爬虫程序,汇总各科成绩

news2025/3/19 17:16:35

需求:根据各科网址,输入学号、姓名查询成绩。

中间反反复复很多次,本文只记下重点的几次和大模型的沟通历史。

输入界面

查询界面

round0(最初的问题)

请在windows下,使用python的selenium库,输入考号和姓名,点击查询按钮, 并输出总分、班名、校名,请用提供代码

谷歌驱动地址:C:/chrome_drv/chromedriver.exe
查询网址:https://w2sl19od.yichafen.com/qz/122DxDre
xpath信息:
考号:/html/body/div[1]/form/div[2]/div[1]/div[2]/input
姓名:/html/body/div[1]/form/div[2]/div[2]/div[2]/input 查询按钮:/html/body/div[1]/div[2]/button
总分:/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]
班名:/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]
校名:/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]
考生信息: 考号:250152001 姓名:赵志立

round1(想查询多个学生的多门成绩)

请在windows下,使用python的selenium库,打开课程查询地址,输入考号、姓名,点击查询按钮, 获取课程的分数、班名、校名。
其中课程查询地址、考号、姓名都发在c:\查分系统.xlsx中。
其中sheet1,存放着课程名称、地址;sheet2,存放着考号、姓名。
请找到每个学生,遍历每一门课程,获取课程名称、分数、班名、校名,存在sheet3中
同时把学生的姓名、各科成绩放到sheet4中的每行中。
注意课程名称是从sheet1中遍历获取,可能是多门课程。
 
谷歌驱动地址:C:/chrome_drv/chromedriver.exe
xpath信息:
考号:/html/body/div[1]/form/div[2]/div[1]/div[2]/input
姓名:/html/body/div[1]/form/div[2]/div[2]/div[2]/input
查询按钮:/html/body/div[1]/div[2]/button
分数:/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]
班名:/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]
校名:/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]

round2

不对,sheet4中存放的是多门课程的分数。具体有哪些课程,需要从sheet1中获取

round3

再修改一下,第一次循环是,清空sheet3和sheet4

round4

还要修改,sheet3中增加一列:姓名,放到第一列中

round5

在sheet4中再增加一个总分数,是各科成绩之和

round6

再修改一下,每查完一个学生的全部成绩,要写入excel

round7(代码有问题)

再优化一下,1、每个学生成绩查完后,从程序输出。2、如果查询出错,自动跳入查询下一个人成绩

round9(因round7代码有问题,转到grok)

请修改如下代码(就是通义在round6中提供的),优化一下:注意事项 1、因为有可能程序运行中报错,为保证数据,每次获取一个学生成绩后,都要写入excel 2、每次获取一个学生成绩后,需要通过日志输出,这样能看到程序的执行过程

round10

请优化代码,优化方向:
1、不启用无头模式
2、还是采用之前提供的xpath方式
3、学生的总成绩是各课程相加,请查询完一个学生的全部成绩后再日志总输出各门成绩和总成绩 4、调整 sheet4 列顺序(确保总分数在最后)这段代码很啰嗦,要重点优化
5、WebDriverWait(driver, 20). 这部分代码中,如果等待不到元素,不必再查询此学生的其他课程成绩,直接关闭浏览器,再打开浏览器进入下一名学生

round11

不错,可以运行,还需要再优化一下。如果一个学生的成绩查询不报错,不必关闭浏览器,直接查询下一个就行。如果这个学生报错了,就关闭浏览器,然后重新打开浏览器查下一个学生。

代码部分

round0代码(查询单人、单科成绩)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 配置Chrome驱动
chrome_driver_path = "C:/chrome_drv/chromedriver134.exe"
service = Service(executable_path=chrome_driver_path)
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")  # 最大化窗口

# 初始化浏览器
driver = webdriver.Chrome(service=service, options=options)

# 访问查询网址
driver.get("https://w2sl19od.yichafen.com/qz/******")

try:
    # 显式等待页面加载
    wait = WebDriverWait(driver, 10)

    # 输入考号
    exam_no = wait.until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/form/div[2]/div[1]/div[2]/input")))
    exam_no.send_keys("**考号")

    # 输入姓名
    name = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/form/div[2]/div[2]/div[2]/input")))
    name.send_keys("**姓名")

    # 点击查询按钮
    query_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div[2]/button")))
    query_btn.click()

    # 等待结果加载
    time.sleep(3)  # 根据实际网络情况调整等待时间

    # 获取成绩信息
    total_score = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]").text
    class_rank = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]").text
    school_rank = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]").text

    # 输出结果
    print(f"总分:{total_score}")
    print(f"班名:{class_rank}")
    print(f"校名:{school_rank}")

except Exception as e:
    print("查询过程中出现错误:", str(e))

finally:
    # 关闭浏览器
    driver.quit()

round6代码 

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from openpyxl import load_workbook

# 设置Chrome驱动路径
chrome_driver_path = "C:/chrome_drv/chromedriver.exe"
service = Service(chrome_driver_path)

# 加载Excel文件
excel_path = "c:/查分系统.xlsx"
df_courses = pd.read_excel(excel_path, sheet_name='sheet1')
df_students = pd.read_excel(excel_path, sheet_name='sheet2')

# 初始化webdriver
driver = webdriver.Chrome(service=service)


def write_to_excel(all_results, student_results):
    # 清理并写入Excel
    wb = load_workbook(excel_path)
    if 'sheet3' in wb.sheetnames:
        wb.remove(wb['sheet3'])
    if 'sheet4' in wb.sheetnames:
        wb.remove(wb['sheet4'])
    wb.save(excel_path)
    wb.close()

    with pd.ExcelWriter(excel_path, engine='openpyxl', mode='a') as writer:
        # 写入sheet3,包含姓名、课程名称、分数、班名、校名
        pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名']).to_excel(writer,
                                                                                                 sheet_name='sheet3',
                                                                                                 index=False)
        # 使用pd.json_normalize将字典转换为DataFrame,并确保‘总分数’列被正确处理
        student_df = pd.json_normalize(student_results)
        # 调整列顺序以确保‘总分数’列的位置合适,这里假设放在最后一列
        cols = list(student_df.columns)
        if '总分数' in cols:
            cols.remove('总分数')
            student_df = student_df[cols + ['总分数']]
        student_df.to_excel(writer, sheet_name='sheet4', index=False)


all_results = []
student_results = []

for index, student in df_students.iterrows():
    student_name = student['姓名']
    student_exam_id = student['考号']  # 修正此处的赋值语句
    student_scores = {'姓名': student_name}  # 存储单个学生的姓名和各科成绩
    total_score = 0  # 初始化总分数

    for course_index, course in df_courses.iterrows():
        course_url = course['地址']
        course_name = course['课程名称']

        # 打开课程查询页面
        driver.get(course_url)

        # 输入考号和姓名
        driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[1]/div[2]/input").send_keys(student_exam_id)
        driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[2]/div[2]/input").send_keys(student_name)

        # 点击查询按钮
        driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/button").click()

        time.sleep(2)  # 给予页面加载时间

        # 获取成绩等信息
        score = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]").text
        class_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]").text
        school_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]").text

        # 将结果添加到列表中,并包含学生姓名
        all_results.append([student_name, course_name, score, class_name, school_name])
        student_scores[course_name] = float(score) if score.replace('.', '', 1).isdigit() else 0  # 添加该生的这门课成绩,并转换为浮点数
        total_score += float(score) if score.replace('.', '', 1).isdigit() else 0  # 计算总分

    student_scores['总分数'] = total_score  # 添加总分数到学生的成绩字典中
    student_results.append(student_scores)

    # 每个学生完成后,写入Excel
    write_to_excel(all_results, student_results)

# 关闭浏览器
driver.quit()

round8代码(grok提供)

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from openpyxl import load_workbook
import logging

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 设置 Chrome 驱动路径
chrome_driver_path = "C:/chrome_drv/chromedriver.exe"
service = Service(chrome_driver_path)

# 加载 Excel 文件
excel_path = "c:/查分系统.xlsx"
df_courses = pd.read_excel(excel_path, sheet_name='sheet1')
df_students = pd.read_excel(excel_path, sheet_name='sheet2')

# 初始化 webdriver(使用 headless 模式)
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无界面模式,提高性能
driver = webdriver.Chrome(service=service, options=options)

def write_to_excel(all_results, student_results):
    """将查询结果写入 Excel 文件的 sheet3 和 sheet4"""
    # 清理已有 sheet
    wb = load_workbook(excel_path)
    if 'sheet3' in wb.sheetnames:
        wb.remove(wb['sheet3'])
    if 'sheet4' in wb.sheetnames:
        wb.remove(wb['sheet4'])
    wb.save(excel_path)
    wb.close()

    # 写入数据
    with pd.ExcelWriter(excel_path, engine='openpyxl', mode='a') as writer:
        # 写入 sheet3:详细成绩
        pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名']).to_excel(
            writer, sheet_name='sheet3', index=False
        )
        # 写入 sheet4:学生总览
        student_df = pd.json_normalize(student_results)
        cols = list(student_df.columns)
        if '总分数' in cols:
            cols.remove('总分数')
            student_df = student_df[cols + ['总分数']]  # 确保“总分数”列在最后
        student_df.to_excel(writer, sheet_name='sheet4', index=False)

# 初始化结果存储列表
all_results = []  # 存储所有学生的每门课程详细信息
student_results = []  # 存储每个学生的成绩字典

# 遍历学生
for index, student in df_students.iterrows():
    student_name = student['姓名']
    student_exam_id = student['考号']
    student_scores = {'姓名': student_name}  # 存储单个学生的成绩
    total_score = 0  # 初始化总分

    logging.info(f"开始查询学生: {student_name}")

    # 遍历课程
    for course_index, course in df_courses.iterrows():
        course_url = course['地址']
        course_name = course['课程名称']

        try:
            # 打开查询页面
            driver.get(course_url)
            logging.info(f"访问课程页面: {course_url}")

            # 输入考号和姓名
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[1]/div[2]/input").send_keys(student_exam_id)
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[2]/div[2]/input").send_keys(student_name)

            # 点击查询按钮
            driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/button").click()

            time.sleep(2)  # 等待页面加载

            # 获取成绩和班级信息
            score = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]").text
            class_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]").text
            school_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]").text

            # 存储结果
            all_results.append([student_name, course_name, score, class_name, school_name])
            student_scores[course_name] = float(score) if score.replace('.', '', 1).isdigit() else 0
            total_score += float(score) if score.replace('.', '', 1).isdigit() else 0

            logging.info(f"成功获取 {student_name} 的 {course_name} 成绩: {score}")

        except (NoSuchElementException, TimeoutException) as e:
            # 错误处理:记录错误并填入默认值
            logging.error(f"查询 {student_name} 的 {course_name} 时出错: {e}")
            all_results.append([student_name, course_name, 'N/A', 'N/A', 'N/A'])
            student_scores[course_name] = 0

    # 添加总分
    student_scores['总分数'] = total_score
    student_results.append(student_scores)

    # 每个学生完成后,写入 Excel
    write_to_excel(all_results, student_results)
    logging.info(f"已将 {student_name} 的成绩写入 Excel")

# 关闭浏览器
driver.quit()
logging.info("所有学生成绩查询完成")

最终:

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from openpyxl import load_workbook
import logging

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 设置 Chrome 驱动路径
chrome_driver_path = "C:/chrome_drv/chromedriver.exe"
service = Service(chrome_driver_path)

# 加载 Excel 文件
excel_path = "c:/查分系统.xlsx"
df_courses = pd.read_excel(excel_path, sheet_name='sheet1')
df_students = pd.read_excel(excel_path, sheet_name='sheet2')

# 初始化 webdriver(使用 headless 模式)
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无界面模式
driver = webdriver.Chrome(service=service, options=options)

def append_to_excel(all_results, student_results, excel_path="c:/查分系统.xlsx"):
    """将查询结果追加到 Excel 文件的 sheet3 和 sheet4"""
    try:
        # 加载现有 Excel 文件
        wb = load_workbook(excel_path)

        # 处理 sheet3
        if 'sheet3' in wb.sheetnames:
            # 读取现有 sheet3 数据
            sheet3_df = pd.read_excel(excel_path, sheet_name='sheet3')
            # 将新数据转换为 DataFrame
            new_sheet3_df = pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名'])
            # 追加新数据
            sheet3_df = pd.concat([sheet3_df, new_sheet3_df], ignore_index=True)
        else:
            # 如果 sheet3 不存在,直接使用新数据
            sheet3_df = pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名'])

        # 处理 sheet4
        if 'sheet4' in wb.sheetnames:
            # 读取现有 sheet4 数据
            sheet4_df = pd.read_excel(excel_path, sheet_name='sheet4')
            # 将新数据转换为 DataFrame
            new_sheet4_df = pd.json_normalize(student_results)
            # 追加新数据
            sheet4_df = pd.concat([sheet4_df, new_sheet4_df], ignore_index=True)
        else:
            # 如果 sheet4 不存在,直接使用新数据
            sheet4_df = pd.json_normalize(student_results)

        # 调整 sheet4 的列顺序,确保 '总分数' 在最后
        if '总分数' in sheet4_df.columns:
            cols = [col for col in sheet4_df.columns if col != '总分数']
            sheet4_df = sheet4_df[cols + ['总分数']]

        # 保存到 Excel
        with pd.ExcelWriter(excel_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
            sheet3_df.to_excel(writer, sheet_name='sheet3', index=False)
            sheet4_df.to_excel(writer, sheet_name='sheet4', index=False)

        logging.info("成功追加数据到 Excel 文件")
    except Exception as e:
        logging.error(f"追加数据到 Excel 文件时出错: {e}")
        raise

# 初始化结果存储
all_results = []  # 存储所有学生的每门课程详细信息
student_results = []  # 存储每个学生的成绩字典

# 遍历学生
for index, student in df_students.iterrows():
    student_name = student['姓名']
    student_exam_id = student['考号']
    student_scores = {'姓名': student_name}  # 存储单个学生的成绩
    total_score = 0  # 初始化总分

    logging.info(f"开始查询学生: {student_name}")

    # 遍历课程
    for course_index, course in df_courses.iterrows():
        course_url = course['地址']
        course_name = course['课程名称']

        try:
            # 打开查询页面
            driver.get(course_url)
            logging.info(f"访问课程页面: {course_url}")

            # 输入考号和姓名
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[1]/div[2]/input").send_keys(student_exam_id)
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[2]/div[2]/input").send_keys(student_name)

            # 点击查询按钮
            driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/button").click()

            time.sleep(2)  # 等待页面加载

            # 获取成绩和班级信息
            score = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]").text
            class_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]").text
            school_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]").text

            # 存储结果
            all_results.append([student_name, course_name, score, class_name, school_name])
            student_scores[course_name] = float(score) if score.replace('.', '', 1).isdigit() else 0
            total_score += float(score) if score.replace('.', '', 1).isdigit() else 0

            logging.info(f"成功获取 {student_name} 的 {course_name} 成绩: {score}")

        except (NoSuchElementException, TimeoutException) as e:
            logging.error(f"查询 {student_name} 的 {course_name} 时出错: {e}")
            all_results.append([student_name, course_name, 'N/A', 'N/A', 'N/A'])
            student_scores[course_name] = 0

    # 添加总分
    student_scores['总分数'] = total_score
    student_results.append(student_scores)

# 所有查询完成后,追加数据到 Excel
try:
    append_to_excel(all_results, student_results)
    logging.info("所有结果成功追加到 Excel")
except Exception as e:
    logging.error(f"追加数据到 Excel 时出错: {e}")

# 关闭浏览器
driver.quit()
logging.info("所有学生成绩查询完成")

round10代码(查询报错,会退出当前学生,继续下一个。但是每查完一个学生后浏览器都退出一次)
 

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from openpyxl import load_workbook
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import logging

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 设置 Chrome 驱动路径
chrome_driver_path = "C:/chrome_drv/chromedriver.exe"
service = Service(chrome_driver_path)

# 加载 Excel 文件
excel_path = "c:/查分系统.xlsx"
df_courses = pd.read_excel(excel_path, sheet_name='sheet1')
df_students = pd.read_excel(excel_path, sheet_name='sheet2')

# 初始化 webdriver(不启用无头模式)
options = webdriver.ChromeOptions()
# options.add_argument('--headless')  # 已注释,不启用无头模式
driver = webdriver.Chrome(service=service, options=options)

def append_to_excel(all_results, student_results, excel_path="c:/查分系统.xlsx"):
    """将查询结果追加到 Excel 文件的 sheet3 和 sheet4"""
    try:
        # 加载现有 Excel 文件
        wb = load_workbook(excel_path)

        # 处理 sheet3
        if 'sheet3' in wb.sheetnames:
            sheet3_df = pd.read_excel(excel_path, sheet_name='sheet3')
            new_sheet3_df = pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名'])
            sheet3_df = pd.concat([sheet3_df, new_sheet3_df], ignore_index=True)
        else:
            sheet3_df = pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名'])

        # 处理 sheet4
        if 'sheet4' in wb.sheetnames:
            sheet4_df = pd.read_excel(excel_path, sheet_name='sheet4')
            new_sheet4_df = pd.json_normalize(student_results)
            sheet4_df = pd.concat([sheet4_df, new_sheet4_df], ignore_index=True)
        else:
            sheet4_df = pd.json_normalize(student_results)

        # 调整 sheet4 的列顺序,确保 '总分数' 在最后
        if '总分数' in sheet4_df.columns:
            cols = [col for col in sheet4_df.columns if col != '总分数']
            sheet4_df = sheet4_df[cols + ['总分数']]

        # 保存到 Excel
        with pd.ExcelWriter(excel_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
            sheet3_df.to_excel(writer, sheet_name='sheet3', index=False)
            sheet4_df.to_excel(writer, sheet_name='sheet4', index=False)

        logging.info("成功追加数据到 Excel 文件")
    except Exception as e:
        logging.error(f"追加数据到 Excel 文件时出错: {e}")
        raise

# 初始化结果存储
all_results = []  # 存储所有学生的每门课程详细信息
student_results = []  # 存储每个学生的成绩字典

# 遍历学生
for index, student in df_students.iterrows():
    student_name = student['姓名']
    student_exam_id = student['考号']
    student_scores = {'姓名': student_name}  # 存储单个学生的成绩
    total_score = 0  # 初始化总分

    logging.info(f"开始查询学生: {student_name}")

    # 遍历课程
    for course_index, course in df_courses.iterrows():
        course_url = course['地址']
        course_name = course['课程名称']

        try:
            # 打开查询页面
            driver.get(course_url)

            # 输入考号和姓名
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[1]/div[2]/input").send_keys(student_exam_id)
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[2]/div[2]/input").send_keys(student_name)

            # 点击查询按钮
            driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/button").click()

            time.sleep(1)  # 等待页面加载
            WebDriverWait(driver, 20).until(
                EC.presence_of_element_located((By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]")))

            # 获取成绩和班级信息
            score = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]").text
            class_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]").text
            school_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]").text

            # 存储结果
            all_results.append([student_name, course_name, score, class_name, school_name])
            student_scores[course_name] = float(score) if score.replace('.', '', 1).isdigit() else 0
            total_score += float(score) if score.replace('.', '', 1).isdigit() else 0

            logging.info(f"成功获取 {student_name} 的 {course_name} 成绩: {score}")

        except TimeoutException:
            logging.error(f"查询 {student_name} 的 {course_name} 时等待元素超时,跳过该学生剩余课程")
            break  # 跳出课程循环
        except NoSuchElementException as e:
            logging.error(f"查询 {student_name} 的 {course_name} 时未找到元素: {e}")
            all_results.append([student_name, course_name, 'N/A', 'N/A', 'N/A'])
            student_scores[course_name] = 0
    else:
        # 如果所有课程都查询成功,记录总成绩并日志输出
        student_scores['总分数'] = total_score
        student_results.append(student_scores)
        logging.info(f"学生 {student_name} 的成绩: {student_scores}, 总分: {total_score}")

    # 关闭浏览器并重新打开,准备查询下一个学生
    driver.quit()
    driver = webdriver.Chrome(service=service, options=options)

# 所有查询完成后,追加数据到 Excel
try:
    append_to_excel(all_results, student_results)
    logging.info("所有结果成功追加到 Excel")
except Exception as e:
    logging.error(f"追加数据到 Excel 时出错: {e}")

# 关闭浏览器
driver.quit()
logging.info("所有学生成绩查询完成")

round11代码(相当完美,查询出错时,关闭浏览器调到下一个学生)

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from openpyxl import load_workbook
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import logging

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 设置 Chrome 驱动路径
chrome_driver_path = "C:/chrome_drv/chromedriver.exe"
service = Service(chrome_driver_path)

# 加载 Excel 文件
excel_path = "c:/查分系统.xlsx"
df_courses = pd.read_excel(excel_path, sheet_name='sheet1')
df_students = pd.read_excel(excel_path, sheet_name='sheet2')

# 初始化 webdriver(不启用无头模式)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

def append_to_excel(all_results, student_results, excel_path="c:/查分系统.xlsx"):
    """将查询结果追加到 Excel 文件的 sheet3 和 sheet4"""
    try:
        wb = load_workbook(excel_path)

        # 处理 sheet3(每门课程的详细成绩)
        if 'sheet3' in wb.sheetnames:
            sheet3_df = pd.read_excel(excel_path, sheet_name='sheet3')
            new_sheet3_df = pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名'])
            sheet3_df = pd.concat([sheet3_df, new_sheet3_df], ignore_index=True)
        else:
            sheet3_df = pd.DataFrame(all_results, columns=['姓名', '课程名称', '分数', '班名', '校名'])

        # 处理 sheet4(每个学生的总成绩)
        if 'sheet4' in wb.sheetnames:
            sheet4_df = pd.read_excel(excel_path, sheet_name='sheet4')
            new_sheet4_df = pd.json_normalize(student_results)
            sheet4_df = pd.concat([sheet4_df, new_sheet4_df], ignore_index=True)
        else:
            sheet4_df = pd.json_normalize(student_results)

        # 调整 sheet4 列顺序,确保 '总分数' 在最后
        if '总分数' in sheet4_df.columns:
            cols = [col for col in sheet4_df.columns if col != '总分数']
            sheet4_df = sheet4_df[cols + ['总分数']]

        # 保存到 Excel
        with pd.ExcelWriter(excel_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
            sheet3_df.to_excel(writer, sheet_name='sheet3', index=False)
            sheet4_df.to_excel(writer, sheet_name='sheet4', index=False)

        logging.info("成功追加数据到 Excel 文件")
    except Exception as e:
        logging.error(f"追加数据到 Excel 文件时出错: {e}")
        raise

# 初始化结果存储
all_results = []  # 存储所有学生的每门课程详细信息
student_results = []  # 存储每个学生的成绩字典

# 遍历学生
for index, student in df_students.iterrows():
    student_name = student['姓名']
    student_exam_id = student['考号']
    student_scores = {'姓名': student_name}  # 存储单个学生的成绩
    total_score = 0  # 初始化总分
    error_occurred = False  # 标志位,记录是否发生错误

    logging.info(f"开始查询学生: {student_name}")

    # 遍历课程
    for course_index, course in df_courses.iterrows():
        if error_occurred:
            break  # 如果之前有错误,跳过该学生的剩余课程

        course_url = course['地址']
        course_name = course['课程名称']

        try:
            # 打开查询页面
            driver.get(course_url)

            # 输入考号和姓名
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[1]/div[2]/input").send_keys(student_exam_id)
            driver.find_element(By.XPATH, "/html/body/div[1]/form/div[2]/div[2]/div[2]/input").send_keys(student_name)

            # 点击查询按钮
            driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/button").click()

            time.sleep(1.5)  # 等待页面加载
            WebDriverWait(driver, 5).until(
                EC.presence_of_element_located((By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]")))

            # 获取成绩和班级信息
            score = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[5]/td[2]").text
            class_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[8]/td[2]").text
            school_name = driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[9]/td[2]").text

            # 存储结果
            all_results.append([student_name, course_name, score, class_name, school_name])
            student_scores[course_name] = float(score) if score.replace('.', '', 1).isdigit() else 0
            total_score += float(score) if score.replace('.', '', 1).isdigit() else 0

            logging.info(f"成功获取 {student_name} 的 {course_name} 成绩: {score}")

        except (TimeoutException, NoSuchElementException) as e:
            logging.error(f"查询 {student_name} 的 {course_name} 时出错: ")
            all_results.append([student_name, course_name, 'N/A', 'N/A', 'N/A'])
            student_scores[course_name] = 0
            error_occurred = True  # 设置错误标志
            break  # 停止查询该学生的剩余课程

    # 检查是否需要关闭浏览器
    if error_occurred:
        driver.quit()
        driver = webdriver.Chrome(service=service, options=options)
        logging.info(f"因错误关闭并重新打开浏览器,准备查询下一个学生")
    else:
        student_scores['总分数'] = total_score
        student_results.append(student_scores)
        logging.info(f"学生 {student_name} 的成绩: {student_scores}, 总分: {total_score}")

# 所有查询完成后,追加数据到 Excel
try:
    append_to_excel(all_results, student_results)
    logging.info("所有结果成功追加到 Excel")
except Exception as e:
    logging.error(f"追加数据到 Excel 时出错: {e}")

# 关闭浏览器
driver.quit()
logging.info("所有学生成绩查询完成")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商项目Ts版本

文章目录 项目地址一、环境安装1.1 配置作为导入1.2 文件目录 二、路由2.1 publicRoutes 项目地址 教程作者:教程地址: 代码仓库地址: 所用到的框架和插件: dbt airflow一、环境安装 1.1 配置作为导入 vite.config.ts impor…

HarmonyOS Next中的弹出框使用

HarmonyOS Next弹出框概述及分类 弹出框是一种模态窗口,通常用于在保持当前上下文环境的同时,临时展示用户需关注的信息或待处理的操作。用户需在模态弹出框内完成相关交互任务之后,才能退出模态模式。弹出框可以不与任何组件绑定&#xff0…

FPGA中级项目4——DDS实现

FPGA中级项目4——DDS实现 DDS简介 DDS(直接数字频率合成器,Direct Digital Frequency Synthesis)是一种基于数字信号处理技术的频率合成方法,广泛应用于通信、雷达、仪器仪表等领域。在 FPGA中实现 DDS 具有灵活性高、集成度强、…

STM32 DAC详解:从原理到实战输出正弦波

目录 一、DAC基础原理1.1 DAC的作用与特性1.2 DAC功能框图解析 二、DAC配置步骤2.1 硬件配置2.2 初始化结构体详解 三、DAC数据输出与波形生成3.1 数据格式与电压计算3.2 正弦波生成实战3.2.1 生成正弦波数组3.2.2 配置DMA传输3.2.3 定时器触发配置 四、常见问题与优化建议4.1 …

基于PyQt5与Open3D的轻量化BIM工具开发指南(下)‌

‌基于PyQt5与Open3D的轻量化BIM工具开发指南(下)‌ ‌——参数化建模、数据导出与性能优化‌ 【跳转】基于PyQt5与Open3D的轻量化BIM工具开发指南(上)‌ ‌四、详细实现步骤(Part 2)‌ ‌3. 参数化建模…

Pytest项目_day01(HTTP接口)

HTTP HTTP是一个协议(服务器传输超文本到浏览器的传送协议),是基于TCP/IP通信协议来传输数据(HTML文件,图片文件,查询结果等)。 访问域名 例如www.baidu.com就是百度的域名,我们想…

在vue项目中,使用Patch请求,实现根据id修改某张发票的日结状态

目录 前言 一.问题描述 二.后端实现 1.分析 2.检查后端拦截器,看看是否允许接收Patch类型的请求 3.编写Dto 4.编写controller层 5.编写service层 6.mapper层 7.使用apifox,测试后端接口的可用性 三.前端实现 1.封装api(本质是ax…

某快餐店用户市场数据挖掘与可视化

1、必要库的载入 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns2、加载并清洗数据 # 2.1 加载数据 df pd.read_csv(/home/mw/input/survey6263/mcdonalds.csv)# 2.2 数据清洗 # 2.2.1 检查缺失值 print(缺失值情况:) print(df.isn…

[C++面试] 标准容器面试点

一、入门 1、vector和list的区别 [C面试] vector 面试点总结 vector 是动态数组,它将元素存储在连续的内存空间中。支持随机访问,即可以通过下标快速访问任意位置的元素,时间复杂度为 O(1),准确点是均摊O(1)。但在中间或开头插…

单片机学完开发板,如何继续提升自己的技能?

很多人学完开发板后都会卡在一个尴尬的阶段:觉得自己会的东西不少,但又不知道下一步该干啥。会点C语言,能烧录程序,能点亮LED,玩转按键,搞定串口等等,能用开发板做点小玩意儿,但面对…

明基PD2700U显示器无法调节图像模式

现象:明基PD2700U显示器无法调节图像模式,如下图: 目前未找到根本原因,推测可能是下面的原因: 1、安装了远程桌面软件:向日葵、虚拟显示器 2、显卡插入了接口,但是没接显示器 解决办法&#xf…

基于FPGA轨道交通6U机箱CPCI脉冲板板卡

板卡简介: 本板为脉冲板,脉冲板主要执行CPU下达的指令,通过实现各种控制算法来调节PWM,然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格: 电源:DC5V;15V FPGA&…

如何通过 Airbyte 将数据摄取到 Elasticsearch

作者:来自 Elastic Andre Luiz Airbyte 是一个数据集成工具,可自动化并可扩展地将信息从各种来源传输到不同的目的地。它使你能够从 API、数据库和其他系统提取数据,并将其加载到 Elasticsearch 等平台,以实现高级搜索和高效分析。…

如何用DeepSeek进行项目管理?AI重构项目全生命周期的实践指南

一、项目管理的核心工作范畴 现代项目管理包含六大核心模块,构成完整管理闭环: 1. 需求管理(20%工作量) 案例:某电商平台"双11"大促项目需整合23个部门的142项需求 关键动作:需求收集→优先级…

vue3 引入element-plus组件后,发现输入的时候没有提示,而且鼠标移到el-button显示unknown的简单解决方法

1、element-plus官方地址 一个 Vue 3 UI 框架 | Element Plus 2、安装 安装 | Element Plus 3、安装插件unplugin-vue-components、unplugin-auto-import并配制 快速开始 | Element Plus 4、输入关键词没有提示及ElButton:unknown的处理 1)装个扩展插件&#xf…

【Linux】浅谈环境变量和进程地址空间

一、环境变量 基本概念 环境变量(Environment Variables)是操作系统提供的一种机制,用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为: 程序可以通过环境变量获取配置信息,例如日…

如何使用 DeepEval 优化 Elasticsearch 中的 RAG 检索

作者:来自 Elastic Kritin Vongthongsri 学习如何使用 DeepEval 优化 RAG 流水线中的 Elasticsearch 检索器。 LLMs 容易产生幻觉、缺乏特定领域的专业知识,并受限于上下文窗口。检索增强生成(Retrieval-Augmented Generation - RAG&#xff…

行为模式---状态模式

概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…

嵌入式裸机设计--MCU常用裸机架构有哪些?

为什么是裸机设计 792125321入群学习更高效! 在MCU(微控制器单元)裸机开发中,我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式,对我们开发一个小型项目来说及有好处! 下面介绍…

【LInux进程六】命令行参数和环境变量

【LInux进程六】命令行参数和环境变量 1.main函数的两个参数2.利用main函数实现一个简单的计算器3.环境变量之一:PATH4.修改PATH5.在命令行解释器bash中查看所有环境变量6.用自己写的程序查看环境变量7.main函数的第三个参数8.本地的环境变量和环境变量9.环境变量具…