爬取smartschool网站时无法获取PHPSESSID Cookie,登录认证报错求助
爬取Smartschool网站登录认证问题排查
问题详情
因学校项目需求,需爬取https://dbh.smartschool.be/,但登录认证环节遇到报错。
代码实现
import requests URL = "https://dbh.smartschool.be" LOGIN_ROUTE = "/login" HEADERS = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36" , "orgin" : URL, "referer" : URL + "/" } s = requests.session() csrf_token = s.get(URL).cookies["PHPSESSID"] login_payload ={ "login_form[_username]": "Roel.bellemans", "login_form[_password]": "######", "login_form[_generationTime]": "1665576878", "login_form[_token]": csrf_token } login_req = s.post(URL + LOGIN_ROUTE, headers=HEADERS, data=login_payload) print(login_req)
报错信息
Traceback (most recent call last): File "C:\Users\roelb\Desktop\cookie_auth_scraper\logIn.py", line 15, in <module> csrf_token = s.get(URL).cookies["PHPSESSID"] File "C:\Users\roelb\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\cookies.py", line 334, in __getitem__ return self._find_no_duplicates(name) File "C:\Users\roelb\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\cookies.py", line 413, in _find_no_duplicates raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") KeyError: "name='PHPSESSID', domain=None, path=None"
浏览器中明明存在PHPSESSID Cookie,求可行的解决思路。
解决思路
先确认Cookie实际返回情况:
不要直接通过键名取值,先打印所有Cookie内容,确认PHPSESSID是否真的被服务器返回:response = s.get(URL) print("返回的Cookie列表:", response.cookies.items())若确实无PHPSESSID,检查请求头是否合规,或是否需要先跳转至登录页面再获取会话Cookie。
修正请求头拼写错误:
代码中HEADERS的"orgin"是拼写错误,正确应为"Origin",该错误会导致服务器拒绝返回正确的会话标识或验证信息。区分SessionID与CSRF Token:
PHPSESSID是会话ID,并非CSRF Token。Smartschool的CSRF Token通常嵌入在登录页面的HTML源码中(比如隐藏输入框login_form[_token]的值),需先请求登录页面,用BeautifulSoup等工具解析HTML提取该值,而非用PHPSESSID替代。动态获取_generationTime:
代码中写死的1665576878是过期时间戳,需在请求登录页面时,从页面源码或响应数据中提取当前的_generationTime值,或使用当前时间戳(注意与服务器时区保持一致)。模拟浏览器完整访问流程:
先请求首页,再跳转至登录页面,确保会话流程与浏览器完全一致——部分网站仅在用户访问登录页面时才生成有效会话Cookie。
内容的提问来源于stack exchange,提问作者Roel Bellemans
相关产品推荐
相关产品推荐

