使用Python登录带Cookie验证的网站如何解决Cookie过期问题
解决方案
核心思路
你当前的问题是硬编码固定的PHPSESSID,服务端会话过期后自然失效。改用requests.Session()自动管理会话Cookie,模拟完整登录流程主动获取有效Cookie,再配置过期重试机制即可解决。
具体实现步骤
- 第一步:导入依赖,创建全局Session对象,自动处理服务端返回的Cookie、维持会话状态
- 第二步:先请求登录页获取表单隐藏参数,避免CSRF校验拦截
- 第三步:提交账号密码完成登录,Session会自动存储返回的有效Cookie
- 第四步:后续所有业务请求都通过该Session发起,无需手动维护Cookie
- 第五步:添加过期检测逻辑,检测到需要登录时自动重新触发登录流程
示例代码
import requests from bs4 import BeautifulSoup # 配置参数 USERNAME = "你的PhishTank账号" PASSWORD = "你的PhishTank密码" LOGIN_URL = "https://phishtank.org/login.php" TARGET_URL = "https://phishtank.org/add_web_phish.php" # 统一请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://phishtank.org/login_required.php', 'Connection': 'keep-alive', } # 创建全局Session对象 session = requests.Session() session.headers.update(headers) def phishtank_login(): """执行登录,更新Session中的Cookie""" # 先请求登录页拿隐藏表单字段 login_page_resp = session.get(LOGIN_URL) soup = BeautifulSoup(login_page_resp.text, 'html.parser') # 提取登录表单隐藏参数(根据PhishTank实际表单字段调整) hidden_inputs = soup.find_all('input', type='hidden') form_data = {input.get('name'): input.get('value') for input in hidden_inputs} # 补充账号密码 form_data.update({ 'username': USERNAME, 'password': PASSWORD }) # 提交登录请求 login_resp = session.post(LOGIN_URL, data=form_data) # 校验登录是否成功 if "login_required" not in login_resp.url and "Logout" in login_resp.text: print("登录成功,Cookie已更新") return True else: print("登录失败,请检查账号密码或表单参数") return False def request_with_auto_login(url, retry=1): """带自动登录重试的请求方法""" resp = session.get(url) # 判断是否Cookie过期 if "login_required" in resp.url or "Please log in" in resp.text: if retry > 0: print("Cookie已过期,重新登录后重试") if phishtank_login(): return request_with_auto_login(url, retry-1) raise Exception("请求失败,登录重试后仍无效") return resp # 首次执行先登录 phishtank_login() # 发起业务请求 response = request_with_auto_login(TARGET_URL) print(response.text)
注意事项
- 需提前安装依赖:
pip install requests beautifulsoup4 - 代码中的表单字段需要根据PhishTank登录页的实际表单结构调整,如果站点没有做CSRF校验,也可以直接去掉解析隐藏字段的逻辑,仅提交账号密码即可
- 控制请求频率,避免触发站点的反爬机制
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

