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

Selenium Chrome WebDriver下载网站相对链接PDF的技术求助

解决方案

方法1:利用浏览器会话Cookie + requests库下载

直接访问PDF URL返回404,核心原因是服务器验证了请求的会话状态(比如Cookie)或来源页面(Referer)。Selenium已经维持了网站的有效会话,所以可以提取当前会话的Cookie,搭配requests库发起请求,绕开直接访问的限制。

步骤:

  • 先通过Selenium打开网站,确保处于已登录/有效会话状态(如果网站需要登录,先完成登录流程)。
  • 遍历CSV里的相对链接,拼接成完整URL。
  • 从Selenium的driver中提取Cookie,转换成requests兼容的格式。
  • 用requests发送GET请求,带上Cookie和Referer头,保存文件到本地。

示例代码:

import csv
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from urllib.parse import unquote
import os

# 创建下载目录
download_dir = "./pdf_downloads"
os.makedirs(download_dir, exist_ok=True)

# 初始化Chrome,保持会话
chrome_options = Options()
# 可选:开启无头模式(不显示浏览器窗口)
# chrome_options.add_argument("--headless=new")
driver = webdriver.Chrome(options=chrome_options)

# 先访问网站主页面,建立有效会话
driver.get("https://engage.goenumerate.com/s/bpha/")

# 读取CSV中的文件链接
with open("file_list.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    next(reader)  # 跳过表头(如果CSV有表头的话)
    for idx, row in enumerate(reader):
        relative_link = row[0].strip()
        full_url = f"https://engage.goenumerate.com{relative_link}"
        
        # 提取当前会话的Cookie
        cookies = {c['name']: c['value'] for c in driver.get_cookies()}
        
        # 构造请求头,模拟从网站内跳转的请求
        headers = {
            "Referer": "https://engage.goenumerate.com/s/bpha/"
        }
        
        # 发起请求并保存文件
        try:
            response = requests.get(full_url, cookies=cookies, headers=headers, stream=True)
            response.raise_for_status()
            
            # 解析文件名(处理URL编码)
            filename = unquote(full_url.split("/")[-1])
            # 避免文件名重复,可添加索引前缀
            # filename = f"{idx}_{filename}"
            
            save_path = os.path.join(download_dir, filename)
            with open(save_path, "wb") as file:
                for chunk in response.iter_content(chunk_size=1024*8):
                    file.write(chunk)
            print(f"✅ 成功保存:{filename}")
        except Exception as e:
            print(f"❌ 下载失败 {full_url}:{str(e)}")

# 关闭浏览器
driver.quit()

方法2:修改Chrome偏好,强制PDF直接下载

如果网站没有强制PDF预览,可以通过配置Chrome的下载偏好,让点击链接时直接下载文件,而非在新标签页打开。

示例代码:

import csv
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

download_dir = "./pdf_downloads"
os.makedirs(download_dir, exist_ok=True)

# 配置Chrome下载偏好
chrome_options = Options()
chrome_prefs = {
    "download.default_directory": os.path.abspath(download_dir),
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True,  # 强制下载PDF,不打开预览
    "profile.default_content_settings.popups": 0
}
chrome_options.add_experimental_option("prefs", chrome_prefs)

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://engage.goenumerate.com/s/bpha/")

# 读取CSV并处理链接
with open("file_list.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    next(reader)
    for row in reader:
        relative_link = row[0].strip()
        # 根据页面结构定位链接元素,这里用xpath示例,实际要根据页面调整
        try:
            link = driver.find_element("xpath", f"//a[@href='{relative_link}']")
            # 点击链接,Chrome会自动下载到指定目录
            link.click()
            # 等待文件下载完成,根据文件大小调整时间
            time.sleep(3)
            print(f"✅ 触发下载:{relative_link}")
        except Exception as e:
            print(f"❌ 找不到链接 {relative_link}:{str(e)}")

driver.quit()

关键注意点

  • 若网站需要登录,必须在初始化浏览器后先完成登录操作,确保会话有效。
  • 方法1中的Referer头要设置为链接所在的页面,模拟用户正常点击的请求来源。
  • 批量下载时建议添加异常捕获,避免单个文件失败导致整个脚本中断。
  • 方法2中如果链接是target="_blank",可以直接用driver.get(full_url)替代点击,避免打开多余标签页。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:49:49