如何用Selenium或Postman实现需登录验证的文件下载脚本?
问题解决思路
1. 先明确你遇到的是HTTP Basic/Digest认证
你看到的弹窗不是JavaScript alert,是浏览器原生的HTTP身份验证窗口,这就是Selenium报错NoAlertPresentException的原因——Selenium的switch_to.alert只能处理JS生成的弹窗,管不了浏览器层面的认证框。
这种认证的核心特点:
- 无HTML登录表单,由浏览器直接弹出原生验证窗口
- 密码不会存在Cookies中,而是通过请求头的
Authorization字段传输(内容为Base64编码的用户名:密码字符串) - 登录成功后浏览器会记住凭证,后续请求自动携带
Authorization头,因此不会重复弹窗
2. 脚本下载的可行方案
方案一:用requests库直接构造认证请求
这是最简便的非浏览器模拟方案:
import requests from requests.auth import HTTPBasicAuth # 替换为你的实际信息 file_url = "https://目标域名.com/需要下载的文件路径" username = "你的用户名" password = "你的密码" # 发送带认证的请求 response = requests.get(file_url, auth=HTTPBasicAuth(username, password)) # 保存文件到本地 with open("下载文件名称.ext", "wb") as f: f.write(response.content)
如果是Digest认证,只需将HTTPBasicAuth替换为HTTPDigestAuth即可。
方案二:在URL中直接嵌入凭证
多数工具和浏览器支持这种带认证信息的URL格式:
http://用户名:密码@目标域名.com/文件路径
用Selenium实现时,直接构造该URL访问即可:
from selenium import webdriver original_url = "https://目标域名.com/文件路径" auth_url = f"https://{username}:{password}@{original_url.split('//')[1]}" driver = webdriver.Chrome() driver.get(auth_url) # 后续可执行下载相关操作
方案三:用ChromeOptions配置认证参数
适合必须依赖浏览器模拟的场景:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() # 替换为目标域名的白名单 options.add_argument('--auth-server-whitelist=*.目标域名.com') options.add_argument('--auth-negotiate-delegate-whitelist=*.目标域名.com') options.add_argument(f'--user={username}') options.add_argument(f'--password={password}') driver = webdriver.Chrome(options=options) driver.get(original_url)
3. 页面源码为空的原因
未完成认证时,服务器返回的是401未授权状态对应的空HTML响应;只有认证通过后,服务器才会返回实际页面内容,因此你之前查看的Source为空——完成认证后再刷新页面就能看到正常源码。
内容的提问来源于stack exchange,提问作者Peter Mølgaard Pallesen
相关产品推荐
相关产品推荐

