使用Python Requests登录高校网站时返回相同页面的问题求助
解决Python Requests爬取学校网页的登录问题
嘿,我来帮你搞定这个登录爬取的问题!从你给出的表单代码片段来看,咱们一步步拆解问题,逐个解决:
第一步:先理清登录的核心要素
从你提供的表单里,能提取这些关键信息:
- 登录请求的提交地址:表单的
action是/Home/ValidaAcceso,所以完整URL需要拼接学校域名,比如https://your-school-domain.com/Home/ValidaAcceso(记得替换成实际的学校域名) - 请求方法:
POST,所以要用Requests的POST方法提交数据 - 用户名输入框:
id="login-username",但表单提交靠的是name属性而非id,你粘贴的代码里name=&q...没写完,一定要去登录页面源码里找到这个输入框的完整name值(比如可能是username或者和id一致的login-username)
第二步:用Session保持会话,获取Cookies和CSRF令牌
大部分学校网站(尤其是ASP.NET框架搭建的)会在登录页面设置CSRF令牌和会话Cookies,用来防止跨站请求伪造。咱们得先访问登录页面拿到这些关键内容:
import requests from bs4 import BeautifulSoup # 初始化Session,自动处理Cookies,保持会话状态 session = requests.Session() # 替换成学校实际的登录页面URL login_page_url = "https://your-school-domain.com/Home/Login" # 伪装成浏览器的User-Agent,避免被网站拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 访问登录页面,获取Cookies和页面源码 response = session.get(login_page_url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 提取CSRF令牌(不同网站的令牌name可能不同,常见的有__RequestVerificationToken、csrfmiddlewaretoken) # 你需要在登录页面源码里找类似<input type="hidden" name="xxx" value="xxx">的隐藏字段 csrf_token = soup.find("input", {"name": "__RequestVerificationToken"})["value"]
第三步:准备登录表单数据,提交请求
把所有表单需要的字段整理成字典,包括用户名、密码、CSRF令牌,还有可能存在的隐藏字段(比如returnUrl、__VIEWSTATE这类ASP.NET常见字段,都要从页面源码或浏览器抓包中找到):
# 替换成实际的表单字段名和你的账号密码 login_data = { "login-username": "你的学号/用户名", # 填你找到的用户名输入框的name值 "login-password": "你的登录密码", # 同理,找密码输入框的name值 "__RequestVerificationToken": csrf_token, # 如果有其他隐藏字段,比如returnUrl,也要加进来 # "returnUrl": "/Home/Dashboard" } # 提交登录请求 login_action_url = "https://your-school-domain.com/Home/ValidaAcceso" login_response = session.post(login_action_url, data=login_data, headers=headers) # 验证登录是否成功:访问一个需要登录才能查看的页面,比如个人主页 dashboard_url = "https://your-school-domain.com/Home/Dashboard" dashboard_response = session.get(dashboard_url, headers=headers) # 检查页面内容里的登录成功标识(比如你的名字、"欢迎"字样) if "欢迎" in dashboard_response.text or "你的名字" in dashboard_response.text: print("登录成功!可以开始爬取内容啦~") else: print("登录失败!可能原因:字段名错误、密码不对、CSRF令牌提取错误,或者网站有验证码拦截")
常见坑点提醒
- 核对所有表单字段:别漏了隐藏字段!可以用浏览器开发者工具(F12)在登录时抓包,查看Form Data里所有提交的键值对,确保你的
login_data完全匹配 - 验证码问题:如果学校网站登录需要验证码,得额外处理(比如手动输入、用OCR工具识别),不过很多校内网站可能没有这个限制
- 请求头完整性:有些网站会检查
Referer头,你可以在POST请求里加上"Referer": login_page_url - 证书问题:如果学校网站HTTPS证书有问题,POST时可以临时加
verify=False,但这只是应急方案,不推荐长期使用
内容的提问来源于stack exchange,提问作者Nicolas Suarez
相关产品推荐
相关产品推荐

