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

如何使用Playwright从网站下载同className的多个Excel文件

批量下载Excel文件的解决方案

实现思路

先定位页面上所有带有doc-link download-file类名的下载按钮,逐个触发点击操作,针对每个下载请求单独处理文件保存逻辑,完成批量下载。

修改后的完整代码

import re
import asyncio
import requests
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False, slow_mo=50)
        page = await browser.new_page()

        web = "https://www.mca.gov.in/content/mca/global/en/data-and-reports/company-llp-info/incorporated-closed-month.html"
        await page.goto(web)

        # 展开内容区域
        await page.click('[class="expand-desk"]')
        # 等待所有下载按钮加载完成
        await page.wait_for_selector('[class="doc-link download-file"]')
        # 获取页面上所有下载按钮元素
        download_buttons = await page.query_selector_all('[class="doc-link download-file"]')

        print(f"找到 {len(download_buttons)} 个可下载文件")

        # 遍历每个按钮执行下载操作
        for index, button in enumerate(download_buttons):
            print(f"开始下载第 {index+1} 个文件...")
            # 监听当前按钮触发的下载事件
            async with page.expect_download() as download_info:
                await button.click()
            download = await download_info.value

            # 提取下载链接
            download_str = str(download)
            url_match = re.search(r"(?P<url>https?://[^\s']+)", download_str)
            if not url_match:
                print(f"第 {index+1} 个文件链接提取失败,跳过")
                continue
            new_url = url_match.group("url")
            print(f"第 {index+1} 个文件链接: {new_url}")

            # 生成文件名并保存文件
            filename = new_url.rsplit('=', 1)[1] + ".xlsx"
            try:
                r = requests.get(new_url, allow_redirects=True)
                with open(filename, 'wb') as f:
                    f.write(r.content)
                print(f"第 {index+1} 个文件 {filename} 保存成功")
            except Exception as e:
                print(f"第 {index+1} 个文件下载失败: {str(e)}")

        await page.screenshot(path="report_final.png")
        await browser.close()

asyncio.run(main())

关键修改说明

  • 批量获取元素:用query_selector_all替代单个元素选择,一次性获取所有下载按钮。
  • 循环处理下载:遍历每个按钮触发下载,确保每个文件的下载事件独立监听和处理。
  • 异常容错:增加链接提取、文件保存的异常捕获,避免单个文件下载失败导致程序中断。
  • 等待元素加载:添加wait_for_selector确保页面所有下载按钮加载完成后再执行遍历,防止遗漏元素。

内容的提问来源于stack exchange,提问作者NIRANJAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:06:22