Python requests登录成功后跨页面访问显示未登录问题求助
Python requests登录后请求显示未登录的解决方案
核心故障原因
requests.Session()默认会自动维护跨请求的所有Cookie,包括登录成功后服务端返回的登录态凭证。你的代码中在POST登录、GET目标页两个请求里都手动传入了cookies=r1.cookies,该参数会强制请求仅携带第一次访问登录页时获取的未登录状态Cookie,覆盖Session自动存储的登录后有效Cookie,最终导致后续请求无法被服务端识别为已登录状态。
具体修复步骤
- 移除所有请求中手动传入的
cookies=r1.cookies参数,完全交给Session对象自动处理Cookie的存储、更新和携带,不要手动覆盖。 - 给登录POST请求补充
Referer请求头,值为登录页地址https://opencorporates.com/users/sign_in。该站点基于Rails框架开发,会校验登录请求的来源,缺少该头可能被反爬策略判定为非法请求,即使账号密码正确也不会下发有效登录态。 - 修正目标URL的格式:你代码里的URL参数使用了HTML转义字符
&,实际HTTP请求中参数分隔符需要用原生&,否则参数解析异常也可能导致状态判定错误。 - 修正文件写入逻辑:原代码中
f.close未加括号不会执行关闭操作,写入文件时指定encoding='utf-8'避免HTML内容乱码,推荐使用with上下文管理器自动处理文件关闭。 - 增加登录有效性校验:不要仅通过r2的响应内容判断登录成功,可通过登录后是否自动跳转到用户主页、响应中是否存在仅登录后可见的用户名/退出按钮等特征确认登录真的生效,避免把登录页报错内容误判为登录成功。
修复后可运行代码
import requests from bs4 import BeautifulSoup # 初始化会话,自动维护跨请求Cookie session = requests.Session() base_headers = { 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:86.0) Gecko/20100101 Firefox/86.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } def run_login_and_crawl(): login_page_url = 'https://opencorporates.com/users/sign_in' login_page_resp = session.get(login_page_url, headers=base_headers) soup = BeautifulSoup(login_page_resp.text, 'html.parser') csrf_token = soup.find('meta', attrs={'name':'csrf-token'}).get('content') # 构造登录请求参数 login_payload = { 'utf8': '✓', 'authenticity_token': csrf_token, 'user[email]':'替换为你的真实账号', 'user[password]':'替换为你的真实密码', 'submit':'' } # 补全登录请求头 login_headers = base_headers.copy() login_headers['Referer'] = login_page_url login_resp = session.post( login_page_url, headers=login_headers, data=login_payload, allow_redirects=True ) # 校验登录结果:正常登录成功会跳转到用户相关页面 print(f'登录完成后当前页面地址:{login_resp.url}') # 修正后的目标搜索页URL,移除转义字符 target_search_url = 'https://opencorporates.com/companies?utf8=%E2%9C%93&q=above+and+beyond&commit=Go&jurisdiction_code=&inactive=false&mode=best_fields&search_fields[]=name&branch=false&nonprofit=&order=score' search_resp = session.get(target_search_url, headers=base_headers) # 保存响应内容 with open('./res.html', 'w+', encoding='utf-8') as f: f.write(search_resp.text) # 登出操作参考:后续需要登出时,从当前页面提取新的csrf-token,请求登出接口即可 # page_soup = BeautifulSoup(search_resp.text, 'html.parser') # logout_token = page_soup.find('meta', attrs={'name':'csrf-token'}).get('content') # logout_headers = base_headers.copy() # logout_headers['X-CSRF-Token'] = logout_token # session.delete('https://opencorporates.com/users/sign_out', headers=logout_headers) run_login_and_crawl()
内容的提问来源于stack exchange,提问作者shofyankhan
相关产品推荐
相关产品推荐

