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

Selenium下载文件遇401未授权错误,网站更名后原脚本失效求助

问题描述

此前每日自动运行的Selenium脚本,因目标网站更名后无法正常执行。原代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from datetime import date, datetime
import pandas as pd
import time
import os

website = "https://bourse.boursobank.com/bourse/opcvm/cours/0P0000RRUT/"

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()), options=options
)
driver.minimize_window()
driver.implicitly_wait(20)
driver.get(website)

refuse_cookies_button = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="didomi-notice-agree-button"]'))
)
refuse_cookies_button.click()
download_button = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable(
        (
            By.XPATH,
            '//*[@class="c-quote-chart__menu-button-icon c-icon c-icon--download"]',
        )
    )
)
download_button.click()
time.sleep(5)
driver.quit()

预期结果:下载名为AMUNDIFDSSBIFMINDIAEQAEURC_yyyy-mm-dd.txt的文本文件。

实际情况:点击下载按钮后,请求返回401错误,提示:

Msg : 401 V Not Authorized

手动将下载链接复制到已打开的网站窗口中可正常下载,推测需在driver.get(website)前添加认证配置,已尝试同意Cookie但无效,寻求解决方案。


解决方案

1. 复用已认证的浏览器会话

Selenium默认启动全新浏览器实例,没有手动访问时的认证会话。可以通过远程调试端口复用已打开的Chrome进程:

  • 手动打开Chrome并访问目标网站完成认证,然后用命令重启Chrome开启调试:
    chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\ChromeProfile"
    
  • 修改Selenium代码连接到该调试端口:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    import time
    
    options = Options()
    options.add_experimental_option("excludeSwitches", ["enable-logging"])
    options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    
    driver = webdriver.Chrome(options=options)
    driver.get("https://bourse.boursobank.com/bourse/opcvm/cours/0P0000RRUT/")
    
    refuse_cookies_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="didomi-notice-agree-button"]'))
    )
    refuse_cookies_button.click()
    download_button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable(
            (By.XPATH, '//*[@class="c-quote-chart__menu-button-icon c-icon c-icon--download"]')
        )
    )
    download_button.click()
    time.sleep(5)
    driver.quit()
    

2. 导入手动捕获的认证Cookie

如果网站依赖特定Cookie做身份校验,可手动导出后在Selenium中添加:

  • 手动登录网站,打开浏览器开发者工具(F12),在Application -> Cookies下找到目标域名的认证Cookie(如session_id、auth_token类字段)
  • 在代码中添加Cookie后再访问目标页面:
    # 初始化driver后先访问网站根域名,确保Cookie域匹配
    driver.get("https://bourse.boursobank.com/")
    
    # 添加捕获到的认证Cookie
    driver.add_cookie({
        'name': '你的认证Cookie名称',
        'value': '你的认证Cookie值',
        'domain': 'boursobank.com',
        'path': '/'
    })
    
    driver.refresh()
    driver.get("https://bourse.boursobank.com/bourse/opcvm/cours/0P0000RRUT/")
    
    # 后续下载操作不变...
    

3. 模拟完整登录流程

若上述方法不可行,直接在Selenium中模拟用户登录步骤:

  • 定位页面登录按钮并点击进入登录页
  • 找到用户名、密码输入框,输入账号信息
  • 点击登录按钮,等待登录完成后执行下载操作

4. 用requests直接请求API(绕过浏览器)

利用Selenium获取页面会话Cookie,再用requests库直接请求下载链接:

import requests
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from datetime import datetime

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options)
driver.get("https://bourse.boursobank.com/bourse/opcvm/cours/0P0000RRUT/")

# 同意Cookie
refuse_cookies_button = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="didomi-notice-agree-button"]'))
)
refuse_cookies_button.click()

# 获取当前页面所有Cookie,转为字典格式
cookies = {c['name']: c['value'] for c in driver.get_cookies()}

# 捕获下载链接(可通过点击按钮后在网络日志中提取,或直接从页面元素获取)
download_url = "https://api.boursobank.com/services/api/files/download.phtml?token=..."

# 发起请求下载文件
response = requests.get(download_url, cookies=cookies)
if response.status_code == 200:
    filename = f"AMUNDIFDSSBIFMINDIAEQAEURC_{datetime.now().strftime('%Y-%m-%d')}.txt"
    with open(filename, 'wb') as f:
        f.write(response.content)
else:
    print(f"下载失败,状态码: {response.status_code}")

driver.quit()

内容的提问来源于stack exchange,提问作者aegn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:04:51