Python发送POST登录请求时如何获取location.hash赋值的anchor参数值
anchor参数处理方案
anchor参数的值对应浏览器地址栏中#符号之后的内容(即JS中的location.hash),该参数的作用是控制登录成功后的跳转锚点位置,不属于登录校验的必填参数:
- 如果你没有指定跳转路径的需求,直接传空字符串即可,不会影响登录结果
- 如果你抓包获取到自己浏览器登录时
anchor有固定值,直接将对应值填入POST参数即可
requests库本身不会执行页面JS逻辑,也不需要额外解析JS来获取该参数,直接按需求赋值即可。
verify=False是否会导致登录失败
不会。verify=False仅关闭SSL证书合法性校验,只会触发控制台告警,不会导致请求被服务端拒绝,登录失败与该参数无关。
现有代码核心问题及修正
你当前登录失败的核心原因是请求上下文管理错误,另外还有2处可优化点:
- 已经初始化了
requests.Session()对象,但发送POST请求时没有复用该对象,而是直接调用requests.post,导致之前GET请求获取的会话Cookie、上下文完全丢失 - 使用IP地址访问站点,多数站点会做域名校验,IP访问可能被拦截,建议替换为正式域名访问
- 不需要手动提取Cookie传给POST请求,
Session对象会自动管理上下文Cookie
修正后的代码
import requests from bs4 import BeautifulSoup as bb import urllib3 # 关闭verify=False触发的SSL告警 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 替换为站点域名地址 url = "https://elearning.yu.edu.jo/login/index.php" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69', 'Referer': 'https://elearning.yu.edu.jo/login/index.php' } # 全程复用同一个Session对象 s = requests.Session() # 请求登录页 get_resp = s.get(url, headers=headers, verify=False) # 提取logintoken soup = bb(get_resp.text, "html.parser") logintoken = soup.find("input", attrs={'name': 'logintoken'})['value'] # 构造POST参数 post_data = { 'username': '替换为你的用户名', 'password': '替换为你的密码', 'logintoken': logintoken, 'anchor': '' } # 用同一个Session发送POST请求 post_resp = s.post(url, data=post_data, verify=False, headers=headers) if "Dashboard" in post_resp.text: print('登录成功') else: # 登录失败时打印前500个字符排查问题 print('登录失败,返回预览:', post_resp.text[:500])
内容的提问来源于stack exchange,提问作者عبدالرحمن الشماس
相关产品推荐
相关产品推荐

