返回

Playwright 批量下载 PDF 文件时的常见问题及解决方案

python

使用 Playwright 在 Python 中批量下载 PDF 文件

简介

自动化任务是提高工作效率和节省时间的有效方法。使用 Playwright 等现代化自动化框架,我们可以轻松地自动化各种任务,例如从网站下载 PDF 文件。

问题:无法下载多个 PDF 文件

我最近尝试使用 Playwright 在 Python 中从以下网站下载 19 个 PDF 文件:https://www4.trf5.jus.br/diarioeletinternet/paginas/consultas/consultaDiario.faces。然而,脚本仅下载了 1 个 PDF 文件,然后就停止了。

故障排除和解决方案

经过一番调查,我发现问题出在我没有正确等待所有 PDF 链接加载。在修改后的脚本中,我使用 wait_for_load_state("networkidle") 方法等待网络空闲状态,确保所有 PDF 链接都已加载完毕。

以下是修改后的脚本:

from playwright.sync_api import sync_playwright, Playwright

with sync_playwright() as p:
    nav = p.chromium.launch(headless=False)

    page = nav.new_page(accept_downloads=True)
    
    page.goto(
        'https://www4.trf5.jus.br/diarioeletinternet/paginas/consultas/consultaDiario.faces;jsessionid=A7EF0E11BE9943A9942B54CE45F7C7F9'
    )

    page.locator("[name='frmVisao:orgao']").select_option('SeçãoJudiciária do Sergipe')
    page.locator("[name='frmVisao:edicao']").select_option('Administrativo')
    page.locator("[name='frmVisao:periodo']").select_option('2021')
    page.wait_for_function("""
        document
          .querySelectorAll('[id="frmVisao:meses"] option')
          .length > 11
    """)
    page.locator('xpath=//*[@id="frmVisao:meses"]').select_option('03')
    page.locator('xpath=//*[@id="frmVisao:j_id48"]').click()
    page.locator('xpath=//*[@id="frmPesquisa:quantidadeRegistros"]').select_option('50')

    # 等待所有 PDF 链接加载
    page.wait_for_load_state("networkidle")

    rows = page.query_selector_all(".rich-table tbody tr td:nth-child(4)")

    for row in rows:
        with page.expect_download() as download_info:
            row.click()
        
        download = download_info.value
        download.save_as(download.suggested_filename)
    
    page.close()
    nav.close()

结论

通过添加 wait_for_load_state("networkidle") 方法,我们能够成功地从目标网站下载所有 19 个 PDF 文件。这一解决方案突出了正确处理页面加载状态在 Web 自动化任务中的重要性。

常见问题解答

1. 为什么需要等待网络空闲状态?
等待网络空闲状态可以确保在尝试与 PDF 链接交互之前,所有 PDF 链接都已加载到页面中。

2. 如果我不想等待网络空闲状态怎么办?
如果您确定所有 PDF 链接已加载到页面中,则可以省略 wait_for_load_state("networkidle") 方法。但是,这样做可能会导致不稳定的行为。

3. 如何在不同的网站上使用此脚本?
该脚本依赖于特定网站的 DOM 结构。对于不同的网站,您可能需要调整 PDF 链接的定位器。

4. 如何处理 JavaScript 生成的 PDF 链接?
如果您尝试下载的 PDF 链接是由 JavaScript 生成的,您可能需要使用 page.wait_for_function() 方法来等待链接出现。

5. 如何将下载的 PDF 文件保存到自定义目录中?
您可以使用 download.save_as() 方法指定自定义目录来保存下载的 PDF 文件。