下面我将为你详细拆解这个过程,从原理到具体步骤,并提供一个Python代码示例。

frm通过网页源代码查成绩
(图片来源网络,侵删)

核心原理

为什么能通过源代码看到成绩?

  1. 网页的本质是HTML:你在浏览器上看到的任何页面,本质上都是一堆HTML、CSS和JavaScript代码,浏览器的作用就是解析这些代码并渲染成你看到的图形界面。
  2. “查看网页源代码”的局限性:当你右键点击“查看网页源代码”时,你看到的是服务器最初发送给你的、未经JavaScript修改的HTML,很多现代网站,尤其是需要登录后才能看到的内容,是通过JavaScript在浏览器动态加载的,所以你在“源代码”里可能找不到成绩。
  3. 成绩数据最终来源是HTTP请求:无论页面如何渲染,你的浏览器为了获取成绩数据,必然向服务器的某个地址发送了一个HTTP请求,这个请求里包含了你的登录凭证(如Cookie、Session ID),服务器验证后,会返回包含成绩数据的HTML片段或JSON数据。
  4. 我们的目标:就是手动模拟这个HTTP请求,直接获取服务器返回的成绩数据,然后从中解析出我们需要的信息。

准备工具和环境

你需要准备以下几样东西:

  1. 浏览器:推荐使用 ChromeFirefox,它们的开发者工具非常强大。
  2. 文本编辑器或IDE:如 VS Code、Sublime Text、PyCharm 等,用于编写代码。
  3. 编程语言和环境Python 是最佳选择,因为它有强大的库来处理网络请求和HTML解析。
    • 需要安装的Python库:
      • requests:用于发送HTTP请求。
      • beautifulsoup4:用于解析HTML。
    • 安装命令:pip install requests beautifulsoup4

详细操作步骤(以Chrome浏览器为例)

假设你要查询的成绩系统是一个需要登录的网站。

第1步:登录成绩系统并打开开发者工具

  1. 正常使用你的账号和密码登录成绩查询网站。
  2. 进入包含你成绩的页面(我的成绩”、“本学期成绩”等)。
  3. 在页面上点击鼠标右键,选择 “检查” (Inspect),或者直接按快捷键 F12 打开开发者工具。

第2步:定位网络请求

这是最关键的一步,我们需要找到浏览器到底向哪个服务器地址请求了成绩数据。

frm通过网页源代码查成绩
(图片来源网络,侵删)
  1. 在开发者工具中,切换到 “网络” (Network) 标签页。
  2. 刷新页面F5Ctrl+R),这样会重新加载所有网络请求。
  3. 在筛选框中输入关键词,gradescore成绩 等,来快速过滤出与成绩相关的请求。
  4. 查看列表,找到那个 最可能 是获取成绩数据的请求,通常它会是:
    • 请求方法GETPOST
    • 状态码200 OK (表示成功)。
    • 类型:可能是 document (HTML)、xhr (AJAX请求,数据可能是JSON) 或 fetch (现代AJAX)。
    • URL/名称:URL中可能包含 grade, score, api 等关键字。

如何判断哪个是正确的请求? 点击列表中的每一个候选请求,在右侧的 “标头” (Headers)“响应” (Response) 标签页中查看内容,如果能看到HTML代码或者JSON格式的成绩数据,那你就找对了!

第3步:分析请求信息

找到正确的请求后,我们需要复制它的关键信息,这些是我们在Python代码中模拟请求所必需的。

  1. 请求URL:在 “标头” (Headers) -> “常规” (General) 下找到 “请求网址” (Request URL)
  2. 请求方法:在同一个地方找到 “请求方法” (Request Method),是 GET 还是 POST
  3. 请求载荷/表单数据
    • 如果是 POST 请求,切换到 “有效负载” (Payload)“标头” (Headers) -> “请求标头” (Request Headers) -> 类型” (Content-Type)
    • Content-Typeapplication/x-www-form-urlencoded,那么数据就在 “有效负载” (Payload) 标签页里,是一个类似 key1=value1&key2=value2 的表单。
    • Content-Typeapplication/json,那么数据就是一串JSON。
    • 把这些数据复制下来!
  4. 关键Cookie
    • 切换到 “标头” (Headers) -> “Cookie”
    • 把这一整行Cookie复制下来! Cookie是服务器用来识别你身份的关键,没有它,服务器会认为你没有登录,直接拒绝你的请求。

第4步:编写Python代码进行模拟

我们把前面收集到的信息用Python代码实现出来。

import requests
from bs4 import BeautifulSoup
# --- 第1步:替换为你自己的信息 ---
# 1. 从浏览器开发者工具复制的Cookie
cookies_str = "your_session_cookie_here; another_cookie=value; ..." 
# 将字符串转换为字典
cookies = {}
for item in cookies_str.split(';'):
    key, value = item.strip().split('=', 1)
    cookies[key] = value
