如何使用Selenium自动保存搜索结果中Integral列的PDF文件?
自动保存Selenium搜索结果中“Integral”列的所有PDF文件
当然可以实现自动保存“Integral”列下的所有PDF文件!我给你调整并扩展了代码,解决页面加载等待、PDF自动下载的问题,一步步来:
关键要点说明
- 处理页面加载等待:直接定位元素容易遇到“元素未找到”的报错,所以用
WebDriverWait等待元素就绪,避免超时问题。 - 配置Firefox自动下载PDF:默认Firefox会打开PDF预览,我们修改浏览器配置,让它直接下载到指定文件夹,不用手动确认弹窗。
- 稳定下载PDF:用
requests库直接下载PDF链接,比单纯点击浏览器链接更可靠,能避免跳转或预览设置的坑。
完整代码实现
from selenium import webdriver from selenium.webdriver.firefox.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 requests import os # 配置Firefox自动下载PDF firefox_options = Options() # 替换成你想保存PDF的本地文件夹路径 download_dir = "/path/to/your/pdf/folder" # 如果文件夹不存在,自动创建 os.makedirs(download_dir, exist_ok=True) # 修改Firefox配置,禁用PDF预览、自动下载 firefox_options.set_preference("browser.download.folderList", 2) firefox_options.set_preference("browser.download.dir", download_dir) firefox_options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") firefox_options.set_preference("pdfjs.disabled", True) # 初始化浏览器(保留你原来的Firefox路径配置) binary = webdriver.FirefoxBinary('/usr/lib/firefox/firefox') driver = webdriver.Firefox(firefox_binary=binary, options=firefox_options) try: # 打开目标网站 driver.get('http://www.stf.jus.br/portal/diariojusticaeletronico/pesquisardiarioeletronico.asp#') # 等待搜索框加载完成后输入关键词"PPP" search_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'argumento')) ) search_box.send_keys('PPP') # 等待搜索按钮可点击后执行搜索 search_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '/html/body/div/div[3]/div[2]/div[2]/div[2]/form/table/tbody/tr[3]/td/input[1]')) ) search_btn.click() # 等待搜索结果表格加载,定位"Integral"列下的所有PDF链接 # 这里的XPath可能需要根据页面实际结构微调,比如如果Integral是第5列,可改成//table//tr/td[5]/a integral_links = WebDriverWait(driver, 15).until( EC.presence_of_all_elements_located((By.XPATH, '//td[contains(text(), "Integral")]/following-sibling::td/a')) ) # 遍历所有链接,下载PDF文件 for idx, link in enumerate(integral_links): pdf_url = link.get_attribute('href') # 确认是PDF链接后再下载 if pdf_url and pdf_url.endswith('.pdf'): response = requests.get(pdf_url, stream=True) # 生成不重复的文件名 pdf_filename = f"integral_result_{idx+1}.pdf" save_path = os.path.join(download_dir, pdf_filename) with open(save_path, 'wb') as pdf_file: for chunk in response.iter_content(chunk_size=8192): pdf_file.write(chunk) print(f"已成功下载: {pdf_filename}") finally: # 无论成功失败,最后都关闭浏览器 driver.quit()
注意事项
- 记得把
download_dir替换成你本地的文件夹路径,比如"/home/yourname/pdf_downloads"。 - 如果页面中“Integral”列的结构和我假设的不一样,你可以右键浏览器检查元素,找到该列对应的
<a>标签,调整integral_links的XPath表达式。 - 运行代码前要确保已经安装了
selenium和requests库,没装的话可以用pip install selenium requests安装。
内容的提问来源于stack exchange,提问作者Reinaldo Chaves
相关产品推荐
相关产品推荐

