Python脚本遍历网站下拉菜单并批量下载数据的实现咨询
自动化下载Namma Yatri出行趋势数据的解决方案
你的需求涉及动态JavaScript渲染的页面交互(下拉菜单展开、选区切换后内容更新),静态HTTP请求工具(如requests)无法完成这类操作,必须使用浏览器自动化工具。以下是具体实现指引:
工具选择
推荐两种主流工具,按需选择:
- Selenium:最普及的浏览器自动化库,支持多浏览器,社区资源丰富,适合入门
- Playwright:微软推出的新一代工具,API更简洁,内置自动等待机制,处理动态页面更省心
核心实现步骤(以Selenium为例)
安装依赖
执行以下命令安装所需库:pip install selenium webdriver-managerwebdriver-manager会自动管理浏览器驱动,无需手动下载配置。核心代码逻辑
- 初始化浏览器实例(可选无头模式,即不显示浏览器窗口)
- 打开目标页面,等待页面加载完成
- 定位并点击“出行趋势”下拉菜单,展开选区列表
- 获取所有选区选项
- 遍历每个选区:
- 点击切换选区
- 等待页面更新(确保新的下载按钮加载完成)
- 找到并点击两个“Download Data”按钮
- 重新打开下拉菜单,准备切换下一个选区
代码示例
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 time # 初始化Chrome浏览器 driver = webdriver.Chrome(ChromeDriverManager().install()) driver.maximize_window() # 打开目标页面 driver.get("https://nammayatri.in/open/") try: # 等待并定位出行趋势的下拉菜单(需根据页面实际元素调整选择器) dropdown_trigger = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//div[contains(text(), '出行趋势')]/following-sibling::div")) ) dropdown_trigger.click() # 获取所有选区选项 ward_options = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".dropdown-menu .menu-item")) ) # 过滤掉空文本选项 valid_wards = [(opt.text.strip(), opt) for opt in ward_options if opt.text.strip()] # 遍历每个选区 for ward_name, ward_element in valid_wards: print(f"正在处理选区:{ward_name}") # 点击切换选区 ward_element.click() # 等待页面更新,直到下载按钮加载完成 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, "//button[contains(text(), 'Download Data')]")) ) # 获取并点击两个下载按钮 download_buttons = driver.find_elements(By.XPATH, "//button[contains(text(), 'Download Data')]") for btn in download_buttons[:2]: btn.click() time.sleep(2) # 等待下载请求触发,可根据网络情况调整 # 重新打开下拉菜单 dropdown_trigger.click() time.sleep(1) finally: # 关闭浏览器 driver.quit()提示:页面元素的选择器(XPath/CSS)可能随网站更新变化,需用浏览器开发者工具(F12)实时查看元素属性,调整选择器内容。
关键注意事项
- 元素定位:用浏览器F12的“检查”功能,精准定位下拉菜单、选区选项、下载按钮的选择器
- 等待机制:优先使用
WebDriverWait显式等待,代替time.sleep(),避免因页面加载慢导致的元素找不到错误 - 下载配置:可通过浏览器选项设置默认下载路径,避免下载弹窗或文件分散
- 无头模式:若不需要显示浏览器窗口,初始化时添加无头参数:
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)
参考学习方向
- Selenium官方文档:系统学习元素定位、等待机制、浏览器操作等核心API
- Playwright官方文档:了解更简洁的自动化语法,内置自动等待和网络拦截功能
- 动态网页爬取基础:理解JS渲染页面的加载逻辑,区分静态与动态内容的差异
内容的提问来源于stack exchange,提问作者penguin77
相关产品推荐
相关产品推荐

