如何使用Python爬取隐藏在选择选项下的PDF文件
Python 批量下载层级选项下PDF文件的实操方案
针对你描述的「一级选项点击展开二级列表、点击文件链接弹出预览、预览页才能拿到PDF入口」的场景,新手最容易落地的是用Selenium模拟人工操作的方案,不用复杂的接口抓包,直接复刻手动操作流程即可,具体步骤和代码如下:
环境准备
先安装所需依赖:
pip install selenium requests
然后下载和你的Chrome浏览器版本匹配的chromedriver,放到Python安装根目录或者爬虫脚本同目录下即可。
实现逻辑
完全复刻手动下载的操作流程,用代码自动执行:
- 打开目标网站
- 模拟点击一级选项的「选项1」,等待二级列表加载完成
- 抓取二级列表下所有文件跳转链接元素
- 循环遍历每个链接:
- 点击文件跳转链接,弹出预览窗口
- 抓取预览窗口右上角「查看PDF」按钮的PDF直链
- 请求直链保存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 import time # 初始化Chrome浏览器 driver = webdriver.Chrome() # 替换为你要爬取的目标网站地址 driver.get("https://你的目标网站地址") # 设置元素最长等待时间为10秒,避免页面没加载完报错 wait = WebDriverWait(driver, 10) try: # 1. 点击一级选项「选项1」,此处XPATH需替换为你网站实际元素的XPATH option1 = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[text()="选项1"]'))) option1.click() time.sleep(2) # 2. 抓取二级列表所有文件跳转链接元素,此处XPATH需替换为你网站实际元素的XPATH file_link_list = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//二级列表容器的XPATH//a[contains(text(),"文件跳转链接")]'))) total_count = len(file_link_list) print(f"共匹配到{total_count}个PDF文件") # 3. 循环下载所有PDF for index in range(total_count): # 每次循环重新获取元素,避免页面刷新导致元素失效报错 current_file_link = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//二级列表容器的XPATH//a[contains(text(),"文件跳转链接")]')))[index] current_file_link.click() # 抓取PDF直链 pdf_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[text()="查看PDF"]'))) pdf_download_url = pdf_btn.get_attribute("href") # 保存PDF到本地,可自定义文件名 pdf_resp = requests.get(pdf_download_url) with open(f"第{index+1}份文件.pdf", "wb") as f: f.write(pdf_resp.content) print(f"已完成:{index+1}/{total_count}") # 关闭预览弹窗,此处XPATH替换为你网站弹窗关闭按钮的XPATH,也可以模拟按ESC键关闭 close_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//弹窗关闭按钮的XPATH'))) close_btn.click() time.sleep(1) finally: # 所有操作完成后关闭浏览器 driver.quit()
注意事项
- 代码中所有的XPATH定位都需要替换为你目标网站对应元素的实际XPATH,获取方式:浏览器中右键对应元素→点击「检查」→在弹出的元素面板右键对应元素代码行→「复制」→「复制XPATH」即可
- 若网站有反爬机制,可适当调大
sleep的等待时长,或者添加随机延迟,避免触发反爬规则 - 如果网站需要登录才能访问资源,可以在代码打开浏览器后先手动完成登录,再执行后续逻辑即可
- 若PDF下载需要校验身份cookie,可以直接从
driver.get_cookies()获取Selenium当前会话的cookie,传给requests的请求参数即可
内容的提问来源于stack exchange,提问作者Isaac A
相关产品推荐
相关产品推荐

