requests.Session登录状态无法保持导致文件下载失败求助
问题:使用requests.Session登录Wibu网站后仍无法完成文件下载
- 目标页面:https://www.wibu.com/fr/telechargements/developpeurs/programmes-developpeurs.html,需下载该页面的可执行文件
- 操作流程:点击下载按钮会跳转至登录页面,登录成功后会重定向回下载页面
- 遇到的问题:尝试多种POST/URL组合后,始终处于未登录状态,无法触发下载
当前使用的代码:
import requests import os s = requests.session() headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0", 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' } payload = { "user": "dupont", "pass": "a_password" } r = s.post("https://www.wibu.com/us/secure-login.html?return_url=%2Fus%2Fsupport%2Fdeveloper%2Fdownloads-developer-software%2Ffile%2Fdownload%2F13734.html&cHash=f839c2633b7143d3fb47e9bf75f5851f", headers=headers, data= payload, allow_redirects=True) print(response.status_code) # 变量名错误:response未定义,应替换为r try: response.raise_for_status() # 变量名错误:response未定义,应替换为r except requests.exceptions.HTTPError: print('oops bad status code {} on request!'.format(response.status_code)) else: print('our login redirected to: {}'.format(response.url)) r = s.get("https://www.wibu.com/us/support/developer/downloads-developer-software/file/download/13734.html?tx_wibudownloads_downloadlist%5BdirectDownload%5D=directDownload&tx_wibudownloads_downloadlist%5BuseAwsS3%5D=0&cHash=d5bbc5201225cca370f9e88cb726a93e", headers=headers, allow_redirects=True) open(os.path.join(dest_path, "test.deb"), "wb").write(r.content)
解决建议
核对登录请求参数
打开浏览器开发者工具(F12-网络面板),监控真实登录请求的Form Data:- 确认用户名、密码的参数名是否正确(很多网站不会直接用
user、pass,可能是username、password或者带前缀的字段,比如tx_wibusecurelogin[username]) - 不要使用带
return_url和cHash的临时登录URL,这类参数通常是一次性的,应该先GET登录页面(比如https://www.wibu.com/us/secure-login.html),获取页面中的必要字段后再提交登录
- 确认用户名、密码的参数名是否正确(很多网站不会直接用
提取并提交CSRF/隐藏字段
登录页面一般会包含隐藏的CSRF Token或验证字段(比如_csrf、cHash),需要先请求登录页面,用BeautifulSoup等工具从HTML中提取这些字段,加入到POST的payload中一起提交完善请求头信息
- 添加
Referer字段,模拟真实浏览器的请求来源,比如登录请求的Referer设为登录页面的URL - 必要时可添加
Accept-Language、Content-Type等字段,让请求更接近浏览器行为
- 添加
分步验证登录状态
- 登录完成后,请求一个需要登录的页面(比如用户个人中心),检查响应内容是否包含登录后的标识(比如用户名),确认登录是否真的成功
- 打印
print(s.cookies)查看Session中的Cookie,确认是否存在登录相关的会话Cookie(比如PHPSESSID、auth_token)
统一网站区域
当前代码用的是us区域的URL,但目标下载页面是fr区域,部分网站会根据区域隔离会话,建议统一使用同一区域的URL(全用fr或全用us)修正代码中的变量错误
代码中存在response未定义的问题,所有response都应该替换为r,否则会抛出NameError
内容的提问来源于stack exchange,提问作者Kaoru54
相关产品推荐
相关产品推荐

