如何使用Selenium抓取Java渲染页面中的PDF文件?
解决PDF链接抓取问题的修正方案
原代码问题分析
- 第一段代码使用
driver.find_element()(单数方法),仅能返回单个元素,无法遍历;且固定time.sleep()的等待方式不可靠,可能元素还未加载完成就执行后续操作 - 第二段代码存在语法错误:
driver.find_element_by()是旧版Selenium API,新版应使用driver.find_element(),且参数传递格式不正确
修正后的代码方案
方案1:通过部分链接文本匹配+显式等待
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import requests # 初始化浏览器驱动 driver = webdriver.Chrome() website_url = "https://hpvchemicals.oecd.org/UI/SIDS_Details.aspx?id=1034897e-e7bb-4603-900a-9f3208a8354b" driver.get(website_url) # 显式等待元素加载,最长等待10秒 wait = WebDriverWait(driver, 10) # 匹配所有含目标文本的链接(用PARTIAL_LINK_TEXT避免完全匹配的限制) elements = wait.until(EC.presence_of_all_elements_located((By.PARTIAL_LINK_TEXT, "OECD Agreed Conclusions"))) # 提取有效PDF链接 pdf_links = [elem.get_attribute('href') for elem in elements if ".pdf" in elem.get_attribute('href')] # 批量下载PDF for idx, link in enumerate(pdf_links): response = requests.get(link) with open(f"OECD_Conclusions_{idx+1}.pdf", "wb") as f: f.write(response.content) print(f"已完成第{idx+1}个PDF下载") driver.quit()
方案2:直接通过XPath匹配所有PDF链接
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import requests driver = webdriver.Chrome() website_url = "https://hpvchemicals.oecd.org/UI/SIDS_Details.aspx?id=1034897e-e7bb-4603-900a-9f3208a8354b" driver.get(website_url) wait = WebDriverWait(driver, 10) # 匹配所有href属性包含.pdf的a标签 pdf_elements = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//a[contains(@href, ".pdf")]'))) pdf_links = [elem.get_attribute('href') for elem in pdf_elements] # 批量下载PDF for idx, link in enumerate(pdf_links): response = requests.get(link) with open(f"PDF_{idx+1}.pdf", "wb") as f: f.write(response.content) print(f"已完成第{idx+1}个PDF下载") driver.quit()
关键修正点
- 用显式等待替代固定
sleep(),确保元素加载完成后再执行操作,比固定等待更稳定 - 使用
find_elements()(复数方法)替代find_element(),获取所有符合条件的元素 - 修正API调用和XPath写法,适配新版Selenium语法
- 新增PDF下载逻辑,直接通过
requests库保存文件
内容的提问来源于stack exchange,提问作者Raha
相关产品推荐
相关产品推荐

