You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本遍历网站下拉菜单并批量下载数据的实现咨询

自动化下载Namma Yatri出行趋势数据的解决方案

你的需求涉及动态JavaScript渲染的页面交互(下拉菜单展开、选区切换后内容更新),静态HTTP请求工具(如requests)无法完成这类操作,必须使用浏览器自动化工具。以下是具体实现指引:

工具选择

推荐两种主流工具,按需选择:

  • Selenium:最普及的浏览器自动化库,支持多浏览器,社区资源丰富,适合入门
  • Playwright:微软推出的新一代工具,API更简洁,内置自动等待机制,处理动态页面更省心

核心实现步骤(以Selenium为例)

  1. 安装依赖
    执行以下命令安装所需库:

    pip install selenium webdriver-manager
    

    webdriver-manager会自动管理浏览器驱动,无需手动下载配置。

  2. 核心代码逻辑

    • 初始化浏览器实例(可选无头模式,即不显示浏览器窗口)
    • 打开目标页面,等待页面加载完成
    • 定位并点击“出行趋势”下拉菜单,展开选区列表
    • 获取所有选区选项
    • 遍历每个选区:
      • 点击切换选区
      • 等待页面更新(确保新的下载按钮加载完成)
      • 找到并点击两个“Download Data”按钮
      • 重新打开下拉菜单,准备切换下一个选区
  3. 代码示例

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:46:25