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

Playwright结合tqdm实现下载进度条时的超时与进度显示异常问题求助

Playwright结合tqdm实现下载进度条时的超时与进度显示异常问题求助

嘿,我来帮你拆解下这两个问题的根源,然后给出具体的修复方案:

问题根源分析

  1. 超时问题:你现在的代码做了两次重复下载——一边用requests.get()手动请求下载URL保存文件,另一边又调用download.save_as()让Playwright去完成下载。这就导致download.save_as()一直在等待Playwright原生的下载流程完成,但你已经通过requests把文件下完了,Playwright的下载进程可能因为资源占用或链接问题卡住,最终触发默认30秒超时。
  2. 进度条显示异常:你通过requests获取的Content-Length可能不是实际视频文件的大小——很多网站的下载链接是临时跳转的短链接,返回的Content-Length只是跳转页面的大小,不是目标视频的真实大小,所以tqdm直接把进度拉到100%,但实际Playwright那边的真实下载还在进行。

修复方案:用Playwright原生事件实现进度条

我们可以直接利用Playwright Download对象自带的进度监听事件,配合tqdm实现准确的进度条,同时去掉重复下载的逻辑,彻底解决超时问题。

修改后的完整代码如下:

from playwright.sync_api import sync_playwright
import func
import os
from tqdm.auto import tqdm

def download(page):
    with page.expect_download() as download_info:
        # 补全选择器的闭合引号,避免点击失败
        page.click("text=720p (MP4)")
    download = download_info.value
    
    # 获取文件总大小,初始化进度条
    total_bytes = download.total_bytes
    downloaded_bytes = 0
    with tqdm(total=total_bytes, desc="视频下载中") as pbar:
        # 定义进度更新回调函数
        def update_progress(current_downloaded):
            nonlocal downloaded_bytes
            # 计算本次进度增量并更新进度条
            delta = current_downloaded - downloaded_bytes
            pbar.update(delta)
            downloaded_bytes = current_downloaded
        
        # 绑定下载进度事件
        download.on("progress", update_progress)
        
        # 等待下载完成并保存文件,这一步会阻塞到下载结束
        download.save_as(os.path.join(func.report_folder_path, download.suggested_filename))

# 初始化导航
with sync_playwright() as p:
    browser = p.chromium.launch(channel="msedge", headless=False)
    context = browser.new_context(accept_downloads=True)
    page = context.new_page()

    print("进入下载页面")
    page.goto('https://www.jw.org/en/library/videos/#en/mediaitems/StudioFeatured/docid-702023003_1_VIDEO')
    page.wait_for_selector("text=Download")
    page.locator("text=Download").first.click()
    
    # 传入page对象到download函数
    download(page)
    
    # 不需要额外sleep,因为download函数已经等待下载完成
    print('下载完成!')

关键修改点说明

  • 去掉了requests和shutil的重复下载逻辑,完全依赖Playwright原生下载流程,避免了冲突和超时。
  • 利用download.total_bytes获取真实的文件总大小,通过download.on("progress", ...)监听实时下载字节数,让tqdm的进度条完全匹配真实下载状态。
  • 修复了选择器的引号缺失问题,避免点击失败;移除了不必要的time.sleep(3),因为download.save_as()会自动等待下载完成。

这样修改后,进度条会准确显示下载进度,而且不会再出现超时问题啦~

备注:内容来源于stack exchange,提问作者Daniel Cunha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:47:35