使用Python requests下载URL文件遇登录跳转,求解决方案
解决方法
你的问题核心是服务器要求请求携带已登录的会话凭证,浏览器能正常下载是因为保存了登录后的Cookie,而直接用requests发起的请求没有携带这些凭证,所以被重定向到登录页(返回的JS就是做跳转用的)。以下是几种可行的解决方式:
1. 复用浏览器的登录Cookie
如果已经在浏览器登录过目标网站,可以直接导出浏览器中的Cookie,让requests请求携带这些Cookie:
- 操作步骤:
- 在浏览器中打开目标网站,按F12打开开发者工具,找到「Application」(Chrome)或「存储」(Firefox)标签,定位对应域名的Cookie。
- 将Cookie整理成字典格式,比如
cookies={"session_id": "xxx", "auth_token": "yyy"}。
- 修正后的代码示例:
import requests url = r'https://www.filedownloadserver.com?docId=7700915281958&projectNumber=aaa' # 替换成你从浏览器导出的Cookie键值对 cookies = {"your_cookie_key": "your_cookie_value"} # 使用Session保持会话,也可直接在get方法中传入cookies参数 session = requests.Session() session.cookies.update(cookies) resp = session.get(url, verify=False) # 原代码中chunk变量未定义,小文件可直接写入完整内容;大文件建议分块写入 with open('test.pdf', 'wb') as file: file.write(resp.content) # 大文件推荐写法: # for chunk in resp.iter_content(chunk_size=1024): # if chunk: # file.write(chunk)
2. 模拟网站登录流程
如果无法导出Cookie,可以模拟登录过程获取有效会话:
- 操作步骤:
- 通过浏览器开发者工具抓包,找到网站的登录接口地址及所需参数(如账号、密码、CSRF Token等)。
- 构造登录请求,携带必要参数完成登录。
- 用同一个Session对象请求下载链接,保持登录状态。
- 代码示例(需根据实际登录接口调整):
import requests session = requests.Session() # 1. 先访问登录页面,提取CSRF Token(需根据页面实际结构调整提取逻辑) login_page_url = "https://login.fileserver.com/login1/" login_resp = session.get(login_page_url, verify=False) csrf_token = login_resp.text.split('name="csrf_token" value="')[1].split('"')[0] # 2. 构造登录请求参数 login_data = { "username": "你的账号", "password": "你的密码", "csrf_token": csrf_token } login_post_url = "https://login.fileserver.com/login1/submit" session.post(login_post_url, data=login_data, verify=False) # 3. 登录成功后请求下载链接 download_url = r'https://www.filedownloadserver.com?docId=7700915281958&projectNumber=aaa' resp = session.get(download_url, verify=False) with open('test.pdf', 'wb') as file: file.write(resp.content)
3. 使用Selenium模拟浏览器行为
如果网站登录逻辑复杂(如含验证码、JS加密),可以直接调用真实浏览器,自动复用浏览器的登录状态:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 配置Chrome选项,可开启无头模式或复用已打开的浏览器 options = Options() # 无头模式(后台运行): # options.add_argument("--headless=new") # 复用已登录的浏览器(需先启动Chrome时添加参数:chrome.exe --remote-debugging-port=9222) # options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") driver = webdriver.Chrome(options=options) driver.get(r'https://www.filedownloadserver.com?docId=7700915281958&projectNumber=aaa') # 等待下载完成,根据文件大小调整等待时间 time.sleep(5) driver.quit()
内容的提问来源于stack exchange,提问作者ReverseEngineer
相关产品推荐
相关产品推荐

