在開發學校教務系統課表爬蟲時,登錄模塊已經完成,但遇到一個棘手的跳轉問題:登錄成功後的頁面 URL 與跳轉到課程表頁面的 URL 完全一致,且使用 Wireshark 抓包發現沒有任何 POST 數據包產生。這導致常規的表單提交模擬無法獲取課程表數據。
根據截圖所示,教務系統介面採用框架結構,左側為導航菜單,右側為內容顯示區域。點擊「學生課表」菜單項時,瀏覽器地址欄 URL 不變,說明這是典型的 前端框架/iframe 內嵌 或 JavaScript 動態渲染 機制。
打開瀏覽器開發者工具(F12)-> Network 面板,勾選「Preserve log」,點擊「學生課表」菜單,觀察實際發出的請求:
# 典型請求示例
GET /jsxsd/xskb/xskb_list.do?VES6=...&xh=20230001 HTTP/1.1
Referer: https://jwxt.school.edu.cn/
Cookie: JSESSIONID=abc123; route=xyz
直接模擬該請求即可獲取課表數據,無需處理複雜跳轉邏輯。
對於複雜的 JavaScript 渲染頁面,可使用 Selenium 控制真實瀏覽器:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://jwxt.school.edu.cn/")
# 登錄操作...
# 定位並點擊課表菜單
menu = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.LINK_TEXT, "學生課表"))
)
menu.click()
# 切換到 iframe(如有)
driver.switch_to.frame("mainFrame")
# 獲取頁面源碼
html = driver.page_source
最簡潔高效的方式是逆向分析課表查詢接口:
import requests
session = requests.Session()
# 登錄獲取 Cookie
login_data = {"username": "xxx", "password": "yyy"}
session.post(login_url, data=login_data)
# 直接請求課表接口
params = {"xh": "20230001", "xn": "2023-2024", "xq": "1"}
resp = session.get("https://jwxt.school.edu.cn/jsxsd/xskb/xskb_list.do", params=params)
# 解析 HTML 表格數據
遇到此類「URL 不變但內容變化」的場景,核心思路是繞過前端跳轉邏輯,直接定位後端數據接口。教務系統通常採用經典的 JSP/Servlet 架構,查詢接口規律性強,逆向難度較低。