Playwright结合tqdm实现下载进度条时的超时与进度显示异常问题求助
Playwright结合tqdm实现下载进度条时的超时与进度显示异常问题求助
嘿,我来帮你拆解下这两个问题的根源,然后给出具体的修复方案:
问题根源分析
- 超时问题:你现在的代码做了两次重复下载——一边用
requests.get()手动请求下载URL保存文件,另一边又调用download.save_as()让Playwright去完成下载。这就导致download.save_as()一直在等待Playwright原生的下载流程完成,但你已经通过requests把文件下完了,Playwright的下载进程可能因为资源占用或链接问题卡住,最终触发默认30秒超时。 - 进度条显示异常:你通过
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
相关产品推荐
相关产品推荐

