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

