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

(图片来源网络,侵删)
核心原理
为什么能通过源代码看到成绩?
- 网页的本质是HTML:你在浏览器上看到的任何页面,本质上都是一堆HTML、CSS和JavaScript代码,浏览器的作用就是解析这些代码并渲染成你看到的图形界面。
- “查看网页源代码”的局限性:当你右键点击“查看网页源代码”时,你看到的是服务器最初发送给你的、未经JavaScript修改的HTML,很多现代网站,尤其是需要登录后才能看到的内容,是通过JavaScript在浏览器动态加载的,所以你在“源代码”里可能找不到成绩。
- 成绩数据最终来源是HTTP请求:无论页面如何渲染,你的浏览器为了获取成绩数据,必然向服务器的某个地址发送了一个HTTP请求,这个请求里包含了你的登录凭证(如Cookie、Session ID),服务器验证后,会返回包含成绩数据的HTML片段或JSON数据。
- 我们的目标:就是手动模拟这个HTTP请求,直接获取服务器返回的成绩数据,然后从中解析出我们需要的信息。
准备工具和环境
你需要准备以下几样东西:
- 浏览器:推荐使用 Chrome 或 Firefox,它们的开发者工具非常强大。
- 文本编辑器或IDE:如 VS Code、Sublime Text、PyCharm 等,用于编写代码。
- 编程语言和环境:Python 是最佳选择,因为它有强大的库来处理网络请求和HTML解析。
- 需要安装的Python库:
requests:用于发送HTTP请求。beautifulsoup4:用于解析HTML。
- 安装命令:
pip install requests beautifulsoup4
- 需要安装的Python库:
详细操作步骤(以Chrome浏览器为例)
假设你要查询的成绩系统是一个需要登录的网站。
第1步:登录成绩系统并打开开发者工具
- 正常使用你的账号和密码登录成绩查询网站。
- 进入包含你成绩的页面(我的成绩”、“本学期成绩”等)。
- 在页面上点击鼠标右键,选择 “检查” (Inspect),或者直接按快捷键
F12打开开发者工具。
第2步:定位网络请求
这是最关键的一步,我们需要找到浏览器到底向哪个服务器地址请求了成绩数据。

(图片来源网络,侵删)
- 在开发者工具中,切换到 “网络” (Network) 标签页。
- 刷新页面(
F5或Ctrl+R),这样会重新加载所有网络请求。 - 在筛选框中输入关键词,
grade、score、成绩等,来快速过滤出与成绩相关的请求。 - 查看列表,找到那个 最可能 是获取成绩数据的请求,通常它会是:
- 请求方法:
GET或POST。 - 状态码:
200 OK(表示成功)。 - 类型:可能是
document(HTML)、xhr(AJAX请求,数据可能是JSON) 或fetch(现代AJAX)。 - URL/名称:URL中可能包含
grade,score,api等关键字。
- 请求方法:
如何判断哪个是正确的请求? 点击列表中的每一个候选请求,在右侧的 “标头” (Headers) 或 “响应” (Response) 标签页中查看内容,如果能看到HTML代码或者JSON格式的成绩数据,那你就找对了!
第3步:分析请求信息
找到正确的请求后,我们需要复制它的关键信息,这些是我们在Python代码中模拟请求所必需的。
- 请求URL:在 “标头” (Headers) -> “常规” (General) 下找到 “请求网址” (Request URL)。
- 请求方法:在同一个地方找到 “请求方法” (Request Method),是
GET还是POST。 - 请求载荷/表单数据:
- 如果是
POST请求,切换到 “有效负载” (Payload) 或 “标头” (Headers) -> “请求标头” (Request Headers) -> 类型” (Content-Type)。 Content-Type是application/x-www-form-urlencoded,那么数据就在 “有效负载” (Payload) 标签页里,是一个类似key1=value1&key2=value2的表单。Content-Type是application/json,那么数据就是一串JSON。- 把这些数据复制下来!
- 如果是
- 关键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}")
重要注意事项和常见问题
-
网站反爬机制:
(图片来源网络,侵删)- User-Agent:有些网站会检查请求的
User-Agent(浏览器标识),如果不是常见浏览器的UA,可能会拒绝访问,所以代码中最好加上一个常见的浏览器UA。 - 频率限制:不要在短时间内发送大量请求,否则你的IP可能会被临时封禁。
- 验证码:如果网站有验证码,这种自动化方法就很难处理了。
- User-Agent:有些网站会检查请求的
-
动态加载(AJAX/Fetch):
- 如果你在“网络”标签页里找不到直接返回成绩数据的请求,而是发现了很多XHR/Fetch请求,那么恭喜你,你找到了API接口!
- 这种情况下,请求的响应数据通常是 JSON格式,而不是HTML,这其实比解析HTML更简单、更稳定,你只需要在Python代码中使用
response.json()来解析数据即可,步骤和上面代码中的“情况B”一样。
-
网站结构变化:
学校网站随时可能更新或改版,一旦网站改版,请求的URL、参数、Cookie名称甚至返回数据的HTML结构都可能改变,导致你的脚本失效,你需要定期根据新的网站结构更新代码。
-
Cookie的时效性:
登录的Cookie通常有过期时间,如果你的脚本运行时提示未登录,很可能是Cookie失效了,你需要重新登录一次网站,复制最新的Cookie。
-
法律和道德风险:
- 请务必遵守学校的规定! 使用自动化脚本查询成绩可能违反学校的信息系统使用政策,请确保你的行为是用于个人学习目的,并且不会对服务器造成过大负担。切勿用于非法用途或恶意攻击。
通过网页源代码(实际上是网络请求)查成绩,是一个锻炼你网络编程和逆向工程思维的好方法,整个过程可以概括为:
登录网站 -> F12开发者工具 -> Network定位请求 -> 分析请求URL/方法/Headers/数据 -> Python模拟请求 -> 解析返回数据。
希望这个详细的指南能帮助你成功实现!
