You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python新手无法登录高校网站爬取成绩,请求技术协助

嘿,我来帮你搞定这个登录爬取的问题~你遇到的情况很典型——登录POST提交后,后续GET请求还是跳回登录页,核心问题基本出在会话未保持或者登录参数不全这两个关键点上,咱们一步步来调整:

1. 必须用会话对象保持登录状态

requests默认每次请求都是独立的新会话,你登录时生成的认证Cookie不会自动带到后续请求里。解决方法是用requests.Session()创建一个持久会话,它会自动帮你保存和携带Cookie:

import requests
from bs4 import BeautifulSoup

# 创建持久会话,自动管理Cookie
session = requests.Session()

login_URL = 'http://gram-web.ionio.gr/unistudent/login.asp'
target_URL = '这里填你要访问的成绩页面URL'

# 先访问登录页(获取必要的初始Cookie和隐藏字段)
login_page = session.get(login_URL)
soup = BeautifulSoup(login_page.text, 'html.parser')

# 提取登录表单的所有参数(包括隐藏字段)
login_data = {
    'txtUsername': '你的学号',  # 替换成页面实际的账号字段名
    'txtPassword': '你的密码',  # 替换成页面实际的密码字段名
    # ASP.NET页面常见的动态隐藏字段,必须从登录页提取
    '__VIEWSTATE': soup.find('input', {'name': '__VIEWSTATE'})['value'],
    '__EVENTVALIDATION': soup.find('input', {'name': '__EVENTVALIDATION'})['value'],
    # 提交按钮的字段,比如可能是btnLogin或者带坐标的btnLogin.x/btnLogin.y
    'btnLogin': 'Login'
}

# 提交登录请求(用同一个会话)
login_response = session.post(login_URL, data=login_data)

# 现在访问目标成绩页面,会话会自动携带登录后的Cookie
result = session.get(target_URL)
print(result.text)  # 现在应该能看到成绩页面内容了

2. 别漏了登录表单里的隐藏参数

你用的是ASP.NET搭建的高校网站,这类页面会生成动态的__VIEWSTATE、__EVENTVALIDATION隐藏字段——这些是服务器验证请求合法性的关键。如果只传账号密码,服务器会直接拒绝登录请求,自然跳回登录页。

解决方法是先GET登录页,用BeautifulSoup解析出所有表单字段,把它们全部加入POST的data参数中。

3. 模拟浏览器的请求头

有些服务器会检查请求头的合法性,如果用requests默认的请求头,可能会被识别为爬虫。可以给会话设置统一的浏览器请求头:

session.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Referer': login_URL  # 告诉服务器请求来自登录页
})

4. 验证登录是否真的成功

可以在POST登录后打印login_response.status_code和login_response.text,如果返回的还是登录页内容,说明你的登录参数有问题。这时候打开浏览器的开发者工具(F12),抓包查看浏览器实际发送的POST数据,对比你代码里的参数,确保完全一致(包括字段名、大小写)。

内容的提问来源于stack exchange,提问作者Nick Garlis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:45:39