如何使用Selenium/Python下载Chrome中无直接链接的预览PDF文件
如何使用Selenium/Python下载Chrome中无直接链接的预览PDF文件
我太懂你现在的头疼了——一步步用Selenium操作到PDF预览窗口,结果发现既没有可点击的下载链接,也找不到明显的下载按钮,完全卡在这里了。别慌,咱们结合你的场景来解决这个问题,这里有几个实用的办法:
方法一:提前配置Chrome,让PDF直接下载而非预览
这是最省心的思路,从根源上跳过预览窗口,让浏览器直接把PDF存到你指定的文件夹。你只需要在初始化ChromeDriver的时候加几个配置选项:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import ChromeService # 配置Chrome下载偏好 chrome_options = Options() chrome_options.add_experimental_option("prefs", { "download.default_directory": "你的本地下载路径", # 替换成你想存PDF的文件夹,比如"C:/ZetaGas_PDFs" "plugins.always_open_pdf_externally": True, # 强制PDF直接下载,不打开预览 "download.prompt_for_download": False, # 不弹出下载确认框 "download.directory_upgrade": True }) # 初始化带配置的ChromeDriver driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=chrome_options)
这样改完之后,你点击「MAYOREO」按钮时,浏览器会直接把PDF下载到你指定的目录,不用再处理烦人的预览窗口了。记得把路径换成你自己的本地文件夹哦。
方法二:在PDF预览窗口里触发下载
如果没法提前配置浏览器,咱们就直接对预览窗口下手。Chrome的内嵌PDF预览其实有隐藏的下载按钮,或者可以用JavaScript强制触发下载动作。结合你的代码,修改accion_despues_presionar函数就行:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def accion_despues_presionar(elemento): time.sleep(1) mayoreo=driver.find_element(By.XPATH,'//*[@id="printFormato2"]') time.sleep(1) mayoreo.click() time.sleep(2) # 给预览窗口留足加载时间 # 先试试定位Chrome预览的下载按钮 try: # Chrome预览的下载按钮一般有aria-label="下载"这个属性 download_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[aria-label="下载"]')) ) download_btn.click() except: # 如果按钮定位不到,用JavaScript触发下载 driver.execute_script("document.querySelector('embed').contentWindow.print();") # 或者另一种JS写法:直接打开PDF的源地址 # driver.execute_script("window.open(document.querySelector('embed').src);") time.sleep(2) # 等下载完成再关闭窗口 cerrar=driver.find_element(By.XPATH,'//*[@id="modalPdfPrint"]/div/div/div[1]/button') cerrar.click()
注意:如果PDF是在iframe里加载的,得先切换到iframe再操作:
# 切换到PDF所在的iframe pdf_iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, 'iframe')) ) driver.switch_to.frame(pdf_iframe) # 在这里执行上面的下载操作(按钮定位或JS脚本) # 操作完切回主页面 driver.switch_to.default_content()
方法三:抓包获取PDF真实地址(更高效)
有时候预览窗口里的PDF其实是有真实URL的,只是没显示在页面上。你可以打开Chrome开发者工具(F12),切换到「网络」标签,点击「MAYOREO」按钮后,找类型为「document」或「pdf」的请求,就能拿到PDF的真实链接。之后用Python的requests库直接下载,比Selenium操作更稳定:
import requests # 把抓包拿到的PDF地址填这里 pdf_url = "http://extranet.zetagas.pe/xxx/xxx.pdf" # 带上登录后的Cookie,不然可能没权限访问 cookies = driver.get_cookies() session = requests.Session() for cookie in cookies: session.cookies.set(cookie['name'], cookie['value']) # 下载保存PDF response = session.get(pdf_url) with open("zetagas_devolucion.pdf", "wb") as f: f.write(response.content)
你可以先试方法一,这是最直接的解决方案。如果不行再试方法二或三,应该能搞定你的问题~
备注:内容来源于stack exchange,提问作者Juan Jose Collantes Antezana
相关产品推荐
相关产品推荐

