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
相关产品推荐
相关产品推荐

