如何使用Selenium从指定URL批量下载多页列表中的CSV文件
Selenium批量下载分页CSV文件实现方案
原代码核心问题
- 未配置浏览器下载参数:默认会弹出下载确认窗口,且无法统一管理下载文件存储路径
- 缺少显式等待逻辑:页面元素未加载完成就执行查找/点击操作,会频繁抛出元素不存在异常
- 业务逻辑顺序颠倒:应在当前列表页完成所有文件下载触发后再执行翻页,而非提前跳转链接丢失列表上下文
- 翻页逻辑无效:原代码未正确定位页码元素,
page.click缺少执行括号,也没有处理分页加载的等待 - 硬编码页码上限不合理:固定循环100页会在总页数不足100时触发无效操作报错,没有自动终止判断
可直接运行的实现代码
import time 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 selenium.webdriver.chrome.options import Options # --------------- 配置项 --------------- # 替换为你的chromedriver实际路径 CHROMEDRIVER_PATH = 'C:\\Utility\\chromedriver.exe' # 替换为你想存储下载CSV的目标文件夹路径 DOWNLOAD_SAVE_PATH = 'C:\\Humana_CSV_Files' # 单页操作后的等待时长(秒),网络差可以适当调大 OP_WAIT_TIME = 1 # 元素加载最大等待时长(秒) ELEMENT_LOAD_TIMEOUT = 10 # -------------------------------------- # 配置Chrome自动下载参数 chrome_options = Options() download_prefs = { "download.default_directory": DOWNLOAD_SAVE_PATH, "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True } chrome_options.add_experimental_option("prefs", download_prefs) # 初始化浏览器 d = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=chrome_options) wait = WebDriverWait(d, ELEMENT_LOAD_TIMEOUT) try: d.get('https://developers.humana.com/Resource/PCTFilesList?fileType=innetwork') while True: # 等待当前页的文件列表加载完成 wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'table.table a[href$=".csv"]'))) # 获取当前页所有CSV下载链接 csv_links = d.find_elements(By.CSS_SELECTOR, 'table.table a[href$=".csv"]') print(f"当前页找到{len(csv_links)}个CSV文件,开始触发下载") # 逐个点击触发下载 for link in csv_links: link.click() time.sleep(0.2) # 短等待避免点击过快被拦截 # 定位下一页按钮 next_btn = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'li.page-item.next > a.page-link'))) # 判断下一页按钮是否为禁用状态(即已经到最后一页) next_btn_parent = next_btn.find_element(By.XPATH, './..') if 'disabled' in next_btn_parent.get_attribute('class'): print("已到达最后一页,下载任务结束") break # 点击下一页,等待页面刷新 next_btn.click() time.sleep(OP_WAIT_TIME) finally: # 预留时间等待最后一批下载请求完成,可根据文件大小调整 time.sleep(5) d.quit()
使用说明
- 首次运行前先修改代码开头配置项里的
CHROMEDRIVER_PATH和DOWNLOAD_SAVE_PATH为你本地的实际路径 - 代码会自动识别分页,到最后一页时自动退出,不需要手动指定总页数
- 如果运行中出现元素找不到的报错,可适当调大
OP_WAIT_TIME和ELEMENT_LOAD_TIMEOUT参数 - 若网站触发反爬拦截,可以在点击操作之间增加1-2秒的随机延时,降低操作频率
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

