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

如何使用Selenium自动下载页面内每日更新的单篇文章PDF?

解决Selenium批量下载秘鲁官方日报PDF的问题

你的思路方向是对的,但现有代码存在几个实用层面的问题,比如过时API、未配置自动下载规则、未处理元素失效场景,下面是改进后的完整方案:

1. 替换过时的元素定位API

Selenium 4及以上版本已经弃用了find_elements_by_link_text这类旧写法,需要改用find_elements(By.LINK_TEXT, 文本)的标准语法,因此要先导入By类。

2. 配置Chrome自动下载PDF

默认Chrome会弹出PDF预览窗口,需要通过浏览器参数配置,让它直接将PDF保存到指定路径,无需手动确认:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 配置Chrome下载参数
chrome_options = Options()
download_path = "你的本地下载路径"  # 替换成你想保存PDF的文件夹路径
chrome_options.add_experimental_option("prefs", {
    "download.default_directory": download_path,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True  # 跳过预览,直接下载PDF
})

# 初始化浏览器
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://diariooficial.elperuano.pe/Normas")

3. 处理循环中的元素失效问题

如果直接循环初始获取的元素列表,点击后可能因为页面局部刷新导致元素状态变为stale(失效),因此改用循环索引+重新获取元素的方式:

# 先获取当前页面的下载链接总数
wait = WebDriverWait(driver, 10)
download_links = wait.until(EC.presence_of_all_elements_located((By.LINK_TEXT, "Descarga individual")))
total_links = len(download_links)

for i in range(total_links):
    # 每次循环重新定位元素,避免失效异常
    current_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Descarga individual")))
    current_link.click()
    # 等待下载完成(可根据文件大小调整等待时长,或通过监控下载文件夹优化)
    time.sleep(4)

4. 收尾:关闭浏览器

循环结束后记得关闭浏览器释放资源:

driver.quit()

关键注意事项

  • 确保ChromeDriver版本与本地Chrome浏览器版本完全匹配,否则会启动失败。
  • 如果页面存在分页,需要额外添加分页逻辑:判断下一页按钮是否存在,点击后重复执行下载步骤。
  • 显式等待(WebDriverWait)比固定time.sleep更稳定,能根据元素加载状态自动调整等待时长,减少不必要的等待。

内容的提问来源于stack exchange,提问作者Emanuel Ticona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:05:17