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
相关产品推荐
相关产品推荐

