You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python requests下载URL文件遇登录跳转,求解决方案

解决方法

你的问题核心是服务器要求请求携带已登录的会话凭证,浏览器能正常下载是因为保存了登录后的Cookie,而直接用requests发起的请求没有携带这些凭证,所以被重定向到登录页(返回的JS就是做跳转用的)。以下是几种可行的解决方式:

1. 复用浏览器的登录Cookie

如果已经在浏览器登录过目标网站,可以直接导出浏览器中的Cookie,让requests请求携带这些Cookie:

  • 操作步骤:
    1. 在浏览器中打开目标网站,按F12打开开发者工具,找到「Application」(Chrome)或「存储」(Firefox)标签,定位对应域名的Cookie。
    2. 将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,可以模拟登录过程获取有效会话:

  • 操作步骤:
    1. 通过浏览器开发者工具抓包,找到网站的登录接口地址及所需参数(如账号、密码、CSRF Token等)。
    2. 构造登录请求,携带必要参数完成登录。
    3. 用同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:07:48