Playwright 批量下载 PDF 文件时的常见问题及解决方案
2024-03-12 11:54:20
使用 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 文件。