如何通过Python Selenium下载网页‘Design Review’标题下的PDF文件
用Python Selenium下载指定标题下的PDF文档
核心思路
先定位页面中任意位置的Design Review标题,再找到该标题节点下的所有PDF下载链接,最后处理下载(推荐结合requests直接下载,避免Selenium的下载弹窗问题)。
步骤与代码实现
配置依赖环境
先安装所需库:pip install selenium webdriver-manager requests核心代码
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 from webdriver_manager.chrome import ChromeDriverManager import requests import os # 初始化Chrome浏览器 driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://platform.sustain-cert.com/public-project/2756") try: # 等待页面加载,定位任意位置的Design Review标题 review_title = WebDriverWait(driver, 20).until( EC.presence_of_element_located( (By.XPATH, "//*[normalize-space(text())='Design Review']") ) ) # 抓取标题下方的所有PDF链接(适配不同页面结构) # 这里用XPath从标题节点往后查找,确保只取该标题下的内容 pdf_links = review_title.find_elements( By.XPATH, "./following::a[contains(@href, '.pdf')][1]/ancestor::div[contains(@class, 'section')]//a[contains(@href, '.pdf')]" ) # 创建保存目录 save_dir = "Design_Review_PDFs" os.makedirs(save_dir, exist_ok=True) # 批量下载PDF for idx, link in enumerate(pdf_links, 1): pdf_url = link.get_attribute("href") if not pdf_url or not pdf_url.endswith(".pdf"): continue # 用requests下载,绕过Selenium下载弹窗 response = requests.get(pdf_url, headers={"User-Agent": "Mozilla/5.0"}, stream=True) filename = os.path.join(save_dir, f"design_review_{idx}.pdf" if not pdf_url.split("/")[-1].endswith(".pdf") else pdf_url.split("/")[-1]) with open(filename, "wb") as f: f.write(response.content) print(f"已完成下载: {filename}") finally: # 关闭浏览器 driver.quit()
关键调整点
- 标题定位:如果页面中
Design Review标题有固定标签(比如h2),可把XPath改成//h2[normalize-space(text())='Design Review'],提升定位精度 - 链接筛选:若页面PDF链接的class或属性有特征,可修改XPath中的条件(比如
//a[@class='pdf-link']),避免抓取无关链接 - 反爬处理:如果网站限制请求,可给
requests添加更多请求头,或者改用Selenium直接点击链接下载(需提前配置浏览器默认下载路径)
注意事项
- 确保ChromeDriver版本与本地Chrome浏览器版本一致,避免启动失败
- 页面加载较慢时,可适当延长
WebDriverWait的等待时间(当前为20秒) - 若标题下存在非PDF文件,可通过判断链接后缀
.pdf进一步过滤
内容的提问来源于stack exchange,提问作者Shankar
相关产品推荐
相关产品推荐

