如何使用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
相关产品推荐
相关产品推荐