# 2. 从开发者工具复制的请求URL
url = "https://your-school-grade-system.com/api/scores"
# 3. 从开发者工具复制的请求方法 (GET 或 POST)
# 以及请求头中的 Content-Type
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
    "Content-Type": "application/x-www-form-urlencoded"  # 根据实际情况修改
}
# 4. 从开发者工具复制的请求载荷/表单数据
# 注意:这里的键和值要根据实际情况修改
# 如果是GET请求,数据可以直接拼在URL后面,或者放在params里
# 如果是POST请求,数据放在data或json里
payload_data = {
    "semester": "2025-2025-2",  # 学期
    "studentId": "20250001",    # 学号
    # ... 其他可能需要的参数
}
# --- 第2步:发送请求 ---
try:
    # 如果是POST请求
    response = requests.post(url, headers=headers, cookies=cookies, data=payload_data)
    # 如果是GET请求 (通常数据较少或没有敏感数据)
    # response = requests.get(url, headers=headers, cookies=cookies, params=payload_data)
    # 检查请求是否成功
    response.raise_for_status()  # 如果状态码不是2xx,会抛出异常
    # --- 第3步:解析响应并提取成绩 ---
    # 检查返回的数据类型
    # print(response.text) # 先打印原始响应,看看是什么格式
    # 情况A:返回的是HTML
    if "html" in response.headers.get("Content-Type", "").lower():
        soup = BeautifulSoup(response.text, 'html.parser')
        # 使用BeautifulSoup查找包含成绩的表格或列表
        # 找到所有<tr>标签,然后从中提取<td>标签里的内容
        score_table = soup.find('table', {'id': 'scoreTable'})
        if score_table:
            for row in score_table.find_all('tr')[1:]: # 跳过表头
                cols = row.find_all('td')
                if len(cols) > 0:
                    course_name = cols[1].text.strip()
                    credit = cols[2].text.strip()
                    score = cols[4].text.strip()
                    print(f"课程: {course_name}, 学分: {credit}, 成绩: {score}")
        else:
            print("未找到成绩表格,请检查HTML结构或请求参数。")
    # 情况B:返回的是JSON (更现代的做法)
    elif response.headers.get("Content-Type", "").startswith("application/json"):
        data = response.json()
        # 根据实际的JSON结构遍历数据
        # 成绩可能在 data['data']['scores'] 这个列表里
        for score_item in data.get('data', {}).get('scores', []):
            print(f"课程: {score_item['courseName']}, 成绩: {score_item['score']}")
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
except Exception as e:
    print(f"发生错误: {e}")

重要注意事项和常见问题

  1. 网站反爬机制

    frm通过网页源代码查成绩
    (图片来源网络,侵删)
    • User-Agent:有些网站会检查请求的User-Agent(浏览器标识),如果不是常见浏览器的UA,可能会拒绝访问,所以代码中最好加上一个常见的浏览器UA。
    • 频率限制:不要在短时间内发送大量请求,否则你的IP可能会被临时封禁。
    • 验证码:如果网站有验证码,这种自动化方法就很难处理了。
  2. 动态加载(AJAX/Fetch)

    • 如果你在“网络”标签页里找不到直接返回成绩数据的请求,而是发现了很多XHR/Fetch请求,那么恭喜你,你找到了API接口!
    • 这种情况下,请求的响应数据通常是 JSON格式,而不是HTML,这其实比解析HTML更简单、更稳定,你只需要在Python代码中使用 response.json() 来解析数据即可,步骤和上面代码中的“情况B”一样。
  3. 网站结构变化

    学校网站随时可能更新或改版,一旦网站改版,请求的URL、参数、Cookie名称甚至返回数据的HTML结构都可能改变,导致你的脚本失效,你需要定期根据新的网站结构更新代码。

  4. Cookie的时效性

    登录的Cookie通常有过期时间,如果你的脚本运行时提示未登录,很可能是Cookie失效了,你需要重新登录一次网站,复制最新的Cookie。

  5. 法律和道德风险

    • 请务必遵守学校的规定! 使用自动化脚本查询成绩可能违反学校的信息系统使用政策,请确保你的行为是用于个人学习目的,并且不会对服务器造成过大负担。切勿用于非法用途或恶意攻击。

通过网页源代码(实际上是网络请求)查成绩,是一个锻炼你网络编程和逆向工程思维的好方法,整个过程可以概括为:

登录网站 -> F12开发者工具 -> Network定位请求 -> 分析请求URL/方法/Headers/数据 -> Python模拟请求 -> 解析返回数据。

希望这个详细的指南能帮助你成功实现!